New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

@thinkam/typeairtable

Package Overview
Dependencies
Maintainers
2
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@thinkam/typeairtable - npm Package Compare versions

Comparing version
0.0.5
to
0.1.0
+1
-1
package.json

@@ -5,3 +5,3 @@ {

"private": false,
"version": "0.0.5",
"version": "0.1.0",
"description": "Data-Mapper Airtable for TypeScript, ES7, ES6, ES5. Supports Airtable database.",

@@ -8,0 +8,0 @@ "readmeFilename": "README.md",

@@ -0,0 +0,0 @@ <div align="center">

export interface HttpClient {
get<T = any>(url: string): Promise<T>;
post<T = any, B = any>(url: string, body: B): Promise<T>;
delete(url: string, id: string): Promise<boolean>;
patch<T = any, B = any>(url: string, body: B): Promise<T>;
get<T = any, B = any>(url: string, headers?: B | { [header: string]: string | string[] }): Promise<T>;
post<T = any, B = any, C = any>(url: string, body: B, headers?: C | { [header: string]: string | string[] }): Promise<T>;
delete<T = any>(url: string, id: string, headers?: T | { [header: string]: string | string[] }): Promise<boolean>;
patch<T = any, B = any, C = any>(url: string, body: B, headers?: C | { [header: string]: string | string[] }): Promise<T>;
}

@@ -25,4 +25,7 @@ import {

): Promise<DataResult<any, E['select']>> {
const header = this.urlGenerator.getHeader();
const url = this.urlGenerator.getUrl({ ...params, take: 1 });
const rawData = await this.httpClient.get(url);
const rawData = await this.httpClient.get(url, {
header: header
});
const data = this.convertRawData(rawData);

@@ -35,4 +38,7 @@ return data && data.length ? data[0] : null;

): Promise<DataResult<any, E['select']>[]> {
const header = this.urlGenerator.getHeader();
const url = this.urlGenerator.getUrl(params);
const rawData = await this.httpClient.get(url);
const rawData = await this.httpClient.get(url, {
header: header
});
return this.convertRawData(rawData);

@@ -44,4 +50,7 @@ }

): Promise<ConvertFieldTypeValue<any> & DefaultData> {
const header = this.urlGenerator.getHeader();
const result = await this.httpClient.post(this.urlGenerator.getUrl({}), {
fields: body,
}, {
header: header
});

@@ -56,3 +65,6 @@ return {

destroy(id: string): Promise<boolean> {
return this.httpClient.delete(this.urlGenerator.getUrl({}), id);
const header = this.urlGenerator.getHeader();
return this.httpClient.delete(this.urlGenerator.getUrl({}), id, {
header: header
});
}

@@ -64,2 +76,3 @@

): Promise<ConvertFieldTypeValue<any> & DefaultData> {
const header = this.urlGenerator.getHeader();
const result = await this.httpClient.patch(this.urlGenerator.getUrl({}), {

@@ -72,2 +85,4 @@ records: [

],
}, {
header: header
});

@@ -74,0 +89,0 @@ return {

@@ -11,2 +11,6 @@ import {

url = '';
header = {
name: 'Authorization',
value: `Bearer ${this.config.apiKey}`
};

@@ -23,3 +27,3 @@ constructor(

if (table) {
this.url = `${this.config.baseUrl}/${table.tableName}?api_key=${this.config.apiKey}`;
this.url = `${this.config.baseUrl}/${table.tableName}`;
}

@@ -35,2 +39,6 @@ }

}
getHeader() {
return `'${this.header.name}': '${this.header.value}'`;
}
}

@@ -0,0 +0,0 @@ export function deepClone(obj, hash = new WeakMap()) {

export * from './deep-clone';

@@ -6,3 +6,3 @@ import { DefaultQueryFind, UrlValidator } from '../../../domain/contracts';

dataInstance.select?.forEach((item) => {
url = `${url}&fields[]=${item}`;
url = `${url}&fields[]=${String(item)}`;
});

@@ -9,0 +9,0 @@ return url;

@@ -6,2 +6,3 @@ import { DefaultQueryFind, TableModel } from '../contracts';

getUrl(dataInstance: DefaultQueryFind): string;
getHeader(): string;
}

@@ -0,0 +0,0 @@ import { ConfigModel, DataInstanceModel } from '../domain/contracts';

import { AirTableConfig } from '../infra/services/airtable-config';
export { AirTableConfig };

@@ -14,8 +14,8 @@ import { HttpClient } from '../../../src/data/protocols/http/http-client';

const httpClientMock: jest.Mocked<HttpClient> = {
get: jest.fn(<T = any>(_url: string) => Promise.resolve({} as T)),
post: jest.fn(<T = any, B = any>(_url: string, _body: B) =>
get: jest.fn(<T = any, B = any>(_url: string, _header: B) => Promise.resolve({} as T)),
post: jest.fn(<T = any, B = any, C = any>(_url: string, _body: B, _header: C) =>
Promise.resolve({} as T)
),
delete: jest.fn((_url: string, _id: string) => Promise.resolve(true)),
patch: jest.fn(<T = any, B = any>(_url: string, _body: B) =>
delete: jest.fn(<T = any>(_url: string, _id: string, header: T) => Promise.resolve(true)),
patch: jest.fn(<T = any, B = any, C = any>(_url: string, _body: B, _header: C) =>
Promise.resolve({} as T)

@@ -25,4 +25,5 @@ ),

const sut = new Repository(urlGenerator, httpClientMock);
const url = `${baseUrl}/${name}?api_key=${apiKey}`;
return { sut, httpClientMock, url, urlGenerator };
const url = `${baseUrl}/${name}`;
const header = { header: `'Authorization': 'Bearer ${apiKey}'` }
return { sut, httpClientMock, url, header, urlGenerator };
};

@@ -5,10 +5,10 @@ import { makeSutRepository } from '../mocks';

it('Should calls url in the method get of httpClient', async () => {
const { sut, httpClientMock, url } = makeSutRepository();
const { sut, httpClientMock, url, header } = makeSutRepository();
const httpClientSpy = jest.spyOn(httpClientMock, 'get');
await sut.find({});
expect(httpClientSpy).toHaveBeenCalledTimes(1);
expect(httpClientSpy).toHaveBeenCalledWith(`${url}&maxRecords=1`);
expect(httpClientSpy).toHaveBeenCalledWith(`${url}&maxRecords=1`, header);
});
it('Should calls correct body on create', () => {
const { sut, httpClientMock, url } = makeSutRepository();
const { sut, httpClientMock, url, header } = makeSutRepository();
const httpClientSpy = jest.spyOn(httpClientMock, 'post');

@@ -20,6 +20,6 @@ const body = {

expect(httpClientSpy).toHaveBeenCalledTimes(1);
expect(httpClientSpy).toHaveBeenCalledWith(url, { fields: body });
expect(httpClientSpy).toHaveBeenCalledWith(url, { fields: body }, header);
});
it('Should calls correct body on destroy', () => {
const { sut, httpClientMock, url } = makeSutRepository();
const { sut, httpClientMock, url, header } = makeSutRepository();
const httpClientSpy = jest.spyOn(httpClientMock, 'delete');

@@ -29,6 +29,6 @@ const id = 'any_id';

expect(httpClientSpy).toHaveBeenCalledTimes(1);
expect(httpClientSpy).toHaveBeenCalledWith(url, id);
expect(httpClientSpy).toHaveBeenCalledWith(url, id, header);
});
it('Should calls correct body on update', () => {
const { sut, httpClientMock, url } = makeSutRepository();
const { sut, httpClientMock, url, header } = makeSutRepository();
const httpClientSpy = jest.spyOn(httpClientMock, 'patch');

@@ -57,4 +57,4 @@ const id = 'any_id';

],
});
}, header);
});
});

@@ -18,3 +18,3 @@ import { UrlGenerator } from '../../../src/data/services/url-generator';

const sut = new UrlGenerator(config, table);
const initialUrl = `${config.baseUrl}/${table.tableName}?api_key=${config.apiKey}`;
const initialUrl = `${config.baseUrl}/${table.tableName}`;
return { sut, initialUrl };

@@ -21,0 +21,0 @@ };

@@ -17,3 +17,2 @@ {

"skipLibCheck": true,
"keyofStringsOnly": true,
"noImplicitAny": false

@@ -20,0 +19,0 @@ },

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./make-url-validators"), exports);
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeUrlValidators = void 0;
const url_validator_1 = require("../validators/url-validator");
const makeUrlValidators = () => {
const selectValidator = new url_validator_1.SelectUrlValidator();
const whereValidator = new url_validator_1.WhereUrlValidator();
const oderByValidator = new url_validator_1.OrderByUrlValidator();
const takeValidator = new url_validator_1.TakeUrlValidator();
return [selectValidator, whereValidator, oderByValidator, takeValidator];
};
exports.makeUrlValidators = makeUrlValidators;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataInstance = void 0;
const repository_1 = require("./repository");
class DataInstance {
constructor(urlGenerator, httpClient) {
this.urlGenerator = urlGenerator;
this.httpClient = httpClient;
}
getRepository(table) {
this.urlGenerator.setTable(table);
return new repository_1.Repository(this.urlGenerator, this.httpClient);
}
}
exports.DataInstance = DataInstance;
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Repository = void 0;
const utils_1 = require("../utils");
class Repository {
constructor(urlGenerator, httpClient) {
this.httpClient = httpClient;
this.urlGenerator = (0, utils_1.deepClone)(urlGenerator);
}
find(params) {
return __awaiter(this, void 0, void 0, function* () {
const url = this.urlGenerator.getUrl(Object.assign(Object.assign({}, params), { take: 1 }));
const rawData = yield this.httpClient.get(url);
const data = this.convertRawData(rawData);
return data && data.length ? data[0] : null;
});
}
findAll(params) {
return __awaiter(this, void 0, void 0, function* () {
const url = this.urlGenerator.getUrl(params);
const rawData = yield this.httpClient.get(url);
return this.convertRawData(rawData);
});
}
create(body) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.httpClient.post(this.urlGenerator.getUrl({}), {
fields: body,
});
return Object.assign(Object.assign({}, result.fields), { id: result.id, createdTime: result.createdTime });
});
}
destroy(id) {
return this.httpClient.delete(this.urlGenerator.getUrl({}), id);
}
update(id, body) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.httpClient.patch(this.urlGenerator.getUrl({}), {
records: [
{
id,
fields: body,
},
],
});
return Object.assign(Object.assign({}, result.records[0].fields), { id: result.records[0].id, createdTime: result.records[0].createdTime });
});
}
convertRawData(rawData) {
var _a;
return (_a = rawData === null || rawData === void 0 ? void 0 : rawData.records) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, this.filterIdAndCreatedTime(item)), this.filterFields(item.fields))));
}
filterIdAndCreatedTime(record) {
return {
id: record.id,
createdTime: record.createdTime,
};
}
filterFields(fields) {
let result = {};
Object.keys(fields).forEach((key) => {
const value = {};
value[key] = fields[key];
result = Object.assign(Object.assign({}, result), value);
});
return result;
}
}
exports.Repository = Repository;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UrlGenerator = void 0;
const factories_1 = require("../factories");
class UrlGenerator {
constructor(config, table, validators = (0, factories_1.makeUrlValidators)()) {
this.config = config;
this.table = table;
this.validators = validators;
this.url = '';
this.setTable(table);
}
setTable(table) {
if (table) {
this.url = `${this.config.baseUrl}/${table.tableName}?api_key=${this.config.apiKey}`;
}
}
getUrl(dataInstance, table) {
this.setTable(table);
this.validators.forEach((validator) => {
this.url = validator.validate(this.url, dataInstance);
});
return this.url;
}
}
exports.UrlGenerator = UrlGenerator;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepClone = void 0;
function deepClone(obj, hash = new WeakMap()) {
if (Object(obj) !== obj)
return obj;
if (hash.has(obj))
return hash.get(obj);
const result = obj instanceof Set
? new Set(obj)
: obj instanceof Map
? new Map(Array.from(obj, ([key, val]) => [key, deepClone(val, hash)]))
: obj instanceof Date
? new Date(obj)
: obj instanceof RegExp
? new RegExp(obj.source, obj.flags)
: obj.constructor
? new obj.constructor()
: Object.create(null);
hash.set(obj, result);
return Object.assign(result, ...Object.keys(obj).map((key) => ({ [key]: deepClone(obj[key], hash) })));
}
exports.deepClone = deepClone;
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./deep-clone"), exports);
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./select-url.validator"), exports);
__exportStar(require("./where-url.validator"), exports);
__exportStar(require("./orderby-url.validator"), exports);
__exportStar(require("./take-url.validator"), exports);
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OrderByUrlValidator = void 0;
class OrderByUrlValidator {
validate(url, dataInstance) {
if (!dataInstance.orderBy) {
return url;
}
Object.keys(dataInstance.orderBy).forEach((item, index) => {
const value = dataInstance.orderBy[item];
url = `${url}&sort[${index}][field]=${item}&sort[${index}][direction]=${value}`;
});
return url;
}
}
exports.OrderByUrlValidator = OrderByUrlValidator;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SelectUrlValidator = void 0;
class SelectUrlValidator {
validate(url, dataInstance) {
var _a;
(_a = dataInstance.select) === null || _a === void 0 ? void 0 : _a.forEach((item) => {
url = `${url}&fields[]=${item}`;
});
return url;
}
}
exports.SelectUrlValidator = SelectUrlValidator;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TakeUrlValidator = void 0;
class TakeUrlValidator {
validate(url, dataInstance) {
if (!dataInstance.take) {
return url;
}
return `${url}&maxRecords=${dataInstance.take}`;
}
}
exports.TakeUrlValidator = TakeUrlValidator;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WhereUrlValidator = void 0;
class WhereUrlValidator {
validate(url, dataInstance) {
if (!dataInstance.where || !Object.keys(dataInstance.where).length) {
return url;
}
url = `${url}&filterByFormula=`;
return url + this.generateUrl(dataInstance.where);
}
generateUrl(where) {
const isArray = Array.isArray(where);
if (isArray) {
return this.generateOR(where);
}
return this.generateAND(where);
}
generateAND(where) {
const whereArray = Object.keys(where).map((item) => {
const value = where[item];
if (typeof value === 'boolean') {
return value ? item : `NOT(${item})`;
}
return `{${item}}='${value}'`;
});
return `AND(${whereArray.join(',')})`;
}
generateOR(where) {
const orArray = where.reduce((acc, item) => {
return `${acc},${this.generateAND(item)}`;
}, '');
return `OR(${orArray.substring(1)})`;
}
}
exports.WhereUrlValidator = WhereUrlValidator;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./table.model"), exports);
__exportStar(require("./config.model"), exports);
__exportStar(require("./query-find.model"), exports);
__exportStar(require("./data-instance.model"), exports);
__exportStar(require("./repository.model"), exports);
__exportStar(require("./url-validator"), exports);
__exportStar(require("./configure-instance"), exports);
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpAxiosClient = void 0;
const axios_1 = __importDefault(require("axios"));
class HttpAxiosClient {
get(url) {
return __awaiter(this, void 0, void 0, function* () {
const http = yield axios_1.default.get(url);
return http.data;
});
}
post(url, body) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield axios_1.default.post(url, body);
return result.data;
});
}
delete(url, id) {
return __awaiter(this, void 0, void 0, function* () {
try {
const result = yield axios_1.default.delete(`${url}&records[]=${id}`);
return result.data.records[0].deleted;
}
catch (_a) {
return false;
}
});
}
patch(url, body) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield axios_1.default.patch(url, body);
return result.data;
});
}
}
exports.HttpAxiosClient = HttpAxiosClient;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AirTableConfig = void 0;
const data_instance_1 = require("../../data/services/data-instance");
const url_generator_1 = require("../../data/services/url-generator");
const http_axios_client_1 = require("../providers/http/http-axios-client");
class AirTableConfig {
configure(config) {
const urlGenerator = new url_generator_1.UrlGenerator(config);
const httpAxiosClient = new http_axios_client_1.HttpAxiosClient();
return new data_instance_1.DataInstance(urlGenerator, httpAxiosClient);
}
}
exports.AirTableConfig = AirTableConfig;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AirTableConfig = void 0;
const airtable_config_1 = require("../infra/services/airtable-config");
Object.defineProperty(exports, "AirTableConfig", { enumerable: true, get: function () { return airtable_config_1.AirTableConfig; } });