data-projector.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {Service} from '@e22m4u/js-service';
  2. import {projectData} from './project-data.js';
  3. import {ProjectionSchemaRegistry} from './projection-schema-registry.js';
  4. /**
  5. * Data projector.
  6. */
  7. export class DataProjector extends Service {
  8. /**
  9. * Define schema.
  10. *
  11. * @param {object} schemaDef
  12. * @returns {this}
  13. */
  14. defineSchema(schemaDef) {
  15. this.getService(ProjectionSchemaRegistry).defineSchema(schemaDef);
  16. return this;
  17. }
  18. /**
  19. * Project.
  20. *
  21. * @param {object|object[]|*} data
  22. * @param {object|Function|string} schema
  23. * @param {object} [options]
  24. * @returns {*}
  25. */
  26. project(data, schema, options) {
  27. const registry = this.getService(ProjectionSchemaRegistry);
  28. const defaultNameResolver = name => registry.getSchema(name);
  29. const nameResolver =
  30. (options && options.nameResolver) || defaultNameResolver;
  31. const factoryArgs = (options && options.factoryArgs) || [this.container];
  32. return projectData(data, schema, {...options, nameResolver, factoryArgs});
  33. }
  34. /**
  35. * Project input.
  36. *
  37. * @param {object|object[]|*} data
  38. * @param {object|Function|string} schema
  39. * @param {object} [options]
  40. * @returns {*}
  41. */
  42. projectInput(data, schema, options) {
  43. return this.project(data, schema, {...options, scope: 'input'});
  44. }
  45. /**
  46. * Project output.
  47. *
  48. * @param {object|object[]|*} data
  49. * @param {object|Function|string} schema
  50. * @param {object} [options]
  51. * @returns {*}
  52. */
  53. projectOutput(data, schema, options) {
  54. return this.project(data, schema, {...options, scope: 'output'});
  55. }
  56. }