UNPKG

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