@feimsoft/remapjs

It facilitates returned objects transformation by nosql databases or other means.

Usage no npm install needed!

<script type="module">
  import feimsoftRemapjs from 'https://cdn.skypack.dev/@feimsoft/remapjs';
</script>

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 }
    ]
});