UNPKG

@grnsft/if

Version:

Impact Framework

148 lines 17.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validate = exports.validateManifest = exports.manifestSchema = exports.allDefined = exports.atLeastOneDefined = void 0; const zod_1 = require("zod"); const consts_1 = require("@grnsft/if-core/consts"); const utils_1 = require("@grnsft/if-core/utils"); const config_1 = require("../../if-run/config"); const aggregation_1 = require("../../if-run/types/aggregation"); const { ManifestValidationError, InputValidationError } = utils_1.ERRORS; const { VALIDATING_MANIFEST } = config_1.STRINGS; /** * At least one property defined handler. */ const atLeastOneDefined = (obj) => Object.values(obj).some(v => v !== undefined); exports.atLeastOneDefined = atLeastOneDefined; /** * All properties are defined handler. */ const allDefined = (obj) => Object.values(obj).every(v => v !== undefined); exports.allDefined = allDefined; /** * Reusabe aggregation method schema for parameter metadata. */ const aggregationMethodSchema = zod_1.z.object({ time: zod_1.z.enum(consts_1.AGGREGATION_METHODS), component: zod_1.z.enum(consts_1.AGGREGATION_METHODS), }); /** * Reusable metadata schema. */ const metadataSchema = zod_1.z .record(zod_1.z.string(), zod_1.z.object({ unit: zod_1.z.string(), description: zod_1.z.string(), 'aggregation-method': aggregationMethodSchema, })) .optional() .nullable(); /** * Reusable parameter metadata schema. */ const parameterMetadataSchema = zod_1.z .object({ inputs: metadataSchema, outputs: metadataSchema, }) .optional(); /** * Validation schema for manifests. */ exports.manifestSchema = zod_1.z.object({ name: zod_1.z.string(), description: zod_1.z.string().optional().nullable(), tags: zod_1.z .object({ kind: zod_1.z.string().optional().nullable(), complexity: zod_1.z.string().optional().nullable(), category: zod_1.z.string().optional().nullable(), }) .optional() .nullable(), explainer: zod_1.z.boolean().optional(), explain: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional(), aggregation: zod_1.z .object({ metrics: zod_1.z.array(zod_1.z.string()), type: zod_1.z.enum(aggregation_1.AGGREGATION_TYPES), 'skip-components': zod_1.z.array(zod_1.z.string()).optional(), }) .optional() .nullable(), initialize: zod_1.z.object({ plugins: zod_1.z.record(zod_1.z.string(), zod_1.z .object({ path: zod_1.z.string(), method: zod_1.z.string(), mapping: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(), config: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional(), 'parameter-metadata': parameterMetadataSchema, }) .optional()), }), execution: zod_1.z .object({ command: zod_1.z.string().optional(), environment: zod_1.z .object({ 'if-version': zod_1.z.string(), os: zod_1.z.string(), 'os-version': zod_1.z.string(), 'node-version': zod_1.z.string(), 'date-time': zod_1.z.string(), dependencies: zod_1.z.array(zod_1.z.string()), }) .optional(), status: zod_1.z.string(), error: zod_1.z.string().optional(), }) .optional(), tree: zod_1.z.record(zod_1.z.string(), zod_1.z.any()), }); /** * Validates given `manifest` object to match pattern. */ const validateManifest = (manifest) => { console.debug(VALIDATING_MANIFEST); return (0, exports.validate)(exports.manifestSchema, manifest, undefined, ManifestValidationError); }; exports.validateManifest = validateManifest; /** * Validates given `object` with given `schema`. */ const validate = (schema, object, index, errorConstructor = InputValidationError) => { const validationResult = schema.safeParse(object); if (!validationResult.success) { throw new errorConstructor(prettifyErrorMessage(validationResult.error.message, index)); } return validationResult.data; }; exports.validate = validate; /** * Error message formatter for zod issues. */ const prettifyErrorMessage = (issues, index) => { const issuesArray = JSON.parse(issues); return issuesArray.map((issue) => { const code = issue.code; let { path, message } = issue; const indexErrorMessage = index !== undefined ? ` at index ${index}` : ''; if (issue.code === zod_1.ZodIssueCode.invalid_union) { message = issue.unionErrors[0].issues[0].message; path = issue.unionErrors[0].issues[0].path; } const fullPath = flattenPath(path); if (!fullPath) { return message; } return `"${fullPath}" parameter is ${message.toLowerCase()}${indexErrorMessage}. Error code: ${code}.`; }); }; /** * Flattens an array representing a nested path into a string. */ const flattenPath = (path) => { const flattenPath = path.map(part => typeof part === 'number' ? `[${part}]` : part); return flattenPath.join('.'); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXlEO0FBQ3pELG1EQUEyRDtBQUMzRCxpREFBNkM7QUFFN0MsZ0RBQTRDO0FBRTVDLGdFQUFpRTtBQUVqRSxNQUFNLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFDL0QsTUFBTSxFQUFDLG1CQUFtQixFQUFDLEdBQUcsZ0JBQU8sQ0FBQztBQUV0Qzs7R0FFRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsR0FBOEMsRUFDOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBRnRDLFFBQUEsaUJBQWlCLHFCQUVxQjtBQUVuRDs7R0FFRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBOEMsRUFBRSxFQUFFLENBQzNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBRHBDLFFBQUEsVUFBVSxjQUMwQjtBQUVqRDs7R0FFRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxJQUFJLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBbUIsQ0FBQztJQUNqQyxTQUFTLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBbUIsQ0FBQztDQUN2QyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sY0FBYyxHQUFHLE9BQUM7S0FDckIsTUFBTSxDQUNMLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFDVixPQUFDLENBQUMsTUFB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TUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUMsQ0FBQztJQUVGLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1pvZElzc3VlLCBab2RJc3N1ZUNvZGUsIFpvZFNjaGVtYSwgen0gZnJvbSAnem9kJztcbmltcG9ydCB7QUdHUkVHQVRJT05fTUVUSE9EU30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL2NvbnN0cyc7XG5pbXBvcnQge0VSUk9SU30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi8uLi9pZi1ydW4vY29uZmlnJztcblxuaW1wb3J0IHtBR0dSRUdBVElPTl9UWVBFU30gZnJvbSAnLi4vLi4vaWYtcnVuL3R5cGVzL2FnZ3JlZ2F0aW9uJztcblxuY29uc3Qge01hbmlmZXN0VmFsaWRhdGlvbkVycm9yLCBJbnB1dFZhbGlkYXRpb25FcnJvcn0gPSBFUlJPUlM7XG5jb25zdCB7VkFMSURBVElOR19NQU5JRkVTVH0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIEF0IGxlYXN0IG9uZSBwcm9wZXJ0eSBkZWZpbmVkIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBhdExlYXN0T25lRGVmaW5lZCA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPlxuKSA9PiBPYmplY3QudmFsdWVzKG9iaikuc29tZSh2ID0+IHYgIT09IHVuZGVmaW5lZCk7XG5cbi8qKlxuICogQWxsIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsbERlZmluZWQgPSAob2JqOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPikgPT5cbiAgT2JqZWN0LnZhbHVlcyhvYmopLmV2ZXJ5KHYgPT4gdiAhPT0gdW5kZWZpbmVkKTtcblxuLyoqXG4gKiBSZXVzYWJlIGFnZ3JlZ2F0aW9uIG1ldGhvZCBzY2hlbWEgZm9yIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqL1xuY29uc3QgYWdncmVnYXRpb25NZXRob2RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpbWU6IHouZW51bShBR0dSRUdBVElPTl9NRVRIT0RTKSxcbiAgY29tcG9uZW50OiB6LmVudW0oQUdHUkVHQVRJT05fTUVUSE9EUyksXG59KTtcblxuLyoqXG4gKiBSZXVzYWJsZSBtZXRhZGF0YSBzY2hlbWEuXG4gKi9cbmNvbnN0IG1ldGFkYXRhU2NoZW1hID0gelxuICAucmVjb3JkKFxuICAgIHouc3RyaW5nKCksXG4gICAgei5vYmplY3Qoe1xuICAgICAgdW5pdDogei5zdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLFxuICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IGFnZ3JlZ2F0aW9uTWV0aG9kU2NoZW1hLFxuICAgIH0pXG4gIClcbiAgLm9wdGlvbmFsKClcbiAgLm51bGxhYmxlKCk7XG5cbi8qKlxuICogUmV1c2FibGUgcGFyYW1ldGVyIG1ldGFkYXRhIHNjaGVtYS5cbiAqL1xuY29uc3QgcGFyYW1ldGVyTWV0YWRhdGFTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlucHV0czogbWV0YWRhdGFTY2hlbWEsXG4gICAgb3V0cHV0czogbWV0YWRhdGFTY2hlbWEsXG4gIH0pXG4gIC5vcHRpb25hbCgpO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gc2NoZW1hIGZvciBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBtYW5pZmVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICB0YWdzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBraW5kOiB6LnN0cmluZygpLm9wdGlvbmFsKCkubnVsbGFibGUoKSxcbiAgICAgIGNvbXBsZXhpdHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICAgICAgY2F0ZWdvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAubnVsbGFibGUoKSxcbiAgZXhwbGFpbmVyOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleHBsYWluOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxuICBhZ2dyZWdhdGlvbjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgbWV0cmljczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICAgIHR5cGU6IHouZW51bShBR0dSRUdBVElPTl9UWVBFUyksXG4gICAgICAnc2tpcC1jb21wb25lbnRzJzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKClcbiAgICAubnVsbGFibGUoKSxcbiAgaW5pdGlhbGl6ZTogei5vYmplY3Qoe1xuICAgIHBsdWdpbnM6IHoucmVjb3JkKFxuICAgICAgei5zdHJpbmcoKSxcbiAgICAgIHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgcGF0aDogei5zdHJpbmcoKSxcbiAgICAgICAgICBtZXRob2Q6IHouc3RyaW5nKCksXG4gICAgICAgICAgbWFwcGluZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBjb25maWc6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLm9wdGlvbmFsKCksXG4gICAgICAgICAgJ3BhcmFtZXRlci1tZXRhZGF0YSc6IHBhcmFtZXRlck1ldGFkYXRhU2NoZW1hLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICksXG4gIH0pLFxuICBleGVjdXRpb246IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGNvbW1hbmQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGVudmlyb25tZW50OiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICdpZi12ZXJzaW9uJzogei5zdHJpbmcoKSxcbiAgICAgICAgICBvczogei5zdHJpbmcoKSxcbiAgICAgICAgICAnb3MtdmVyc2lvbic6IHouc3RyaW5nKCksXG4gICAgICAgICAgJ25vZGUtdmVyc2lvbic6IHouc3RyaW5nKCksXG4gICAgICAgICAgJ2RhdGUtdGltZSc6IHouc3RyaW5nKCksXG4gICAgICAgICAgZGVwZW5kZW5jaWVzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIHN0YXR1czogei5zdHJpbmcoKSxcbiAgICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbiAgdHJlZTogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG59KTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZ2l2ZW4gYG1hbmlmZXN0YCBvYmplY3QgdG8gbWF0Y2ggcGF0dGVybi5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWFuaWZlc3QgPSAobWFuaWZlc3Q6IGFueSkgPT4ge1xuICBjb25zb2xlLmRlYnVnKFZBTElEQVRJTkdfTUFOSUZFU1QpO1xuXG4gIHJldHVybiB2YWxpZGF0ZShtYW5pZmVzdFNjaGVtYSwgbWFuaWZlc3QsIHVuZGVmaW5lZCwgTWFuaWZlc3RWYWxpZGF0aW9uRXJyb3IpO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZ2l2ZW4gYG9iamVjdGAgd2l0aCBnaXZlbiBgc2NoZW1hYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlID0gPFQ+KFxuICBzY2hlbWE6IFpvZFNjaGVtYTxUPixcbiAgb2JqZWN0OiBhbnksXG4gIGluZGV4PzogbnVtYmVyLFxuICBlcnJvckNvbnN0cnVjdG9yOiBFcnJvckNvbnN0cnVjdG9yID0gSW5wdXRWYWxpZGF0aW9uRXJyb3JcbikgPT4ge1xuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gc2NoZW1hLnNhZmVQYXJzZShvYmplY3QpO1xuXG4gIGlmICghdmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IGVycm9yQ29uc3RydWN0b3IoXG4gICAgICBwcmV0dGlmeUVycm9yTWVzc2FnZSh2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2UsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5kYXRhO1xufTtcblxuLyoqXG4gKiBFcnJvciBtZXNzYWdlIGZvcm1hdHRlciBmb3Igem9kIGlzc3Vlcy5cbiAqL1xuY29uc3QgcHJldHRpZnlFcnJvck1lc3NhZ2UgPSAoaXNzdWVzOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc0FycmF5ID0gSlNPTi5wYXJzZShpc3N1ZXMpO1xuXG4gIHJldHVybiBpc3N1ZXNBcnJheS5tYXAoKGlzc3VlOiBab2RJc3N1ZSkgPT4ge1xuICAgIGNvbnN0IGNvZGUgPSBpc3N1ZS5jb2RlO1xuICAgIGxldCB7cGF0aCwgbWVzc2FnZX0gPSBpc3N1ZTtcblxuICAgIGNvbnN0IGluZGV4RXJyb3JNZXNzYWdlID0gaW5kZXggIT09IHVuZGVmaW5lZCA/IGAgYXQgaW5kZXggJHtpbmRleH1gIDogJyc7XG5cbiAgICBpZiAoaXNzdWUuY29kZSA9PT0gWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24pIHtcbiAgICAgIG1lc3NhZ2UgPSBpc3N1ZS51bmlvbkVycm9yc1swXS5pc3N1ZXNbMF0ubWVzc2FnZTtcbiAgICAgIHBhdGggPSBpc3N1ZS51bmlvbkVycm9yc1swXS5pc3N1ZXNbMF0ucGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IGZsYXR0ZW5QYXRoKHBhdGgpO1xuXG4gICAgaWYgKCFmdWxsUGF0aCkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcIiR7ZnVsbFBhdGh9XCIgcGFyYW1ldGVyIGlzICR7bWVzc2FnZS50b0xvd2VyQ2FzZSgpfSR7aW5kZXhFcnJvck1lc3NhZ2V9LiBFcnJvciBjb2RlOiAke2NvZGV9LmA7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBGbGF0dGVucyBhbiBhcnJheSByZXByZXNlbnRpbmcgYSBuZXN0ZWQgcGF0aCBpbnRvIGEgc3RyaW5nLlxuICovXG5jb25zdCBmbGF0dGVuUGF0aCA9IChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZmxhdHRlblBhdGggPSBwYXRoLm1hcChwYXJ0ID0+XG4gICAgdHlwZW9mIHBhcnQgPT09ICdudW1iZXInID8gYFske3BhcnR9XWAgOiBwYXJ0XG4gICk7XG5cbiAgcmV0dXJuIGZsYXR0ZW5QYXRoLmpvaW4oJy4nKTtcbn07XG4iXX0=