import {Service} from '@e22m4u/js-service'; import {projectData} from './project-data.js'; import {ProjectionSchemaRegistry} from './projection-schema-registry.js'; /** * Data projector. */ export class DataProjector extends Service { /** * Define schema. * * @param {object} schemaDef * @returns {this} */ defineSchema(schemaDef) { this.getService(ProjectionSchemaRegistry).defineSchema(schemaDef); return this; } /** * Project. * * @param {object|object[]|*} data * @param {object|Function|string} schema * @param {object} [options] * @returns {*} */ project(data, schema, options) { const registry = this.getService(ProjectionSchemaRegistry); const defaultNameResolver = name => registry.getSchema(name); const nameResolver = (options && options.nameResolver) || defaultNameResolver; const factoryArgs = (options && options.factoryArgs) || [this.container]; return projectData(data, schema, {...options, nameResolver, factoryArgs}); } /** * Project input. * * @param {object|object[]|*} data * @param {object|Function|string} schema * @param {object} [options] * @returns {*} */ projectInput(data, schema, options) { return this.project(data, schema, {...options, scope: 'input'}); } /** * Project output. * * @param {object|object[]|*} data * @param {object|Function|string} schema * @param {object} [options] * @returns {*} */ projectOutput(data, schema, options) { return this.project(data, schema, {...options, scope: 'output'}); } }