@feimsoft/remapjs
v0.3.7
Published
It facilitates returned objects transformation by nosql databases or other means.
Downloads
64
Readme
Description
remapjs facilitates records transformation into entity models. It is developed in Typescript and the entities configuration is with decorators. Which is very simple.
NOTE: It is not an ORM, it only transforms the recordset in the specified entities.
How to install
npm:
npm install @feimsoft/remapjs
yarn:
yarn add @feimsoft/remapjs
Documentation
remap
function remap<T extends { new() }>(RecordType: T, recordset: Object[], options?: MapRecordsetOptions): Array<InstanceType<T>>
options
interface MapRecordsetOptions {
sources?: MapSource[];
ignoreCase?: boolean;
}
Define your entity model
The following decorators are provided to configure the entities.
Column
Specifies that a property is to be mapped with a column in the record.
Decorator
const Column = (options?: ColumnOptions) => any;
interface ColumnOptions {
name: string;
}
Example
class DbEntity {
@Column() id: number;
@Column() name: string;
}
const mainRecords = [
{ id: 1, name: 'test 1' },
{ id: 2, name: 'test 2' }
];
const outputData = remap(DbEntity, mainRecords);
ManyToOne
Specifies that a property of a single record is going to be mapped with a second set of records provided or if the name of the column contains "." the navigation to complex objects will be carried out.
Decorator
const ManyToOne = (Type: ({ new() }), options?: ManyToOneOptions) => any;
interface ManyToOneOptions {
/** Prefix of the column that refers to the related record. */
preffix?: string;
/** Property name */
property?: string;
/** Matches with relation property */
matchProperty?: string;
}
Example
class ManyRelationEntity {
@Column() id: number;
@Column() name: string;
}
class DbEntity {
@Column() id: number;
@Column() name: string;
@Column() relationId: string;
@ManyToOne(RelDbEntity, {property: 'relationId', matchProperty: 'id' })
relation: ManyRelationEntity;
}
const mainRecords = [
{ id: 1, name: 'test 1', relationId: 1 },
{ id: 2, name: 'test 2', relationId: 2 }
];
const manyRecords = [
{ id: 1, name: 'Prueba rel complex 1' },
{ id: 2, name: 'Prueba rel complex 2' }
];
const outputData = remap(DbEntity, mainRecords, {
sources: [
{ type: ManyRelationEntity, records: manyRecords }
]
});
OneToMany
Specifies that records that match the specified criteria will be retrieved from a source.
Decorators
const OneToMany = (Type: ({ new() }), options: OneToManyOptions) => any;
interface OneToManyOptions {
/** */
property: string;
/** */
inverseProperty: string;
}
Example
class ManyRelationEntity {
@Column() id: number;
@Column() name: string;
@Column() dbId: number;
}
class DbEntity {
@Column() id: number;
@Column() name: string;
@OneToMany(ManyRelationEntity, { property: 'id', inverseProperty: 'dbId' })
relationsMany: ManyRelationEntity[];
}
const mainRecords = [
{ id: 1, name: 'test 1' },
{ id: 2, name: 'test 2' }
];
const manyRecords = [
{ id: 1, dbId: 1, nombre: 'Test rel complex 1' },
{ id: 2, dbId: 2, nombre: 'Test rel complex 2' }
];
const outputData = remap(DbEntity, mainRecords, {
sources: [
{ type: ManyRelationEntity, records: manyRecords }
]
});
Source Alias
If you have more than two registered sources of the same type, you will be interested in assigning an identifier in each source. Let's see an example:
Example
class ManyRelationEntity {
@Column() id: number;
@Column() name: string;
@Column() dbId: number;
}
class DbEntity {
@Column() id: number;
@Column() name: string;
@OneToMany('rel1', { property: 'id', inverseProperty: 'dbId' })
relationsMany: ManyRelationEntity[];
@OneToMany('rel2', { property: 'id', inverseProperty: 'dbId' })
relationsMany: ManyRelationEntity[];
}
const mainRecords = [
{ id: 1, name: 'test 1' },
{ id: 2, name: 'test 2' }
];
const manyRecords1 = [
{ id: 1, dbId: 1, nombre: 'Test rel complex 1' },
{ id: 2, dbId: 2, nombre: 'Test rel complex 2' }
];
const manyRecords2 = [
{ id: 3, dbId: 1, nombre: 'Test rel complex 3' },
{ id: 4, dbId: 2, nombre: 'Test rel complex 4' }
];
const outputData = remap(DbEntity, mainRecords, {
sources: [
{ alias: 'rel1', type: ManyRelationEntity, records: manyRecords1 },
{ alias: 'rel2', type: ManyRelationEntity, records: manyRecords2 }
]
});