@prismatic-io/embedded
Version:
Embed Prismatic's integration marketplace and workflow designer within your existing application.
86 lines (83 loc) • 3.32 kB
JavaScript
;
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;