primitive-admin 1.0.53 → 1.0.54

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 (133) hide show
  1. package/README.md +38 -10
  2. package/dist/bin/primitive.js +6 -0
  3. package/dist/bin/primitive.js.map +1 -1
  4. package/dist/src/commands/auth.js +16 -6
  5. package/dist/src/commands/auth.js.map +1 -1
  6. package/dist/src/commands/blob-buckets.js +84 -7
  7. package/dist/src/commands/blob-buckets.js.map +1 -1
  8. package/dist/src/commands/catalog.js +3 -3
  9. package/dist/src/commands/catalog.js.map +1 -1
  10. package/dist/src/commands/collections.js +12 -9
  11. package/dist/src/commands/collections.js.map +1 -1
  12. package/dist/src/commands/databases.js +191 -74
  13. package/dist/src/commands/databases.js.map +1 -1
  14. package/dist/src/commands/group-type-configs.js +1 -9
  15. package/dist/src/commands/group-type-configs.js.map +1 -1
  16. package/dist/src/commands/groups.js +12 -6
  17. package/dist/src/commands/groups.js.map +1 -1
  18. package/dist/src/commands/guides.d.ts +161 -0
  19. package/dist/src/commands/guides.js +502 -84
  20. package/dist/src/commands/guides.js.map +1 -1
  21. package/dist/src/commands/integrations.js +2 -2
  22. package/dist/src/commands/integrations.js.map +1 -1
  23. package/dist/src/commands/metadata.d.ts +2 -0
  24. package/dist/src/commands/metadata.js +344 -0
  25. package/dist/src/commands/metadata.js.map +1 -0
  26. package/dist/src/commands/prompts.js +2 -2
  27. package/dist/src/commands/prompts.js.map +1 -1
  28. package/dist/src/commands/rule-sets.d.ts +1 -0
  29. package/dist/src/commands/rule-sets.js +25 -3
  30. package/dist/src/commands/rule-sets.js.map +1 -1
  31. package/dist/src/commands/scripts.d.ts +2 -0
  32. package/dist/src/commands/scripts.js +667 -0
  33. package/dist/src/commands/scripts.js.map +1 -0
  34. package/dist/src/commands/sync.d.ts +189 -9
  35. package/dist/src/commands/sync.js +1418 -256
  36. package/dist/src/commands/sync.js.map +1 -1
  37. package/dist/src/commands/vars.d.ts +8 -0
  38. package/dist/src/commands/vars.js +110 -0
  39. package/dist/src/commands/vars.js.map +1 -0
  40. package/dist/src/commands/webhooks.js +17 -3
  41. package/dist/src/commands/webhooks.js.map +1 -1
  42. package/dist/src/commands/workflows.d.ts +30 -0
  43. package/dist/src/commands/workflows.js +645 -59
  44. package/dist/src/commands/workflows.js.map +1 -1
  45. package/dist/src/lib/api-client.d.ts +120 -18
  46. package/dist/src/lib/api-client.js +125 -2
  47. package/dist/src/lib/api-client.js.map +1 -1
  48. package/dist/src/lib/batch.d.ts +26 -0
  49. package/dist/src/lib/batch.js +32 -0
  50. package/dist/src/lib/batch.js.map +1 -0
  51. package/dist/src/lib/block-layout.d.ts +160 -0
  52. package/dist/src/lib/block-layout.js +451 -0
  53. package/dist/src/lib/block-layout.js.map +1 -0
  54. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +61 -0
  55. package/dist/src/lib/codegen-shared/generatedFiles.js +127 -0
  56. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  57. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
  58. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
  59. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  60. package/dist/src/lib/config-toml.d.ts +10 -0
  61. package/dist/src/lib/config-toml.js +42 -0
  62. package/dist/src/lib/config-toml.js.map +1 -0
  63. package/dist/src/lib/config.d.ts +16 -0
  64. package/dist/src/lib/config.js +41 -0
  65. package/dist/src/lib/config.js.map +1 -1
  66. package/dist/src/lib/constants.d.ts +9 -0
  67. package/dist/src/lib/constants.js +9 -0
  68. package/dist/src/lib/constants.js.map +1 -1
  69. package/dist/src/lib/csv.d.ts +1 -2
  70. package/dist/src/lib/csv.js +3 -8
  71. package/dist/src/lib/csv.js.map +1 -1
  72. package/dist/src/lib/db-codegen/dbGenerator.d.ts +35 -7
  73. package/dist/src/lib/db-codegen/dbGenerator.js +384 -125
  74. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -1
  75. package/dist/src/lib/db-codegen/dbNaming.d.ts +29 -0
  76. package/dist/src/lib/db-codegen/dbNaming.js +58 -0
  77. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -1
  78. package/dist/src/lib/db-codegen/dbTemplates.d.ts +114 -5
  79. package/dist/src/lib/db-codegen/dbTemplates.js +163 -16
  80. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  81. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +7 -3
  82. package/dist/src/lib/db-codegen/dbTsTypes.js +23 -1
  83. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
  84. package/dist/src/lib/generated-allowlist.js +43 -0
  85. package/dist/src/lib/generated-allowlist.js.map +1 -1
  86. package/dist/src/lib/init-config.js +2 -2
  87. package/dist/src/lib/init-config.js.map +1 -1
  88. package/dist/src/lib/output.d.ts +25 -5
  89. package/dist/src/lib/output.js +32 -4
  90. package/dist/src/lib/output.js.map +1 -1
  91. package/dist/src/lib/query-operators.d.ts +43 -0
  92. package/dist/src/lib/query-operators.js +80 -0
  93. package/dist/src/lib/query-operators.js.map +1 -0
  94. package/dist/src/lib/toml-database-config.d.ts +10 -19
  95. package/dist/src/lib/toml-database-config.js +28 -59
  96. package/dist/src/lib/toml-database-config.js.map +1 -1
  97. package/dist/src/lib/toml-metadata-config.d.ts +147 -0
  98. package/dist/src/lib/toml-metadata-config.js +463 -0
  99. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  100. package/dist/src/lib/toml-native-form.d.ts +46 -0
  101. package/dist/src/lib/toml-native-form.js +78 -0
  102. package/dist/src/lib/toml-native-form.js.map +1 -0
  103. package/dist/src/lib/toml-params-validator.d.ts +34 -0
  104. package/dist/src/lib/toml-params-validator.js +118 -3
  105. package/dist/src/lib/toml-params-validator.js.map +1 -1
  106. package/dist/src/lib/workflow-apply.d.ts +86 -0
  107. package/dist/src/lib/workflow-apply.js +127 -0
  108. package/dist/src/lib/workflow-apply.js.map +1 -0
  109. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  110. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  111. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  112. package/dist/src/lib/workflow-codegen/generator.d.ts +74 -0
  113. package/dist/src/lib/workflow-codegen/generator.js +215 -0
  114. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  115. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  116. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  117. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  118. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +64 -0
  119. package/dist/src/lib/workflow-codegen/schemaToTs.js +282 -0
  120. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  121. package/dist/src/lib/workflow-fragments.js +3 -3
  122. package/dist/src/lib/workflow-fragments.js.map +1 -1
  123. package/dist/src/lib/workflow-payload.d.ts +68 -0
  124. package/dist/src/lib/workflow-payload.js +150 -0
  125. package/dist/src/lib/workflow-payload.js.map +1 -0
  126. package/dist/src/lib/workflow-toml-validator.d.ts +1 -1
  127. package/dist/src/lib/workflow-toml-validator.js +37 -1
  128. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  129. package/dist/src/types/index.d.ts +11 -0
  130. package/dist/src/validators.d.ts +4 -3
  131. package/dist/src/validators.js +6 -5
  132. package/dist/src/validators.js.map +1 -1
  133. package/package.json +5 -3
@@ -29,6 +29,35 @@ export declare function resolveRecordInterfaceName(modelName: string, classNameO
29
29
  export declare function opParamsInterfaceName(opName: string): string;
30
30
  /** `saveAccount` → `SaveAccountResult`. */
31
31
  export declare function opResultAliasName(opName: string): string;
32
+ /**
33
+ * Name of the generated typed-operations factory for a database type (#1441).
34
+ * `securities-ref` → `securitiesRefOps`, `portfolio` → `portfolioOps`. A type
35
+ * whose camelCased name would start with a digit (e.g. `2fa`) gets a leading
36
+ * `_` so the emitted `export function` name is a valid JS identifier.
37
+ */
38
+ export declare function opsFactoryName(databaseType: string): string;
39
+ /**
40
+ * camelCase an identifier: splits on non-alphanumeric separators, lower-cases
41
+ * the first segment's first char and PascalCases the rest
42
+ * (`securities-ref` → `securitiesRef`, `save_account` → `saveAccount`). Existing
43
+ * internal casing after the first char is preserved.
44
+ */
45
+ export declare function camelCase(name: string): string;
46
+ /**
47
+ * Render an operation name as an object-literal property key (#1441). A name
48
+ * that is a plain, non-reserved JS identifier is emitted bare (`getX:`);
49
+ * anything else — a hyphen, a leading digit, or a reserved word — is emitted as
50
+ * a quoted key (`"get-x":`, `"delete":`) so the factory stays valid TypeScript.
51
+ * The op-name string passed to `executeOperation` is always the exact original
52
+ * name.
53
+ *
54
+ * `__proto__` is a special case. The factory return value is a *runtime* object
55
+ * literal, and in that position both the bare `__proto__:` form AND the quoted
56
+ * `"__proto__":` form set the object's prototype instead of defining an own
57
+ * method — silently dropping that operation. Only a computed key
58
+ * (`["__proto__"]:`) defines a normal own property, so emit that form.
59
+ */
60
+ export declare function opPropertyKey(opName: string): string;
32
61
  /**
33
62
  * Convert a snake_case plural model name (`user_prefs`, `categories`) into a
34
63
  * PascalCase singular interface name (`UserPref`, `Category`). Returns null
@@ -43,6 +43,64 @@ export function opParamsInterfaceName(opName) {
43
43
  export function opResultAliasName(opName) {
44
44
  return `${pascalCase(opName)}Result`;
45
45
  }
46
+ /**
47
+ * Name of the generated typed-operations factory for a database type (#1441).
48
+ * `securities-ref` → `securitiesRefOps`, `portfolio` → `portfolioOps`. A type
49
+ * whose camelCased name would start with a digit (e.g. `2fa`) gets a leading
50
+ * `_` so the emitted `export function` name is a valid JS identifier.
51
+ */
52
+ export function opsFactoryName(databaseType) {
53
+ const base = camelCase(databaseType);
54
+ const safe = /^[0-9]/.test(base) ? `_${base}` : base;
55
+ return `${safe}Ops`;
56
+ }
57
+ /**
58
+ * camelCase an identifier: splits on non-alphanumeric separators, lower-cases
59
+ * the first segment's first char and PascalCases the rest
60
+ * (`securities-ref` → `securitiesRef`, `save_account` → `saveAccount`). Existing
61
+ * internal casing after the first char is preserved.
62
+ */
63
+ export function camelCase(name) {
64
+ const pascal = pascalCase(name);
65
+ if (pascal.length === 0)
66
+ return pascal;
67
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
68
+ }
69
+ /**
70
+ * JS reserved words. Used as object-literal property keys these are actually
71
+ * legal unquoted, but quoting them keeps the generated output unambiguous and
72
+ * matches the "non-identifier op name -> quoted key" behavior (#1441).
73
+ */
74
+ const RESERVED_WORDS = new Set([
75
+ "break", "case", "catch", "class", "const", "continue", "debugger",
76
+ "default", "delete", "do", "else", "enum", "export", "extends", "false",
77
+ "finally", "for", "function", "if", "import", "in", "instanceof", "new",
78
+ "null", "return", "super", "switch", "this", "throw", "true", "try",
79
+ "typeof", "var", "void", "while", "with", "yield", "let", "static",
80
+ "implements", "interface", "package", "private", "protected", "public",
81
+ ]);
82
+ /**
83
+ * Render an operation name as an object-literal property key (#1441). A name
84
+ * that is a plain, non-reserved JS identifier is emitted bare (`getX:`);
85
+ * anything else — a hyphen, a leading digit, or a reserved word — is emitted as
86
+ * a quoted key (`"get-x":`, `"delete":`) so the factory stays valid TypeScript.
87
+ * The op-name string passed to `executeOperation` is always the exact original
88
+ * name.
89
+ *
90
+ * `__proto__` is a special case. The factory return value is a *runtime* object
91
+ * literal, and in that position both the bare `__proto__:` form AND the quoted
92
+ * `"__proto__":` form set the object's prototype instead of defining an own
93
+ * method — silently dropping that operation. Only a computed key
94
+ * (`["__proto__"]:`) defines a normal own property, so emit that form.
95
+ */
96
+ export function opPropertyKey(opName) {
97
+ if (opName === "__proto__")
98
+ return `[${JSON.stringify(opName)}]`;
99
+ const isPlainIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(opName);
100
+ if (isPlainIdentifier && !RESERVED_WORDS.has(opName))
101
+ return opName;
102
+ return JSON.stringify(opName);
103
+ }
46
104
  /**
47
105
  * Convert a snake_case plural model name (`user_prefs`, `categories`) into a
48
106
  * PascalCase singular interface name (`UserPref`, `Category`). Returns null
@@ -1 +1 @@
1
- {"version":3,"file":"dbNaming.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbNaming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dbNaming.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbNaming.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,12 @@
11
11
  * classes — so we emit plain `export interface` types with no class
12
12
  * shell, no barrel registration, and `import type` only.
13
13
  * 2. We add an OPERATIONS half codegen-v2 has no analog for: per-op
14
- * input-params interfaces + per-op result aliases keyed off `op.type`.
14
+ * input-params interfaces + per-op result aliases. The alias for an op
15
+ * is derived from `op.type` AND, where it matters, the op's parsed
16
+ * `definition`: a query op's `projection` (#1439), a mutation op's step
17
+ * kinds (#1438), and a pipeline op's `return` step (#1437). The generator
18
+ * resolves those into the small descriptors below; the templates stay pure
19
+ * string-emitters.
15
20
  */
16
21
  /** A field on a record interface (read shape). */
17
22
  export interface RecordField {
@@ -42,7 +47,7 @@ export interface RenderRecordInterfaceInput {
42
47
  /** One declared param on an op-input interface (write shape). */
43
48
  export interface ParamField {
44
49
  name: string;
45
- /** TOML param type (`string|number|boolean|object`). */
50
+ /** TOML param type (`string|number|boolean|object|array`). */
46
51
  type: string;
47
52
  required: boolean;
48
53
  /**
@@ -51,6 +56,13 @@ export interface ParamField {
51
56
  * renders the union when present and falls back to the base type otherwise.
52
57
  */
53
58
  enum?: string[];
59
+ /**
60
+ * Scalar element type for an `array` param (#1488), either declared
61
+ * (`type = "array"` + `items = "..."`) or inferred from a `$in`/`$nin`
62
+ * binding. Undefined on a non-array param, or on an array whose element type
63
+ * could not be resolved (renders `unknown[]`).
64
+ */
65
+ items?: string;
54
66
  }
55
67
  export interface RenderOpParamsInterfaceInput {
56
68
  /** PascalCase params interface name (e.g. `SaveAccountParams`). */
@@ -59,6 +71,42 @@ export interface RenderOpParamsInterfaceInput {
59
71
  opName: string;
60
72
  params: ParamField[];
61
73
  }
74
+ /**
75
+ * How a query op's static `projection` narrows its record type (#1439). The
76
+ * generator resolves the projection against the model's record fields (guarding
77
+ * unknown / nested keys) and hands the template one of these; the template only
78
+ * assembles the `Pick`/`Partial` string.
79
+ * - `full` → `QueryResult<M>` (no projection, empty `{}`, or no schema).
80
+ * - `pick` → `QueryResult<Pick<M, ...fields>>` (inclusion; `id` folded in).
81
+ * - `partial` → `QueryResult<Partial<M>>` (dynamic / mixed / unknown-key, and
82
+ * exclusion — the DO runtime does not strip excluded fields yet,
83
+ * so an `Omit` would hide fields still returned; #1439/Codex-P2).
84
+ */
85
+ export type ProjectionClassification = {
86
+ kind: "full";
87
+ } | {
88
+ kind: "pick";
89
+ fields: string[];
90
+ } | {
91
+ kind: "partial";
92
+ };
93
+ /**
94
+ * A `pipeline` op's resolved `return` step (#1437). The runtime flattens a
95
+ * returning pipeline to the returned step's shape, so codegen types it as that
96
+ * step's result. `return: "all"`, no `return`, or any step the generator can't
97
+ * resolve fall back to `opaque` → the generic `PipelineResult`.
98
+ */
99
+ export type PipelineReturnDescriptor = {
100
+ kind: "query";
101
+ recordInterfaceName: string | null;
102
+ projection?: ProjectionClassification;
103
+ } | {
104
+ kind: "count";
105
+ } | {
106
+ kind: "aggregate";
107
+ } | {
108
+ kind: "opaque";
109
+ };
62
110
  export interface RenderOpResultAliasInput {
63
111
  /** Per-op result alias name (e.g. `SaveAccountResult`). */
64
112
  aliasName: string;
@@ -72,9 +120,24 @@ export interface RenderOpResultAliasInput {
72
120
  * interface (e.g. pipeline) — falls back to `QueryResult<Record<string, unknown>>`.
73
121
  */
74
122
  recordInterfaceName: string | null;
123
+ /**
124
+ * For `query` ops (#1439), how the op's `projection` narrows the record type.
125
+ * Absent → treated as `full`.
126
+ */
127
+ projection?: ProjectionClassification;
128
+ /**
129
+ * For `pipeline` ops (#1437), the resolved `return`-step descriptor. Absent
130
+ * or `opaque` → the generic `PipelineResult`.
131
+ */
132
+ pipelineReturn?: PipelineReturnDescriptor;
75
133
  }
76
- /** The shared generic result aliases, keyed off `op.type`. */
77
- export declare const RESULT_ALIASES_BLOCK = "// Generic per-op result shapes, keyed off the operation type. The op\n// return contract is NOT stored in the TOML \u2014 these mirror the runtime\n// result shapes produced by the database-operations controller.\n\n/** `query` ops return a page of records. */\nexport interface QueryResult<T = Record<string, unknown>> {\n data: T[];\n hasMore?: boolean;\n nextCursor?: string;\n}\n\n/** `mutation` ops return per-step results. */\nexport interface MutationResult {\n results: unknown[];\n}\n\n/** `count` ops return a single count. */\nexport interface CountResult {\n count: number;\n}\n\n/** `aggregate` ops return a single result object. */\nexport interface AggregateResult {\n result: Record<string, unknown>;\n}\n\n/** `applyToQuery` ops return match/affect/fail counts. */\nexport interface ApplyToQueryResult {\n matched: number;\n affected: number;\n failed: number;\n sample?: unknown[];\n}\n\n/** `pipeline` ops return per-step results keyed by step name. */\nexport interface PipelineResult {\n steps: Record<string, unknown>;\n}\n";
134
+ /**
135
+ * The shared generic result shapes referenced by the per-op aliases. These
136
+ * mirror the runtime result shapes produced by the database-operations
137
+ * controller; per-op aliases point at them (and, where the definition makes the
138
+ * shape derivable, at a narrowed form — see `renderOpResultAlias`).
139
+ */
140
+ export declare const RESULT_ALIASES_BLOCK = "// Generic per-op result shapes. These mirror the runtime result shapes\n// produced by the database-operations controller; per-op aliases reference\n// them (or a narrowed form when the op definition makes the shape derivable).\n\n/** `query` ops return a page of records. */\nexport interface QueryResult<T = Record<string, unknown>> {\n data: T[];\n hasMore?: boolean;\n nextCursor?: string;\n}\n\n/**\n * One step's result inside a `mutation` op's uniform response (#1458).\n * `op` is the step kind; `id` is the record id (the resolved canonical id for\n * `upsertOn` saves). `values` carries an `increment` step's post-increment\n * counters; `error` a per-step failure string.\n */\nexport interface MutationStepResult {\n op: \"save\" | \"patch\" | \"delete\" | \"increment\" | \"addToSet\" | \"removeFromSet\";\n success: boolean;\n id: string;\n values?: Record<string, number>;\n error?: string;\n}\n\n/**\n * Every `mutation` op returns a uniform `{ results: MutationStepResult[] }`\n * in DEFINITION-STEP order \u2014 one entry per step, tagged with its `op` kind and\n * record `id` (#1458). This is a SUCCESS-PATH guarantee: a step that fails at\n * the HTTP level surfaces as an error, and committed sibling writes in the same\n * op are not reported (the ops are not yet executed atomically \u2014 see #1478).\n */\nexport interface MutationResult {\n results: MutationStepResult[];\n}\n\n/** `count` ops return a single count. */\nexport interface CountResult {\n count: number;\n}\n\n/** `aggregate` ops return a single result object. */\nexport interface AggregateResult {\n result: Record<string, unknown>;\n}\n\n/** `applyToQuery` ops return match/affect/fail counts. */\nexport interface ApplyToQueryResult {\n matched: number;\n affected: number;\n failed: number;\n sample?: unknown[];\n}\n\n/** `pipeline` ops return per-step results keyed by step name. */\nexport interface PipelineResult {\n steps: Record<string, unknown>;\n}\n";
78
141
  /**
79
142
  * Render the header (banner + regen hint + fingerprint).
80
143
  */
@@ -92,6 +155,52 @@ export declare function renderRecordInterface(input: RenderRecordInterfaceInput)
92
155
  */
93
156
  export declare function renderOpParamsInterface(input: RenderOpParamsInterfaceInput): string;
94
157
  /**
95
- * Render a per-op result alias keyed off `op.type`.
158
+ * Render a per-op result alias. The alias is derived from `op.type` and, where
159
+ * the shape is derivable from the parsed op definition, a narrowed form:
160
+ * - `query` → `QueryResult<M>`, narrowed by the op `projection` (#1439).
161
+ * - `mutation` → `MutationResult` — every mutation op returns the uniform
162
+ * `{ results: MutationStepResult[] }` in definition order (#1458).
163
+ * - `pipeline` → the returned step's result type (#1437); `return: "all"` /
164
+ * no-return / unresolvable keep the generic `PipelineResult`.
96
165
  */
97
166
  export declare function renderOpResultAlias(input: RenderOpResultAliasInput): string;
167
+ /** One operation the typed-ops factory exposes as a method (#1441). */
168
+ export interface OpsFactoryOp {
169
+ /**
170
+ * Object-literal property key for the method — bare (`getX`) for a plain JS
171
+ * identifier, or a quoted string (`"get-x"`, `"delete"`) for a hyphenated /
172
+ * reserved-word / leading-digit op name. Produced by `opPropertyKey`.
173
+ */
174
+ propertyKey: string;
175
+ /** Exact operation name passed as the `executeOperation` string argument. */
176
+ opName: string;
177
+ /** The op's `<Op>Params` interface name (write shape). */
178
+ paramsInterfaceName: string;
179
+ /** The op's `<Op>Result` alias name (read shape). */
180
+ resultAliasName: string;
181
+ /**
182
+ * Whether the op declares any params. A param-less op yields a method callable
183
+ * with no arguments (`ops.foo()`); its only arg is the optional `options`.
184
+ */
185
+ hasParams: boolean;
186
+ }
187
+ export interface RenderOpsFactoryInput {
188
+ /** Factory function name (e.g. `securitiesRefOps`). */
189
+ factoryName: string;
190
+ /** Database type name, for the doc comment. */
191
+ databaseType: string;
192
+ /** Operations to expose, in deterministic (name-sorted) order. */
193
+ ops: OpsFactoryOp[];
194
+ }
195
+ /**
196
+ * Render the typed-operations factory (#1441): an inlined structural client
197
+ * interface + a shared call-options type + the `export function <type>Ops`
198
+ * factory. Each method pairs an op's `<Op>Params` input with its `<Op>Result`
199
+ * output and calls `client.databases.executeOperation<<Op>Result>(...)`, so the
200
+ * generated code carries no `as` cast and no import — the real `JsBaoClient`
201
+ * satisfies the structural `OpsClient` param.
202
+ *
203
+ * Returns "" for a database type with no operations, so the caller can omit the
204
+ * factory entirely rather than emit an empty function.
205
+ */
206
+ export declare function renderOpsFactory(input: RenderOpsFactoryInput): string;
@@ -11,15 +11,25 @@
11
11
  * classes — so we emit plain `export interface` types with no class
12
12
  * shell, no barrel registration, and `import type` only.
13
13
  * 2. We add an OPERATIONS half codegen-v2 has no analog for: per-op
14
- * input-params interfaces + per-op result aliases keyed off `op.type`.
14
+ * input-params interfaces + per-op result aliases. The alias for an op
15
+ * is derived from `op.type` AND, where it matters, the op's parsed
16
+ * `definition`: a query op's `projection` (#1439), a mutation op's step
17
+ * kinds (#1438), and a pipeline op's `return` step (#1437). The generator
18
+ * resolves those into the small descriptors below; the templates stay pure
19
+ * string-emitters.
15
20
  */
16
21
  import { tsTypeForDbField, tsTypeForDbParamType } from "./dbTsTypes.js";
17
22
  const HEADER_BANNER = "// AUTO-GENERATED FROM database-types TOML — DO NOT EDIT.";
18
23
  const REGEN_INSTRUCTION = "// Run `primitive databases codegen <database-type>` to regenerate.";
19
- /** The shared generic result aliases, keyed off `op.type`. */
20
- export const RESULT_ALIASES_BLOCK = `// Generic per-op result shapes, keyed off the operation type. The op
21
- // return contract is NOT stored in the TOML — these mirror the runtime
22
- // result shapes produced by the database-operations controller.
24
+ /**
25
+ * The shared generic result shapes referenced by the per-op aliases. These
26
+ * mirror the runtime result shapes produced by the database-operations
27
+ * controller; per-op aliases point at them (and, where the definition makes the
28
+ * shape derivable, at a narrowed form — see `renderOpResultAlias`).
29
+ */
30
+ export const RESULT_ALIASES_BLOCK = `// Generic per-op result shapes. These mirror the runtime result shapes
31
+ // produced by the database-operations controller; per-op aliases reference
32
+ // them (or a narrowed form when the op definition makes the shape derivable).
23
33
 
24
34
  /** \`query\` ops return a page of records. */
25
35
  export interface QueryResult<T = Record<string, unknown>> {
@@ -28,9 +38,29 @@ export interface QueryResult<T = Record<string, unknown>> {
28
38
  nextCursor?: string;
29
39
  }
30
40
 
31
- /** \`mutation\` ops return per-step results. */
41
+ /**
42
+ * One step's result inside a \`mutation\` op's uniform response (#1458).
43
+ * \`op\` is the step kind; \`id\` is the record id (the resolved canonical id for
44
+ * \`upsertOn\` saves). \`values\` carries an \`increment\` step's post-increment
45
+ * counters; \`error\` a per-step failure string.
46
+ */
47
+ export interface MutationStepResult {
48
+ op: "save" | "patch" | "delete" | "increment" | "addToSet" | "removeFromSet";
49
+ success: boolean;
50
+ id: string;
51
+ values?: Record<string, number>;
52
+ error?: string;
53
+ }
54
+
55
+ /**
56
+ * Every \`mutation\` op returns a uniform \`{ results: MutationStepResult[] }\`
57
+ * in DEFINITION-STEP order — one entry per step, tagged with its \`op\` kind and
58
+ * record \`id\` (#1458). This is a SUCCESS-PATH guarantee: a step that fails at
59
+ * the HTTP level surfaces as an error, and committed sibling writes in the same
60
+ * op are not reported (the ops are not yet executed atomically — see #1478).
61
+ */
32
62
  export interface MutationResult {
33
- results: unknown[];
63
+ results: MutationStepResult[];
34
64
  }
35
65
 
36
66
  /** \`count\` ops return a single count. */
@@ -125,22 +155,57 @@ export function renderOpParamsInterface(input) {
125
155
  lines.push(`export interface ${interfaceName} {`);
126
156
  for (const p of params) {
127
157
  const optional = p.required ? "" : "?";
128
- lines.push(` ${p.name}${optional}: ${tsTypeForDbParamType(p.type, p.enum)};`);
158
+ lines.push(` ${p.name}${optional}: ${tsTypeForDbParamType(p.type, p.enum, p.items)};`);
129
159
  }
130
160
  lines.push(`}`);
131
161
  return lines.join("\n");
132
162
  }
133
163
  /**
134
- * Render a per-op result alias keyed off `op.type`.
164
+ * Compute the generic argument for a `QueryResult<...>` from the op's record
165
+ * interface + projection classification (#1439). Reused for a pipeline op's
166
+ * returning `query` step (#1437), so both type identically to a plain query.
167
+ *
168
+ * A null record interface (the op's model has no `[models.*]` schema) has
169
+ * nothing to `Pick` from, so it always falls back to
170
+ * `Record<string, unknown>` regardless of any projection.
171
+ */
172
+ function queryResultGeneric(recordInterfaceName, projection) {
173
+ if (recordInterfaceName === null)
174
+ return "Record<string, unknown>";
175
+ const p = projection ?? { kind: "full" };
176
+ switch (p.kind) {
177
+ case "full":
178
+ return recordInterfaceName;
179
+ case "partial":
180
+ return `Partial<${recordInterfaceName}>`;
181
+ case "pick": {
182
+ // The generator guarantees a non-empty, field-guarded, sorted list; a
183
+ // defensive empty check keeps this total. Field names are emitted as TS
184
+ // string literals via JSON.stringify.
185
+ if (p.fields.length === 0)
186
+ return recordInterfaceName;
187
+ const members = p.fields.map((f) => JSON.stringify(f)).join(" | ");
188
+ return `Pick<${recordInterfaceName}, ${members}>`;
189
+ }
190
+ }
191
+ }
192
+ /**
193
+ * Render a per-op result alias. The alias is derived from `op.type` and, where
194
+ * the shape is derivable from the parsed op definition, a narrowed form:
195
+ * - `query` → `QueryResult<M>`, narrowed by the op `projection` (#1439).
196
+ * - `mutation` → `MutationResult` — every mutation op returns the uniform
197
+ * `{ results: MutationStepResult[] }` in definition order (#1458).
198
+ * - `pipeline` → the returned step's result type (#1437); `return: "all"` /
199
+ * no-return / unresolvable keep the generic `PipelineResult`.
135
200
  */
136
201
  export function renderOpResultAlias(input) {
137
- const { aliasName, opType, recordInterfaceName } = input;
202
+ const { aliasName, opType, recordInterfaceName, projection } = input;
138
203
  switch (opType) {
139
- case "query": {
140
- const generic = recordInterfaceName ?? "Record<string, unknown>";
141
- return `export type ${aliasName} = QueryResult<${generic}>;`;
142
- }
204
+ case "query":
205
+ return `export type ${aliasName} = QueryResult<${queryResultGeneric(recordInterfaceName, projection)}>;`;
143
206
  case "mutation":
207
+ // Every mutation op returns the uniform `{ results: MutationStepResult[] }`
208
+ // in definition-step order (#1458) — no more per-category flat shapes.
144
209
  return `export type ${aliasName} = MutationResult;`;
145
210
  case "count":
146
211
  return `export type ${aliasName} = CountResult;`;
@@ -148,12 +213,94 @@ export function renderOpResultAlias(input) {
148
213
  return `export type ${aliasName} = AggregateResult;`;
149
214
  case "applyToQuery":
150
215
  return `export type ${aliasName} = ApplyToQueryResult;`;
151
- case "pipeline":
152
- return `export type ${aliasName} = PipelineResult;`;
216
+ case "pipeline": {
217
+ const d = input.pipelineReturn ?? { kind: "opaque" };
218
+ switch (d.kind) {
219
+ case "query":
220
+ return `export type ${aliasName} = QueryResult<${queryResultGeneric(d.recordInterfaceName, d.projection)}>;`;
221
+ case "count":
222
+ return `export type ${aliasName} = CountResult;`;
223
+ case "aggregate":
224
+ return `export type ${aliasName} = AggregateResult;`;
225
+ // `opaque` — `return: "all"`, no `return`, or a step the generator
226
+ // couldn't resolve — keeps the generic `PipelineResult` (unchanged).
227
+ case "opaque":
228
+ default:
229
+ return `export type ${aliasName} = PipelineResult;`;
230
+ }
231
+ }
153
232
  default:
154
233
  // Unknown op type — emit a permissive alias rather than throwing,
155
234
  // so one stray op doesn't block codegen for the whole file.
156
235
  return `export type ${aliasName} = unknown;`;
157
236
  }
158
237
  }
238
+ /**
239
+ * Render the typed-operations factory (#1441): an inlined structural client
240
+ * interface + a shared call-options type + the `export function <type>Ops`
241
+ * factory. Each method pairs an op's `<Op>Params` input with its `<Op>Result`
242
+ * output and calls `client.databases.executeOperation<<Op>Result>(...)`, so the
243
+ * generated code carries no `as` cast and no import — the real `JsBaoClient`
244
+ * satisfies the structural `OpsClient` param.
245
+ *
246
+ * Returns "" for a database type with no operations, so the caller can omit the
247
+ * factory entirely rather than emit an empty function.
248
+ */
249
+ export function renderOpsFactory(input) {
250
+ const { factoryName, databaseType, ops } = input;
251
+ if (ops.length === 0)
252
+ return "";
253
+ const clientInterface = [
254
+ "// Minimal structural client shape — inlined so this file stays import-free",
255
+ "// and carries no runtime dependency on the client package. The real",
256
+ "// `JsBaoClient` satisfies it structurally.",
257
+ "interface OpsClient {",
258
+ " databases: {",
259
+ " executeOperation<R>(",
260
+ " databaseId: string,",
261
+ " name: string,",
262
+ " options?: {",
263
+ // `object` (not `Record<string, unknown>`) so a strict generated `<Op>Params`
264
+ // interface — which has no index signature — is still assignable here.
265
+ " params?: object;",
266
+ " limit?: number;",
267
+ " cursor?: string;",
268
+ " direction?: 1 | -1;",
269
+ " timing?: boolean;",
270
+ " },",
271
+ " ): Promise<R>;",
272
+ " };",
273
+ "}",
274
+ ].join("\n");
275
+ const optionsType = [
276
+ "// Non-param options (pagination + diagnostics) each factory method accepts",
277
+ "// alongside its params, passed straight through to `executeOperation`.",
278
+ "interface OpsCallOptions {",
279
+ " limit?: number;",
280
+ " cursor?: string;",
281
+ " direction?: 1 | -1;",
282
+ " timing?: boolean;",
283
+ "}",
284
+ ].join("\n");
285
+ const methodLines = ops.map((op) => {
286
+ const nameLiteral = JSON.stringify(op.opName);
287
+ if (op.hasParams) {
288
+ return (` ${op.propertyKey}: (params: ${op.paramsInterfaceName}, options?: OpsCallOptions): Promise<${op.resultAliasName}> =>\n` +
289
+ ` client.databases.executeOperation<${op.resultAliasName}>(databaseId, ${nameLiteral}, { params, ...options }),`);
290
+ }
291
+ // No declared params: the method takes only the optional options object, so
292
+ // it stays callable with no arguments (`ops.foo()`).
293
+ return (` ${op.propertyKey}: (options?: OpsCallOptions): Promise<${op.resultAliasName}> =>\n` +
294
+ ` client.databases.executeOperation<${op.resultAliasName}>(databaseId, ${nameLiteral}, { ...options }),`);
295
+ });
296
+ const factory = [
297
+ `/** Typed accessor for \`${databaseType}\` operations. */`,
298
+ `export function ${factoryName}(client: OpsClient, databaseId: string) {`,
299
+ " return {",
300
+ ...methodLines,
301
+ " };",
302
+ "}",
303
+ ].join("\n");
304
+ return [clientInterface, optionsType, factory].join("\n\n");
305
+ }
159
306
  //# sourceMappingURL=dbTemplates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dbTemplates.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTemplates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dbTemplates.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTemplates.ts"],"names":[],"mappings":"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"}
@@ -33,8 +33,12 @@
33
33
  * library's internal type paths.
34
34
  */
35
35
  export type DbFieldType = "string" | "number" | "boolean" | "date" | "id" | "stringset";
36
- /** Param types accepted in an `[[operations]]` `params` block. */
37
- export type DbParamType = "string" | "number" | "boolean" | "object";
36
+ /**
37
+ * Param types accepted in an `[[operations]]` `params` block. `array` (#1488)
38
+ * carries a scalar `items` element type; `integer` (also surfaced in #1488 when
39
+ * reconciling the registration/runtime type lists) maps to `number`.
40
+ */
41
+ export type DbParamType = "string" | "number" | "boolean" | "integer" | "object" | "array";
38
42
  /**
39
43
  * Returns the TS type expression for a record field type. Unknown types
40
44
  * fall back to `unknown` rather than throwing: the database-type TOML is
@@ -75,4 +79,4 @@ export declare function tsTypeForDbField(fieldType: string, enumValues?: string[
75
79
  * the base type for a non-string param or an empty enum rather than throwing —
76
80
  * the server is the source of truth for rejecting a malformed param `enum`.
77
81
  */
78
- export declare function tsTypeForDbParamType(paramType: string, enumValues?: string[]): string;
82
+ export declare function tsTypeForDbParamType(paramType: string, enumValues?: string[], items?: string): string;
@@ -90,7 +90,28 @@ export function tsTypeForDbField(fieldType, enumValues) {
90
90
  * the base type for a non-string param or an empty enum rather than throwing —
91
91
  * the server is the source of truth for rejecting a malformed param `enum`.
92
92
  */
93
- export function tsTypeForDbParamType(paramType, enumValues) {
93
+ export function tsTypeForDbParamType(paramType, enumValues, items) {
94
+ // Array param (#1488): a declared `type = "array"` (Phase 2) or one inferred
95
+ // from a `$in`/`$nin` binding (Phase 1). `items` is the scalar element type;
96
+ // a per-element `enum` on a string-element array renders `("a" | "b")[]`.
97
+ // A missing/unresolved `items` renders `unknown[]` (the conservative widen).
98
+ if (paramType === "array") {
99
+ let elem;
100
+ if (items === "string" &&
101
+ Array.isArray(enumValues) &&
102
+ enumValues.length > 0) {
103
+ elem = `(${tsUnionFromEnum(enumValues)})`;
104
+ }
105
+ else if (items) {
106
+ // Element type is always scalar here, so the recursion never re-enters
107
+ // this array branch.
108
+ elem = tsTypeForDbParamType(items);
109
+ }
110
+ else {
111
+ elem = "unknown";
112
+ }
113
+ return `${elem}[]`;
114
+ }
94
115
  if (paramType === "string" &&
95
116
  Array.isArray(enumValues) &&
96
117
  enumValues.length > 0) {
@@ -100,6 +121,7 @@ export function tsTypeForDbParamType(paramType, enumValues) {
100
121
  case "string":
101
122
  return "string";
102
123
  case "number":
124
+ case "integer":
103
125
  return "number";
104
126
  case "boolean":
105
127
  return "boolean";
@@ -1 +1 @@
1
- {"version":3,"file":"dbTsTypes.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTsTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAoBH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW;YACd,sDAAsD;YACtD,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,UAAqB;IAErB,IACE,SAAS,KAAK,QAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,UAAqB;IAErB,IACE,SAAS,KAAK,QAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,yBAAyB,CAAC;QACnC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"dbTsTypes.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTsTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AA8BH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW;YACd,sDAAsD;YACtD,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,UAAqB;IAErB,IACE,SAAS,KAAK,QAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,UAAqB,EACrB,KAAc;IAEd,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,IAAY,CAAC;QACjB,IACE,KAAK,KAAK,QAAQ;YAClB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YACzB,UAAU,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;YACD,IAAI,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,uEAAuE;YACvE,qBAAqB;YACrB,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IACD,IACE,SAAS,KAAK,QAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,yBAAyB,CAAC;QACnC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}