primitive-admin 1.1.0-alpha.44 → 1.1.0-alpha.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/bin/primitive.js +0 -0
  2. package/dist/src/commands/blob-buckets.js +20 -7
  3. package/dist/src/commands/blob-buckets.js.map +1 -1
  4. package/dist/src/commands/sync.js +113 -28
  5. package/dist/src/commands/sync.js.map +1 -1
  6. package/dist/src/commands/workflows.js +185 -20
  7. package/dist/src/commands/workflows.js.map +1 -1
  8. package/dist/src/lib/api-client.d.ts +1 -0
  9. package/dist/src/lib/api-client.js +4 -0
  10. package/dist/src/lib/api-client.js.map +1 -1
  11. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +61 -0
  12. package/dist/src/lib/codegen-shared/generatedFiles.js +127 -0
  13. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  14. package/dist/src/lib/db-codegen/dbGenerator.d.ts +30 -5
  15. package/dist/src/lib/db-codegen/dbGenerator.js +227 -165
  16. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -1
  17. package/dist/src/lib/db-codegen/dbTemplates.d.ts +11 -23
  18. package/dist/src/lib/db-codegen/dbTemplates.js +21 -41
  19. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  20. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +7 -3
  21. package/dist/src/lib/db-codegen/dbTsTypes.js +23 -1
  22. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
  23. package/dist/src/lib/generated-allowlist.js +13 -0
  24. package/dist/src/lib/generated-allowlist.js.map +1 -1
  25. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +96 -0
  26. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +112 -0
  27. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  28. package/dist/src/lib/workflow-codegen/generator.d.ts +70 -0
  29. package/dist/src/lib/workflow-codegen/generator.js +186 -0
  30. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  31. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  32. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  33. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  34. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +55 -0
  35. package/dist/src/lib/workflow-codegen/schemaToTs.js +237 -0
  36. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  37. package/package.json +4 -2
@@ -0,0 +1,186 @@
1
+ /**
2
+ * `workflows codegen` orchestrator (issue #1442).
3
+ *
4
+ * Reads synced workflow TOMLs (`.primitive/sync/<env>/<appId>/workflows/*.toml`)
5
+ * and emits ONE generated file per workflow —
6
+ * `workflows/generated/<key>.generated.ts` — each containing the workflow's
7
+ * `<Key>Input`/`<Key>Output` types plus a typed `<key>(client)` invoker factory
8
+ * returning `{ runSync?, start }`. This mirrors `databases codegen`'s per-type
9
+ * `<Type>.generated.ts` layout (#1441's `<type>Ops`): per-file artifacts keep
10
+ * team merges conflict-free and let a `[workflow-key]` filter regenerate exactly
11
+ * one file.
12
+ *
13
+ * Design decisions (see the plan of record on #1442, post-pivot):
14
+ * - Schemas are interpreted through the SHARED descriptor
15
+ * (`generated-schema-descriptor.ts`, a vendored copy of the server's
16
+ * `schema-validation` descriptor) so the generated types match runtime
17
+ * validation exactly. A malformed schema throws (fail-and-exit).
18
+ * - `.runSync` is emitted only for `syncCallable: true` workflows (the server
19
+ * rejects run-sync otherwise); `.start` for every non-reserved workflow.
20
+ * - `input` is a REQUIRED option iff the schema rejects `{}` (the client's
21
+ * `input ?? {}` fallback would fail validation); otherwise `input?`.
22
+ * - The runtime call always passes the ORIGINAL key string; only identifiers
23
+ * are sanitized. `workflowKey` is set AFTER spreading `opts`, so a caller
24
+ * cannot override it.
25
+ * - Disk lifecycle (write / `--check` / suffix-based cleanup) delegates to the
26
+ * shared `writeOrCheckGeneratedFiles`, exactly like `databases codegen`.
27
+ */
28
+ import * as path from "path";
29
+ import { parseConfigToml } from "../config-toml.js";
30
+ import { safeJsonParse } from "../workflow-payload.js";
31
+ import { writeOrCheckGeneratedFiles, } from "../codegen-shared/generatedFiles.js";
32
+ import { fingerprintToml } from "../db-codegen/dbFingerprint.js";
33
+ import { schemaToTsType, schemaRejectsEmptyObject } from "./schemaToTs.js";
34
+ import { workflowInputTypeName, workflowOutputTypeName, workflowFactoryName, } from "./naming.js";
35
+ /** Prefix marking a platform-owned workflow key (mirrors the server's
36
+ * `INTERNAL_WORKFLOW_KEY_PREFIX`; inlined because the CLI cannot import from
37
+ * `src/`). Such workflows are never client-invocable and are skipped. */
38
+ const INTERNAL_WORKFLOW_KEY_PREFIX = "__internal.";
39
+ /** Suffix identifying a generated file (shared with `databases codegen`). */
40
+ export const GENERATED_FILE_SUFFIX = ".generated.ts";
41
+ /** The client package the generated file imports its types from. */
42
+ const CLIENT_PACKAGE = "js-bao-wss-client";
43
+ /** True for a platform-owned workflow key. */
44
+ function isReservedKey(key) {
45
+ return (typeof key === "string" &&
46
+ key.trim().toLowerCase().startsWith(INTERNAL_WORKFLOW_KEY_PREFIX));
47
+ }
48
+ /**
49
+ * Render a top-level `<Name>Input`/`<Name>Output` declaration. An absent schema
50
+ * → `unknown`. An object type → an `interface`; anything else → a `type` alias.
51
+ */
52
+ function renderTypeDecl(name, schema) {
53
+ if (schema === undefined) {
54
+ return `export type ${name} = unknown;`;
55
+ }
56
+ const expr = schemaToTsType(schema, 0);
57
+ if (expr.startsWith("{")) {
58
+ return `export interface ${name} ${expr}`;
59
+ }
60
+ return `export type ${name} = ${expr};`;
61
+ }
62
+ /**
63
+ * Parse a single workflow TOML into the data the emitter needs. Throws on
64
+ * malformed schema JSON (fail-and-exit) — the honest `unknown` fallback is for
65
+ * valid-but-untypeable schemas only. Returns null for a reserved workflow.
66
+ */
67
+ function parseWorkflow(input) {
68
+ // #1464 removed `@iarna/toml`; #1446 makes `sync pull` emit schemas as native
69
+ // TOML tables (incl. mixed-type enums like `enum = ["ok", 1]`, TOML 1.0). The
70
+ // `parseConfigToml` facade parses both. `safeJsonParse` still owns the
71
+ // string-vs-inline-table schema handling.
72
+ const data = parseConfigToml(input.tomlContent);
73
+ const workflow = data?.workflow ?? {};
74
+ const key = typeof workflow.key === "string" && workflow.key.length > 0
75
+ ? workflow.key
76
+ : input.fileStem;
77
+ if (isReservedKey(key))
78
+ return null;
79
+ // safeJsonParse throws on invalid JSON in a schema string — let it bubble.
80
+ const inputSchema = safeJsonParse(workflow.inputSchema);
81
+ const outputSchema = safeJsonParse(workflow.outputSchema);
82
+ const inputTypeName = workflowInputTypeName(key);
83
+ const outputTypeName = workflowOutputTypeName(key);
84
+ return {
85
+ key,
86
+ syncCallable: workflow.syncCallable === true,
87
+ inputTypeName,
88
+ outputTypeName,
89
+ factoryName: workflowFactoryName(key),
90
+ inputDecl: renderTypeDecl(inputTypeName, inputSchema),
91
+ outputDecl: renderTypeDecl(outputTypeName, outputSchema),
92
+ // `input` is required iff the schema rejects the client's `{}` fallback.
93
+ // A schema-less workflow (`undefined`) accepts anything → optional.
94
+ inputRequired: inputSchema !== undefined && schemaRejectsEmptyObject(inputSchema),
95
+ };
96
+ }
97
+ /** Render the typed invoker factory for one workflow. */
98
+ function renderFactory(wf) {
99
+ const keyLiteral = JSON.stringify(wf.key);
100
+ const inputMember = wf.inputRequired
101
+ ? `input: ${wf.inputTypeName}`
102
+ : `input?: ${wf.inputTypeName}`;
103
+ const lines = [
104
+ `export function ${wf.factoryName}(client: JsBaoClient) {`,
105
+ ` return {`,
106
+ ];
107
+ // Spread `opts` FIRST, then set `workflowKey` LAST, so the factory's intended
108
+ // key always wins. `Omit<..., "workflowKey">` only rejects an excess
109
+ // `workflowKey` on object literals; a caller passing an options *variable*
110
+ // carrying an extra `workflowKey` (or any untyped JS caller) would otherwise
111
+ // override the key and invoke the wrong workflow if the spread came last.
112
+ if (wf.syncCallable) {
113
+ lines.push(` runSync: (\n` +
114
+ ` opts: { ${inputMember} } & Omit<RunSyncWorkflowOptions, "workflowKey" | "input">\n` +
115
+ ` ) =>\n` +
116
+ ` client.workflows.runSync<${wf.inputTypeName}, ${wf.outputTypeName}>({\n` +
117
+ ` ...opts,\n` +
118
+ ` workflowKey: ${keyLiteral},\n` +
119
+ ` }),`);
120
+ }
121
+ lines.push(` start: (\n` +
122
+ ` opts: { ${inputMember} } & Omit<StartWorkflowOptions, "workflowKey" | "input">\n` +
123
+ ` ) =>\n` +
124
+ ` client.workflows.start<${wf.inputTypeName}>({\n` +
125
+ ` ...opts,\n` +
126
+ ` workflowKey: ${keyLiteral},\n` +
127
+ ` }),`);
128
+ lines.push(` };`, `}`);
129
+ return lines.join("\n");
130
+ }
131
+ /**
132
+ * Render the full `<key>.generated.ts` content for a single workflow TOML input.
133
+ * Returns null for a reserved (`__internal.*`) workflow. Pure — exported so
134
+ * tests can assert on the string directly.
135
+ */
136
+ export function renderWorkflowFile(input) {
137
+ const wf = parseWorkflow(input);
138
+ if (!wf)
139
+ return null;
140
+ const fingerprint = fingerprintToml(input.tomlContent);
141
+ // Only import the option types actually referenced, so the generated file
142
+ // compiles under a consumer's `noUnusedLocals`.
143
+ const imports = ["JsBaoClient", "StartWorkflowOptions"];
144
+ if (wf.syncCallable)
145
+ imports.push("RunSyncWorkflowOptions");
146
+ imports.sort();
147
+ const blocks = [];
148
+ blocks.push([
149
+ `// AUTO-GENERATED FROM workflows/${wf.key}.toml — DO NOT EDIT.`,
150
+ "// Run `primitive workflows codegen` to regenerate.",
151
+ `// fingerprint: ${fingerprint}`,
152
+ ].join("\n"));
153
+ blocks.push(`import type {\n${imports
154
+ .map((i) => ` ${i},`)
155
+ .join("\n")}\n} from "${CLIENT_PACKAGE}";`);
156
+ blocks.push(wf.inputDecl);
157
+ blocks.push(wf.outputDecl);
158
+ blocks.push(renderFactory(wf));
159
+ return { key: wf.key, content: blocks.join("\n\n") + "\n" };
160
+ }
161
+ /**
162
+ * Run workflow codegen end-to-end. One `<key>.generated.ts` per workflow;
163
+ * delegates the disk lifecycle to the shared writer/checker, exactly like
164
+ * `databases codegen`.
165
+ */
166
+ export async function generateWorkflowTypes(options) {
167
+ const outAbs = path.resolve(options.outputDir);
168
+ const filesToWrite = new Map();
169
+ for (const input of options.inputs) {
170
+ const rendered = renderWorkflowFile(input);
171
+ if (!rendered)
172
+ continue; // reserved workflow — no file
173
+ const filePath = path.join(outAbs, `${rendered.key}${GENERATED_FILE_SUFFIX}`);
174
+ filesToWrite.set(filePath, rendered.content);
175
+ }
176
+ return await writeOrCheckGeneratedFiles({
177
+ outputDir: outAbs,
178
+ filesToWrite,
179
+ check: options.check,
180
+ // A single-workflow filter run owns only a subset of the generated files,
181
+ // so orphan cleanup / stale detection must be scoped to the filtered file.
182
+ fullOwnership: options.singleWorkflow !== true,
183
+ generatedSuffix: GENERATED_FILE_SUFFIX,
184
+ });
185
+ }
186
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/lib/workflow-codegen/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Identifier-naming helpers for `workflows codegen` (issue #1442).
3
+ *
4
+ * Workflow keys resolve case-insensitively server-side and may contain
5
+ * characters that aren't valid TS identifiers (`.`, `-`). Only the emitted
6
+ * identifiers are sanitized — the runtime call always passes the ORIGINAL key
7
+ * string.
8
+ *
9
+ * Type names: `pascalCase(key) + "Input" | "Output"` (reuses `pascalCase` from
10
+ * the database codegen so the two commands share one PascalCase rule).
11
+ * Factory property: a camelCase form of the key.
12
+ */
13
+ /**
14
+ * `create-checkout-session` / `createCheckoutSession` → `CreateCheckoutSession`.
15
+ * A digit-leading key (`123-job` → `_123Job`) is prefixed with `_` so the
16
+ * emitted type name is a valid TS identifier.
17
+ */
18
+ export declare function workflowTypeBaseName(key: string): string;
19
+ /** PascalCase base + `Input` (e.g. `CreateCheckoutSessionInput`). */
20
+ export declare function workflowInputTypeName(key: string): string;
21
+ /** PascalCase base + `Output` (e.g. `CreateCheckoutSessionOutput`). */
22
+ export declare function workflowOutputTypeName(key: string): string;
23
+ /**
24
+ * camelCase factory function name for a workflow key: PascalCase, then lowercase
25
+ * the first character (`create-checkout-session` → `createCheckoutSession`,
26
+ * `refresh-sheet` → `refreshSheet`). Used as the top-level exported factory
27
+ * function name in the per-workflow generated file, so it must be a legal
28
+ * function identifier: a digit-leading key (`123-job` → `_123Job`) is
29
+ * underscore-prefixed, and a key that lands on a JS reserved word (`delete`,
30
+ * `new`, `import`) is underscore-suffixed (`delete_`). Only the emitted
31
+ * identifier changes; the runtime call still passes the ORIGINAL key string.
32
+ */
33
+ export declare function workflowFactoryName(key: string): string;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Identifier-naming helpers for `workflows codegen` (issue #1442).
3
+ *
4
+ * Workflow keys resolve case-insensitively server-side and may contain
5
+ * characters that aren't valid TS identifiers (`.`, `-`). Only the emitted
6
+ * identifiers are sanitized — the runtime call always passes the ORIGINAL key
7
+ * string.
8
+ *
9
+ * Type names: `pascalCase(key) + "Input" | "Output"` (reuses `pascalCase` from
10
+ * the database codegen so the two commands share one PascalCase rule).
11
+ * Factory property: a camelCase form of the key.
12
+ */
13
+ import { pascalCase } from "../db-codegen/dbNaming.js";
14
+ /**
15
+ * Ensure an identifier is a valid TS identifier start. The server accepts
16
+ * workflow keys matching `^[a-z0-9][a-z0-9-_]{2,}$`, so a digit-leading key
17
+ * like `123-job` PascalCases to `123Job` — not a legal TS type name or
18
+ * unquoted object property, since identifiers can't start with a digit.
19
+ * Prefix an underscore in that case (`123Job` → `_123Job`). Only the emitted
20
+ * identifier changes; the runtime call still passes the ORIGINAL key string.
21
+ */
22
+ function ensureValidIdentifierStart(name) {
23
+ const first = name.charAt(0);
24
+ if (first >= "0" && first <= "9") {
25
+ return `_${name}`;
26
+ }
27
+ return name;
28
+ }
29
+ /**
30
+ * `create-checkout-session` / `createCheckoutSession` → `CreateCheckoutSession`.
31
+ * A digit-leading key (`123-job` → `_123Job`) is prefixed with `_` so the
32
+ * emitted type name is a valid TS identifier.
33
+ */
34
+ export function workflowTypeBaseName(key) {
35
+ return ensureValidIdentifierStart(pascalCase(key));
36
+ }
37
+ /** PascalCase base + `Input` (e.g. `CreateCheckoutSessionInput`). */
38
+ export function workflowInputTypeName(key) {
39
+ return `${workflowTypeBaseName(key)}Input`;
40
+ }
41
+ /** PascalCase base + `Output` (e.g. `CreateCheckoutSessionOutput`). */
42
+ export function workflowOutputTypeName(key) {
43
+ return `${workflowTypeBaseName(key)}Output`;
44
+ }
45
+ /**
46
+ * Reserved words that cannot be used as a bare `function <name>` declaration.
47
+ * The per-workflow factory is now a top-level exported function (not an
48
+ * object-literal property), so a key that camelCases to one of these must be
49
+ * escaped or `export function delete(client) {}` is a syntax error. Covers ES
50
+ * reserved words plus the strict-mode/future set — a workflow key resolves case
51
+ * -insensitively and matches `^[a-z0-9][a-z0-9-_]{2,}$`, so only the lowercase
52
+ * single-word forms can actually collide.
53
+ */
54
+ const RESERVED_WORDS = new Set([
55
+ "break", "case", "catch", "class", "const", "continue", "debugger",
56
+ "default", "delete", "do", "else", "enum", "export", "extends", "false",
57
+ "finally", "for", "function", "if", "import", "in", "instanceof", "new",
58
+ "null", "return", "super", "switch", "this", "throw", "true", "try",
59
+ "typeof", "var", "void", "while", "with", "yield", "let", "static",
60
+ "implements", "interface", "package", "private", "protected", "public",
61
+ "await",
62
+ ]);
63
+ /**
64
+ * camelCase factory function name for a workflow key: PascalCase, then lowercase
65
+ * the first character (`create-checkout-session` → `createCheckoutSession`,
66
+ * `refresh-sheet` → `refreshSheet`). Used as the top-level exported factory
67
+ * function name in the per-workflow generated file, so it must be a legal
68
+ * function identifier: a digit-leading key (`123-job` → `_123Job`) is
69
+ * underscore-prefixed, and a key that lands on a JS reserved word (`delete`,
70
+ * `new`, `import`) is underscore-suffixed (`delete_`). Only the emitted
71
+ * identifier changes; the runtime call still passes the ORIGINAL key string.
72
+ */
73
+ export function workflowFactoryName(key) {
74
+ const pascal = pascalCase(key);
75
+ if (pascal.length === 0)
76
+ return pascal;
77
+ const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1);
78
+ const safeStart = ensureValidIdentifierStart(camel);
79
+ return RESERVED_WORDS.has(safeStart) ? `${safeStart}_` : safeStart;
80
+ }
81
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../src/lib/workflow-codegen/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;;;;;GAOG;AACH,SAAS,0BAA0B,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACjC,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,0BAA0B,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU;IAClE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO;IACvE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK;IACvE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;IACnE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;IAClE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ;IACtE,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * JSON-Schema → TypeScript converter for `workflows codegen` (issue #1442).
3
+ *
4
+ * Workflow `inputSchema`/`outputSchema` are real JSON Schema. This converter
5
+ * types only the subset the server's validator descends into — and it reads
6
+ * that interpretation from the SAME descriptor the server validator consumes,
7
+ * vendored into the CLI as `generated-schema-descriptor.ts` (a byte copy of
8
+ * `src/workflows/schema-descriptor.ts`, kept fresh by
9
+ * `cli/scripts/gen-workflow-schema-descriptor.mjs` + its drift guard). So the
10
+ * generated type and the runtime validation can never disagree on:
11
+ *
12
+ * - `type` single scalar (`string`/`number`/`integer`/`boolean`/`null`) →
13
+ * the mapped TS scalar.
14
+ * - `type` array-union — only when every member is a scalar/`null` → a TS
15
+ * union. A union that contains `object` or `array` renders `unknown`,
16
+ * because the server only walks `properties`/`items` for the bare string
17
+ * `"object"`/`"array"` — a union is never descended, so a precise-looking
18
+ * type would over-promise.
19
+ * - `enum` → a scalar-literal union, intersected with the declared `type`
20
+ * first (the server gates on `type` before checking `enum`).
21
+ * - `type: "object"` with `properties` → a nested object type; `required[]`
22
+ * drives `name:` vs `name?:`. An OPEN object (no `additionalProperties:
23
+ * false`) also emits `[key: string]: unknown` so extra keys the runtime
24
+ * validator accepts don't hit TS excess-property errors; a CLOSED object
25
+ * (`additionalProperties: false`) omits the index signature.
26
+ * - `type: "array"` with `items` → `T[]`.
27
+ *
28
+ * Everything the server ignores (`$ref`, `oneOf`/`anyOf`/`allOf`, `format`,
29
+ * `patternProperties`, numeric constraints, tuple `items`) renders `unknown`.
30
+ *
31
+ * Errors are NOT swallowed here — a malformed schema fails upstream at parse
32
+ * time; this walker only sees an already-parsed schema and returns `unknown`
33
+ * for anything it does not recognize.
34
+ */
35
+ /**
36
+ * Convert a parsed JSON Schema node to a TypeScript type expression. Object
37
+ * types render multi-line (2-space indent per level); everything else renders
38
+ * on a single line. `indent` is the current indentation depth.
39
+ */
40
+ export declare function schemaToTsType(schema: any, indent?: number): string;
41
+ /**
42
+ * True when the schema REJECTS an empty object `{}` — i.e. the client's
43
+ * `rootInput: options.input ?? {}` fallback would fail validation, so `input`
44
+ * must be a compile-time-required option (issue #1442, P4). Derived from the
45
+ * shared descriptor so it matches the server validator exactly:
46
+ *
47
+ * - a declared top-level `type` that `{}` does not satisfy (anything but
48
+ * `object`, e.g. `string`/`array`, or a union with no `object` arm);
49
+ * - a top-level `enum` (a fresh `{}` is never an enum member);
50
+ * - `type: "object"` with a non-empty `required[]` (a missing required key).
51
+ *
52
+ * An all-optional object schema, or a schema with no top-level constraints,
53
+ * accepts `{}` → `input` is optional.
54
+ */
55
+ export declare function schemaRejectsEmptyObject(schema: any): boolean;
@@ -0,0 +1,237 @@
1
+ /**
2
+ * JSON-Schema → TypeScript converter for `workflows codegen` (issue #1442).
3
+ *
4
+ * Workflow `inputSchema`/`outputSchema` are real JSON Schema. This converter
5
+ * types only the subset the server's validator descends into — and it reads
6
+ * that interpretation from the SAME descriptor the server validator consumes,
7
+ * vendored into the CLI as `generated-schema-descriptor.ts` (a byte copy of
8
+ * `src/workflows/schema-descriptor.ts`, kept fresh by
9
+ * `cli/scripts/gen-workflow-schema-descriptor.mjs` + its drift guard). So the
10
+ * generated type and the runtime validation can never disagree on:
11
+ *
12
+ * - `type` single scalar (`string`/`number`/`integer`/`boolean`/`null`) →
13
+ * the mapped TS scalar.
14
+ * - `type` array-union — only when every member is a scalar/`null` → a TS
15
+ * union. A union that contains `object` or `array` renders `unknown`,
16
+ * because the server only walks `properties`/`items` for the bare string
17
+ * `"object"`/`"array"` — a union is never descended, so a precise-looking
18
+ * type would over-promise.
19
+ * - `enum` → a scalar-literal union, intersected with the declared `type`
20
+ * first (the server gates on `type` before checking `enum`).
21
+ * - `type: "object"` with `properties` → a nested object type; `required[]`
22
+ * drives `name:` vs `name?:`. An OPEN object (no `additionalProperties:
23
+ * false`) also emits `[key: string]: unknown` so extra keys the runtime
24
+ * validator accepts don't hit TS excess-property errors; a CLOSED object
25
+ * (`additionalProperties: false`) omits the index signature.
26
+ * - `type: "array"` with `items` → `T[]`.
27
+ *
28
+ * Everything the server ignores (`$ref`, `oneOf`/`anyOf`/`allOf`, `format`,
29
+ * `patternProperties`, numeric constraints, tuple `items`) renders `unknown`.
30
+ *
31
+ * Errors are NOT swallowed here — a malformed schema fails upstream at parse
32
+ * time; this walker only sees an already-parsed schema and returns `unknown`
33
+ * for anything it does not recognize.
34
+ */
35
+ import { describeSchema, isType, } from "./generated-schema-descriptor.js";
36
+ /** Scalar JSON-schema types this converter maps to a concrete TS scalar. */
37
+ const SCALAR_TS = {
38
+ string: "string",
39
+ number: "number",
40
+ integer: "number",
41
+ boolean: "boolean",
42
+ null: "null",
43
+ };
44
+ /** A shared empty-object reference for the `{}`-rejection probe below. */
45
+ const EMPTY_OBJECT = Object.freeze({});
46
+ /**
47
+ * Render a scalar-literal union from an `enum` array. `JSON.stringify` emits a
48
+ * valid TS literal for a string, number, boolean, or `null`. An object/array
49
+ * member has no TS literal form, so the whole enum falls back to `unknown`
50
+ * (returns `null` here).
51
+ */
52
+ function tsUnionFromScalarEnum(values) {
53
+ if (!Array.isArray(values) || values.length === 0)
54
+ return null;
55
+ const literals = [];
56
+ const seen = new Set();
57
+ for (const v of values) {
58
+ if (v !== null && (typeof v === "object" || Array.isArray(v))) {
59
+ // Objects/arrays are not representable as TS literals.
60
+ return null;
61
+ }
62
+ const literal = JSON.stringify(v);
63
+ if (literal === undefined)
64
+ return null; // e.g. `undefined` in the enum
65
+ if (!seen.has(literal)) {
66
+ seen.add(literal);
67
+ literals.push(literal);
68
+ }
69
+ }
70
+ return literals.length > 0 ? literals.join(" | ") : null;
71
+ }
72
+ /** True when a rendered type is a bare identifier safe to suffix with `[]`. */
73
+ function isSimpleTypeExpr(expr) {
74
+ return /^[A-Za-z0-9_.]+(\[\])*$/.test(expr);
75
+ }
76
+ /**
77
+ * Convert a parsed JSON Schema node to a TypeScript type expression. Object
78
+ * types render multi-line (2-space indent per level); everything else renders
79
+ * on a single line. `indent` is the current indentation depth.
80
+ */
81
+ export function schemaToTsType(schema, indent = 0) {
82
+ const d = describeSchema(schema);
83
+ // `enum` is the most specific constraint — the server checks it AFTER the
84
+ // type gate, so when both are present only the enum members that satisfy the
85
+ // declared type(s) are reachable. Emit just those (intersect with `type`
86
+ // via the shared `isType`). If the type filter leaves nothing representable,
87
+ // fall through to plain `type` rendering rather than over-promising.
88
+ if (d.enumValues) {
89
+ const allowedTypes = d.types;
90
+ const candidates = allowedTypes.length > 0
91
+ ? d.enumValues.filter((v) => allowedTypes.some((t) => isType(v, t)))
92
+ : d.enumValues;
93
+ if (candidates.length === 0) {
94
+ // No enum member satisfies the declared type gate (or the enum is empty),
95
+ // so the runtime rejects EVERY value: the type gate lets some values
96
+ // through, then `enum.includes(value)` fails them all. The reachable set
97
+ // is empty → an uninhabitable `never`. Widening to the declared type here
98
+ // (e.g. `{type:"string", enum:[1]}` → `string`) would let typed callers
99
+ // pass values the server always rejects.
100
+ return "never";
101
+ }
102
+ const union = tsUnionFromScalarEnum(candidates);
103
+ if (union !== null)
104
+ return union;
105
+ // Candidates survive the type gate but aren't representable as TS literals
106
+ // (object/array enum members). With no declared type there is nothing to
107
+ // fall back on → `unknown`; otherwise fall through to plain `type`.
108
+ if (allowedTypes.length === 0)
109
+ return "unknown";
110
+ }
111
+ // Array-union type (e.g. `["string", "null"]`). Only scalar/null members get
112
+ // a precise union — the server never descends `properties`/`items` for a
113
+ // union, so an object/array member forces `unknown`.
114
+ if (d.isUnion) {
115
+ const parts = [];
116
+ const seen = new Set();
117
+ for (const t of d.types) {
118
+ const mapped = SCALAR_TS[t];
119
+ if (mapped === undefined)
120
+ return "unknown"; // object/array/unknown member
121
+ if (!seen.has(mapped)) {
122
+ seen.add(mapped);
123
+ parts.push(mapped);
124
+ }
125
+ }
126
+ return parts.length > 0 ? parts.join(" | ") : "unknown";
127
+ }
128
+ if (d.singularType === null) {
129
+ // No usable single type and no enum — the server enforces nothing.
130
+ return "unknown";
131
+ }
132
+ // Object: the server walks `properties`/`required` ONLY when the type is
133
+ // exactly `"object"`. `d.object` is non-null only in that case with declared
134
+ // properties; a typed object with no properties is open → Record.
135
+ if (d.singularType === "object") {
136
+ if (d.object)
137
+ return renderObjectType(d.object, indent);
138
+ return "Record<string, unknown>";
139
+ }
140
+ // Array: the server walks `items` ONLY when the type is exactly `"array"`.
141
+ if (d.singularType === "array") {
142
+ const items = d.array ? d.array.items : undefined;
143
+ // Missing or tuple `items` (an array of schemas) is ignored → unknown[].
144
+ if (!items || typeof items !== "object" || Array.isArray(items)) {
145
+ return "unknown[]";
146
+ }
147
+ const elem = schemaToTsType(items, indent);
148
+ return isSimpleTypeExpr(elem) ? `${elem}[]` : `(${elem})[]`;
149
+ }
150
+ // Single scalar type.
151
+ const scalar = SCALAR_TS[d.singularType];
152
+ return scalar ?? "unknown";
153
+ }
154
+ /**
155
+ * Render an object descriptor (`describeSchema(...).object`) as a TS object
156
+ * type. `required[]` drives optionality. An OPEN object (not
157
+ * `additionalProperties: false`) emits `[key: string]: unknown` so extra keys
158
+ * the runtime accepts don't trip TS excess-property checks; a CLOSED object
159
+ * omits it.
160
+ */
161
+ function renderObjectType(objectDesc, indent) {
162
+ const { properties, required, additionalPropertiesClosed } = objectDesc;
163
+ const propNames = Object.keys(properties);
164
+ const requiredSet = new Set(Array.isArray(required)
165
+ ? required.filter((k) => typeof k === "string")
166
+ : []);
167
+ const pad = " ".repeat(indent + 1);
168
+ const closePad = " ".repeat(indent);
169
+ const propNameSet = new Set(propNames);
170
+ const lines = ["{"];
171
+ for (const name of propNames) {
172
+ const childType = schemaToTsType(properties[name], indent + 1);
173
+ const optional = requiredSet.has(name) ? "" : "?";
174
+ lines.push(`${pad}${quotePropIfNeeded(name)}${optional}: ${childType};`);
175
+ }
176
+ // A key listed in `required` but absent from `properties` has no declared
177
+ // child schema, yet the validator still rejects an object missing it. Emit it
178
+ // as a required `unknown` member so the generated type demands the key too —
179
+ // otherwise `{properties:{}, required:["id"]}` would accept `{}`, which the
180
+ // runtime rejects.
181
+ for (const name of requiredSet) {
182
+ if (!propNameSet.has(name)) {
183
+ lines.push(`${pad}${quotePropIfNeeded(name)}: unknown;`);
184
+ }
185
+ }
186
+ // Open objects accept extra keys at runtime; model that with an index
187
+ // signature so a call site passing an unlisted key still compiles.
188
+ if (!additionalPropertiesClosed) {
189
+ lines.push(`${pad}[key: string]: unknown;`);
190
+ }
191
+ lines.push(`${closePad}}`);
192
+ return lines.join("\n");
193
+ }
194
+ /**
195
+ * Quote an object-property name when it is not a plain identifier (so keys with
196
+ * hyphens, dots, or other characters render as valid TS).
197
+ */
198
+ function quotePropIfNeeded(name) {
199
+ if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name))
200
+ return name;
201
+ return JSON.stringify(name);
202
+ }
203
+ /**
204
+ * True when the schema REJECTS an empty object `{}` — i.e. the client's
205
+ * `rootInput: options.input ?? {}` fallback would fail validation, so `input`
206
+ * must be a compile-time-required option (issue #1442, P4). Derived from the
207
+ * shared descriptor so it matches the server validator exactly:
208
+ *
209
+ * - a declared top-level `type` that `{}` does not satisfy (anything but
210
+ * `object`, e.g. `string`/`array`, or a union with no `object` arm);
211
+ * - a top-level `enum` (a fresh `{}` is never an enum member);
212
+ * - `type: "object"` with a non-empty `required[]` (a missing required key).
213
+ *
214
+ * An all-optional object schema, or a schema with no top-level constraints,
215
+ * accepts `{}` → `input` is optional.
216
+ */
217
+ export function schemaRejectsEmptyObject(schema) {
218
+ const d = describeSchema(schema);
219
+ // 1. Type gate: `{}` must satisfy at least one declared type.
220
+ if (d.types.length && !d.types.some((t) => isType(EMPTY_OBJECT, t))) {
221
+ return true;
222
+ }
223
+ // 2. Enum gate: a JSON enum never contains a value reference-equal to `{}`,
224
+ // so any enum rejects it (mirrors `enum.includes(value)` at runtime).
225
+ if (d.enumValues && !d.enumValues.includes(EMPTY_OBJECT)) {
226
+ return true;
227
+ }
228
+ // 3. Object required: any required key is absent from `{}`.
229
+ if (d.object) {
230
+ for (const key of d.object.required) {
231
+ if (!(key in EMPTY_OBJECT))
232
+ return true;
233
+ }
234
+ }
235
+ return false;
236
+ }
237
+ //# sourceMappingURL=schemaToTs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaToTs.js","sourceRoot":"","sources":["../../../../src/lib/workflow-codegen/schemaToTs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primitive-admin",
3
- "version": "1.1.0-alpha.44",
3
+ "version": "1.1.0-alpha.45",
4
4
  "description": "CLI for administering Primitive applications",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,7 +20,9 @@
20
20
  "scripts": {
21
21
  "gen:allowlist": "node scripts/gen-allowlist.mjs",
22
22
  "gen:allowlist:check": "node scripts/gen-allowlist.mjs --check",
23
- "prebuild": "node scripts/gen-allowlist.mjs",
23
+ "gen:workflow-descriptor": "node scripts/gen-workflow-schema-descriptor.mjs",
24
+ "gen:workflow-descriptor:check": "node scripts/gen-workflow-schema-descriptor.mjs --check",
25
+ "prebuild": "node scripts/gen-allowlist.mjs && node scripts/gen-workflow-schema-descriptor.mjs",
24
26
  "build": "tsc",
25
27
  "typecheck": "tsc --noEmit",
26
28
  "prepublishOnly": "pnpm run build",