adapta
Version:
A simple Typescript library for adapting data from one schema to another
71 lines (56 loc) • 2.01 kB
text/typescript
import {input, output, map, TData, type, Adapter, Type, IAdapterConstructor, setPath} from "../src/Adapter";
class Int extends Type {
cast(v: any): number {
return parseInt(v);
}
}
enum ESchema {
DATABASE = 'db',
API1 = 'api1',
API2 = 'api2'
}
class AdapterSpec extends Adapter {
(ESchema.DATABASE, 'name_first')
(ESchema.API1, 'fname')
first_name: TData<string>;
(ESchema.DATABASE, 'name_last')
(ESchema.API1, 'lname')
last_name: TData<string>;
(ESchema.API2, 'name', ['first_name', 'last_name'])
async splitName(name: string) {
const parts = name.split(' ');
return [parts.shift(), parts.join(' ')];
}
(ESchema.API2, ['first_name', 'last_name'], 'name')
async joinName(firstName: string, lastName: string) {
return `${firstName} ${lastName}`;
}
(ESchema.API2, 'undef')
undef: TData<string>;
}
describe('Adapter', () => {
it('should set path values correctly', () => {
const data: any = {};
setPath(data, 'test.and.stuff', 42);
expect(data.test.and.stuff).toBe(42);
setPath(data, 'testing', 43);
expect(data.testing).toBe(43);
});
it("should work with from and to different schemas", async function () {
const adapta = new AdapterSpec();
await adapta.from(ESchema.API2, {
name: 'Bob Lewis'
});
expect(adapta.first_name).toBe('Bob');
expect(adapta.last_name).toBe('Lewis');
const dbData = await adapta.to(ESchema.DATABASE);
expect(dbData.name_first).toBe('Bob');
expect(dbData.name_last).toBe('Lewis');
const api1Data = await adapta.to(ESchema.API1);
expect(api1Data.fname).toBe('Bob');
expect(api1Data.lname).toBe('Lewis');
const api2Data = await adapta.to(ESchema.API2);
expect(api2Data.name).toBe('Bob Lewis');
expect(Object.keys(api2Data).indexOf('undef')).toBe(-1);
});
});