"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.js var index_exports = {}; __export(index_exports, { DataProjector: () => DataProjector, ProjectionSchemaRegistry: () => ProjectionSchemaRegistry, ProjectionScope: () => ProjectionScope, projectData: () => projectData, validateProjectionSchema: () => validateProjectionSchema, validateProjectionSchemaDefinition: () => validateProjectionSchemaDefinition }); module.exports = __toCommonJS(index_exports); // src/project-data.js var import_js_format2 = require("@e22m4u/js-format"); // src/validate-projection-schema.js var import_js_format = require("@e22m4u/js-format"); function validateProjectionSchema(schema, shallowMode = false) { if (!schema || typeof schema !== "object" || Array.isArray(schema)) { throw new import_js_format.InvalidArgumentError( "Projection schema must be an Object, but %v was given.", schema ); } if (typeof shallowMode !== "boolean") { throw new import_js_format.InvalidArgumentError( 'Parameter "shallowMode" must be a Boolean, but %v was given.', shallowMode ); } Object.keys(schema).forEach((propName) => { const options = schema[propName]; if (options === void 0) { return; } if (options === null || typeof options !== "boolean" && typeof options !== "object" || Array.isArray(options)) { throw new import_js_format.InvalidArgumentError( "Property options must be a Boolean or an Object, but %v was given.", options ); } if (typeof options === "boolean") { return; } if (options.select !== void 0 && typeof options.select !== "boolean") { throw new import_js_format.InvalidArgumentError( 'Property option "select" must be a Boolean, but %v was given.', options.select ); } if (options.schema !== void 0) { if (!options.schema || typeof options.schema !== "object" && typeof options.schema !== "function" && typeof options.schema !== "string" || Array.isArray(options.schema)) { throw new import_js_format.InvalidArgumentError( "Embedded schema must be an Object, a Function or a non-empty String, but %v was given.", options.schema ); } if (!shallowMode && typeof options.schema === "object") { validateProjectionSchema(options.schema, shallowMode); } } if (options.scopes !== void 0) { if (!options.scopes || typeof options.scopes !== "object" || Array.isArray(options.scopes)) { throw new import_js_format.InvalidArgumentError( 'Property option "scopes" must be an Object, but %v was given.', options.scopes ); } Object.keys(options.scopes).forEach((scopeName) => { const scopeOptions = options.scopes[scopeName]; if (scopeOptions === void 0) { return; } if (scopeOptions === null || typeof scopeOptions !== "boolean" && typeof scopeOptions !== "object" || Array.isArray(scopeOptions)) { throw new import_js_format.InvalidArgumentError( "Scope options must be a Boolean or an Object, but %v was given.", scopeOptions ); } if (typeof scopeOptions === "boolean") { return; } if (scopeOptions.select !== void 0) { if (typeof scopeOptions.select !== "boolean") { throw new import_js_format.InvalidArgumentError( 'Scope option "select" must be a Boolean, but %v was given.', scopeOptions.select ); } } }); } }); } __name(validateProjectionSchema, "validateProjectionSchema"); // src/project-data.js function projectData(schemaOrFactory, data, options) { if (!schemaOrFactory || typeof schemaOrFactory !== "object" && typeof schemaOrFactory !== "function" && typeof schemaOrFactory !== "string" || Array.isArray(schemaOrFactory)) { throw new import_js_format2.InvalidArgumentError( "Projection schema must be an Object, a Function or a non-empty String, but %v was given.", schemaOrFactory ); } if (options !== void 0) { if (!options || typeof options !== "object" || Array.isArray(options)) { throw new import_js_format2.InvalidArgumentError( 'Parameter "options" must be an Object, but %v was given.', options ); } if (options.strict !== void 0 && typeof options.strict !== "boolean") { throw new import_js_format2.InvalidArgumentError( 'Option "strict" must be a Boolean, but %v was given.', options.strict ); } if (options.scope !== void 0 && (!options.scope || typeof options.scope !== "string")) { throw new import_js_format2.InvalidArgumentError( 'Option "scope" must be a non-empty String, but %v was given.', options.scope ); } if (options.resolver !== void 0 && typeof options.resolver !== "function") { throw new import_js_format2.InvalidArgumentError( 'Option "resolver" must be a Function, but %v was given.', options.resolver ); } } const strict = Boolean(options && options.strict); const scope = options && options.scope || void 0; let schemaOrName = schemaOrFactory; if (typeof schemaOrFactory === "function") { schemaOrName = schemaOrFactory(); if (!schemaOrName || typeof schemaOrName !== "object" && typeof schemaOrName !== "string" || Array.isArray(schemaOrName)) { throw new import_js_format2.InvalidArgumentError( "Projection schema factory must return an Object or a non-empty String, but %v was given.", schemaOrName ); } } let schema = schemaOrName; if (schemaOrName && typeof schemaOrName === "string") { if (!options || !options.resolver) { throw new import_js_format2.InvalidArgumentError( "Unable to resolve the projection schema %v without a provided resolver.", schemaOrName ); } schema = options.resolver(schemaOrName); if (!schema || typeof schema !== "object" || Array.isArray(schema)) { throw new import_js_format2.InvalidArgumentError( "Projection schema resolver must return an Object, but %v was given.", schema ); } } validateProjectionSchema(schema, true); if (data === null || typeof data !== "object") { return data; } if (Array.isArray(data)) { return data.map((item) => projectData(schema, item, options)); } const result = {}; const fields = Object.keys(strict ? schema : data); for (const field of fields) { if (!(field in data)) { continue; } if (!Object.prototype.hasOwnProperty.call(data, field)) { continue; } const propOptionsOrBoolean = schema[field]; if (_shouldSelect(propOptionsOrBoolean, strict, scope)) { const value = data[field]; if (propOptionsOrBoolean && typeof propOptionsOrBoolean === "object" && propOptionsOrBoolean.schema) { result[field] = projectData( propOptionsOrBoolean.schema, value, options ); } else { result[field] = value; } } } return result; } __name(projectData, "projectData"); function _shouldSelect(propOptionsOrBoolean, strict, scope) { if (typeof propOptionsOrBoolean === "boolean") { return propOptionsOrBoolean; } if (typeof propOptionsOrBoolean === "object") { const propOptions = propOptionsOrBoolean; if (scope && propOptions.scopes && typeof propOptions.scopes === "object" && propOptions.scopes[scope] != null) { const scopeOptionsOrBoolean = propOptions.scopes[scope]; if (typeof scopeOptionsOrBoolean === "boolean") { return scopeOptionsOrBoolean; } if (scopeOptionsOrBoolean && typeof scopeOptionsOrBoolean === "object" && typeof scopeOptionsOrBoolean.select === "boolean") { return scopeOptionsOrBoolean.select; } } if (typeof propOptionsOrBoolean.select === "boolean") { return propOptionsOrBoolean.select; } } return !strict; } __name(_shouldSelect, "_shouldSelect"); // src/data-projector.js var import_js_service2 = require("@e22m4u/js-service"); // src/definitions/projection-schema-registry.js var import_js_service = require("@e22m4u/js-service"); var import_js_format4 = require("@e22m4u/js-format"); // src/definitions/validate-projection-schema-definition.js var import_js_format3 = require("@e22m4u/js-format"); function validateProjectionSchemaDefinition(schemaDef) { if (!schemaDef || typeof schemaDef !== "object" || Array.isArray(schemaDef)) { throw new import_js_format3.InvalidArgumentError( "Projection schema definition must be an Object, but %v was given.", schemaDef ); } if (!schemaDef.name || typeof schemaDef.name !== "string") { throw new import_js_format3.InvalidArgumentError( "Projection schema name must be a non-empty String, but %v was given.", schemaDef.name ); } if (!schemaDef.schema || typeof schemaDef.schema !== "object" || Array.isArray(schemaDef.schema)) { throw new import_js_format3.InvalidArgumentError( "Projection schema must be an Object, but %v was given.", schemaDef.schema ); } validateProjectionSchema(schemaDef.schema); } __name(validateProjectionSchemaDefinition, "validateProjectionSchemaDefinition"); // src/definitions/projection-schema-registry.js var _ProjectionSchemaRegistry = class _ProjectionSchemaRegistry extends import_js_service.Service { /** * Schema map. * * @type {Map} */ definitions = /* @__PURE__ */ new Map(); /** * Define schema. * * @param {object} schemaDef * @returns {this} */ defineSchema(schemaDef) { validateProjectionSchemaDefinition(schemaDef); if (this.definitions.has(schemaDef.name)) { throw new import_js_format4.InvalidArgumentError( "Projection schema %v is already registered.", schemaDef.name ); } this.definitions.set(schemaDef.name, schemaDef); return this; } /** * Has schema. * * @param {string} schemaName * @returns {boolean} */ hasSchema(schemaName) { return this.definitions.has(schemaName); } /** * Get schema. * * @param {string} schemaName * @returns {object} */ getSchema(schemaName) { const schemaDef = this.definitions.get(schemaName); if (!schemaDef) { throw new import_js_format4.InvalidArgumentError( "Projection schema %v is not found.", schemaName ); } return schemaDef.schema; } /** * Get definition. * * @param {string} schemaName * @returns {object} */ getDefinition(schemaName) { const schemaDef = this.definitions.get(schemaName); if (!schemaDef) { throw new import_js_format4.InvalidArgumentError( "Projection definition %v is not found.", schemaName ); } return schemaDef; } }; __name(_ProjectionSchemaRegistry, "ProjectionSchemaRegistry"); var ProjectionSchemaRegistry = _ProjectionSchemaRegistry; // src/data-projector.js var _DataProjector = class _DataProjector extends import_js_service2.Service { /** * Define schema. * * @param {object} schemaDef * @returns {this} */ defineSchema(schemaDef) { this.getService(ProjectionSchemaRegistry).defineSchema(schemaDef); return this; } /** * Has schema. * * @param {string} schemaName * @returns {boolean} */ hasSchema(schemaName) { return this.getService(ProjectionSchemaRegistry).hasSchema(schemaName); } /** * Project. * * @param {object|Function|string} schemaOrFactory * @param {*} data * @param {object} [options] * @returns {*} */ project(schemaOrFactory, data, options) { const registry = this.getService(ProjectionSchemaRegistry); const resolver = /* @__PURE__ */ __name((schemaName) => { return registry.getSchema(schemaName); }, "resolver"); return projectData(schemaOrFactory, data, { ...options, resolver }); } }; __name(_DataProjector, "DataProjector"); var DataProjector = _DataProjector; // src/projection-scope.js var ProjectionScope = { INPUT: "input", OUTPUT: "output" }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { DataProjector, ProjectionSchemaRegistry, ProjectionScope, projectData, validateProjectionSchema, validateProjectionSchemaDefinition });