UNPKG

@prismatic-io/embedded

Version:

Embed Prismatic's integration marketplace and workflow designer within your existing application.

86 lines (83 loc) 3.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateTypes = exports.stableKeyToTypeName = exports.biomeFormat = void 0; const node_child_process_1 = require("node:child_process"); const json_schema_to_typescript_1 = require("json-schema-to-typescript"); const biomeFormat = (source) => new Promise((resolve, reject) => { const child = (0, node_child_process_1.execFile)("npx", ["biome", "format", "--stdin-file-path=generated.ts"], (error, stdout, stderr) => { if (error) { reject(new Error(`biome format failed: ${stderr}`)); return; } resolve(stdout); }); child.stdin?.write(source); child.stdin?.end(); }); exports.biomeFormat = biomeFormat; const GENERATED_HEADER = `// This file was auto-generated by @prismatic-io/embedded generate-types. // Do not edit this file manually.`; // A top-level export is required so TypeScript treats the file as a module. // Without it, `declare module` becomes an ambient module declaration that // replaces the module's types instead of augmenting them. const MODULE_EXPORT = "export {};"; const stableKeyToTypeName = (stableKey) => `${stableKey .replace(/[^a-zA-Z0-9]+(.)/g, (_, c) => c.toUpperCase()) .replace(/^./, (c) => c.toUpperCase())}Context`; exports.stableKeyToTypeName = stableKeyToTypeName; const deduplicateTypeNames = (contexts) => { const nameToKeys = new Map(); for (const ctx of contexts) { const name = (0, exports.stableKeyToTypeName)(ctx.stableKey); const existing = nameToKeys.get(name); if (existing) { existing.push(ctx.stableKey); } else { nameToKeys.set(name, [ctx.stableKey]); } } const keyToName = new Map(); for (const [name, keys] of nameToKeys) { if (keys.length === 1) { keyToName.set(keys[0], name); } else { for (let i = 0; i < keys.length; i++) { keyToName.set(keys[i], `${name}${i + 1}`); } } } return keyToName; }; const generateContextType = async (context, typeName) => { const interfaceString = await (0, json_schema_to_typescript_1.compile)(context.contextSchema, typeName, { bannerComment: "", additionalProperties: false, }); return { stableKey: context.stableKey, typeName, interfaceString }; }; const generateTypes = async (contexts) => { if (contexts.length === 0) { return (0, exports.biomeFormat)(`${GENERATED_HEADER}\n\n${MODULE_EXPORT}\n\ndeclare module "@prismatic-io/embedded" {\n interface WorkflowContexts {}\n}\n`); } const typeNames = deduplicateTypeNames(contexts); const generated = await Promise.all(contexts.map((ctx) => generateContextType(ctx, typeNames.get(ctx.stableKey)))); const interfaces = generated .map((g) => g.interfaceString.replace(/^export /gm, "")) .join("\n"); const contextEntries = generated .map((g) => ` "${g.stableKey}": ${g.typeName};`) .join("\n"); const output = `${GENERATED_HEADER} ${MODULE_EXPORT} declare module "@prismatic-io/embedded" { ${interfaces} interface WorkflowContexts { ${contextEntries} } } `; return (0, exports.biomeFormat)(output); }; exports.generateTypes = generateTypes;