quaerateum
Version:
Simple typescript ORM for node.js based on data-mapper, unit-of-work and identity-map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JS.
53 lines (43 loc) • 1.66 kB
text/typescript
import { MetadataProvider } from './MetadataProvider';
import { EntityMetadata, EntityProperty } from '../decorators';
import { Utils } from '../utils';
import { Cascade, ReferenceType } from '../entity';
export class JavaScriptMetadataProvider extends MetadataProvider {
async loadEntityMetadata(meta: EntityMetadata, name: string): Promise<void> {
const { schema } = require(meta.path);
Object.entries(schema.properties).forEach(([name, prop]) => {
if (typeof prop === 'string') {
schema.properties[name] = { type: prop };
}
});
Utils.merge(meta, schema);
Object.entries(meta.properties).forEach(([name, prop]) => {
this.initProperty(prop, name);
});
}
/**
* Re-hydrates missing attributes like `onUpdate` (functions are lost when caching to JSON)
*/
loadFromCache(meta: EntityMetadata, cache: EntityMetadata): void {
Utils.merge(meta, cache);
const { schema } = require(meta.path);
Object.entries(schema.properties).forEach(([name, prop]) => {
if (Utils.isObject(prop)) {
Object.entries(prop).forEach(([attribute, value]) => {
if (!(attribute in meta.properties[name])) {
meta.properties[name][attribute as keyof EntityProperty] = value;
}
});
}
});
}
private initProperty(prop: EntityProperty, propName: string): void {
prop.name = propName;
if (typeof prop.reference === 'undefined') {
prop.reference = ReferenceType.SCALAR;
}
if (prop.reference !== ReferenceType.SCALAR && typeof prop.cascade === 'undefined') {
prop.cascade = [Cascade.PERSIST, Cascade.MERGE];
}
}
}