primitive-admin 1.0.53 → 1.0.55
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.
- package/README.md +38 -10
- package/dist/bin/primitive.js +8 -0
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/apps.js +54 -2
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth.js +16 -6
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.js +84 -7
- package/dist/src/commands/blob-buckets.js.map +1 -1
- package/dist/src/commands/catalog.js +3 -3
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collections.js +12 -9
- package/dist/src/commands/collections.js.map +1 -1
- package/dist/src/commands/databases.js +220 -82
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.js +77 -0
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/group-type-configs.js +1 -9
- package/dist/src/commands/group-type-configs.js.map +1 -1
- package/dist/src/commands/groups.js +12 -6
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.d.ts +161 -0
- package/dist/src/commands/guides.js +502 -84
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/integrations.js +2 -2
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/metadata.d.ts +2 -0
- package/dist/src/commands/metadata.js +344 -0
- package/dist/src/commands/metadata.js.map +1 -0
- package/dist/src/commands/prompts.js +2 -2
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +1 -0
- package/dist/src/commands/rule-sets.js +25 -3
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.d.ts +2 -0
- package/dist/src/commands/scripts.js +667 -0
- package/dist/src/commands/scripts.js.map +1 -0
- package/dist/src/commands/settings.d.ts +15 -0
- package/dist/src/commands/settings.js +102 -0
- package/dist/src/commands/settings.js.map +1 -0
- package/dist/src/commands/sync-app-settings.d.ts +105 -0
- package/dist/src/commands/sync-app-settings.js +339 -0
- package/dist/src/commands/sync-app-settings.js.map +1 -0
- package/dist/src/commands/sync.d.ts +204 -9
- package/dist/src/commands/sync.js +1706 -371
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/vars.d.ts +8 -0
- package/dist/src/commands/vars.js +110 -0
- package/dist/src/commands/vars.js.map +1 -0
- package/dist/src/commands/webhooks.js +17 -3
- package/dist/src/commands/webhooks.js.map +1 -1
- package/dist/src/commands/workflows.d.ts +30 -0
- package/dist/src/commands/workflows.js +667 -59
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.d.ts +122 -18
- package/dist/src/lib/api-client.js +131 -2
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +108 -0
- package/dist/src/lib/app-settings-descriptor.js +250 -0
- package/dist/src/lib/app-settings-descriptor.js.map +1 -0
- package/dist/src/lib/batch.d.ts +26 -0
- package/dist/src/lib/batch.js +32 -0
- package/dist/src/lib/batch.js.map +1 -0
- package/dist/src/lib/block-layout.d.ts +160 -0
- package/dist/src/lib/block-layout.js +451 -0
- package/dist/src/lib/block-layout.js.map +1 -0
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +76 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js +144 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
- package/dist/src/lib/config-toml.d.ts +10 -0
- package/dist/src/lib/config-toml.js +42 -0
- package/dist/src/lib/config-toml.js.map +1 -0
- package/dist/src/lib/config.d.ts +16 -0
- package/dist/src/lib/config.js +41 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/constants.d.ts +9 -0
- package/dist/src/lib/constants.js +9 -0
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/csv.d.ts +1 -2
- package/dist/src/lib/csv.js +3 -8
- package/dist/src/lib/csv.js.map +1 -1
- package/dist/src/lib/db-codegen/dbGenerator.d.ts +21 -65
- package/dist/src/lib/db-codegen/dbGenerator.js +117 -321
- package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -1
- package/dist/src/lib/db-codegen/dbNaming.d.ts +37 -0
- package/dist/src/lib/db-codegen/dbNaming.js +70 -0
- package/dist/src/lib/db-codegen/dbNaming.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTemplates.d.ts +165 -5
- package/dist/src/lib/db-codegen/dbTemplates.js +292 -16
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTsTypes.d.ts +7 -3
- package/dist/src/lib/db-codegen/dbTsTypes.js +23 -1
- package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +101 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +200 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
- package/dist/src/lib/generated-allowlist.js +43 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -1
- package/dist/src/lib/init-config.js +2 -2
- package/dist/src/lib/init-config.js.map +1 -1
- package/dist/src/lib/output.d.ts +25 -5
- package/dist/src/lib/output.js +32 -4
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/query-operators.d.ts +43 -0
- package/dist/src/lib/query-operators.js +80 -0
- package/dist/src/lib/query-operators.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +68 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js +380 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
- package/dist/src/lib/swift-codegen/generator.d.ts +84 -0
- package/dist/src/lib/swift-codegen/generator.js +178 -0
- package/dist/src/lib/swift-codegen/generator.js.map +1 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
- package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
- package/dist/src/lib/sync-resource-types.d.ts +225 -0
- package/dist/src/lib/sync-resource-types.js +394 -0
- package/dist/src/lib/sync-resource-types.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +10 -19
- package/dist/src/lib/toml-database-config.js +28 -59
- package/dist/src/lib/toml-database-config.js.map +1 -1
- package/dist/src/lib/toml-metadata-config.d.ts +147 -0
- package/dist/src/lib/toml-metadata-config.js +463 -0
- package/dist/src/lib/toml-metadata-config.js.map +1 -0
- package/dist/src/lib/toml-native-form.d.ts +46 -0
- package/dist/src/lib/toml-native-form.js +78 -0
- package/dist/src/lib/toml-native-form.js.map +1 -0
- package/dist/src/lib/toml-params-validator.d.ts +34 -0
- package/dist/src/lib/toml-params-validator.js +118 -3
- package/dist/src/lib/toml-params-validator.js.map +1 -1
- package/dist/src/lib/workflow-apply.d.ts +86 -0
- package/dist/src/lib/workflow-apply.js +127 -0
- package/dist/src/lib/workflow-apply.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generator.d.ts +87 -0
- package/dist/src/lib/workflow-codegen/generator.js +290 -0
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
- package/dist/src/lib/workflow-codegen/invokerIR.d.ts +85 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js +71 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
- package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
- package/dist/src/lib/workflow-codegen/naming.js +81 -0
- package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +64 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js +282 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
- package/dist/src/lib/workflow-fragments.js +3 -3
- package/dist/src/lib/workflow-fragments.js.map +1 -1
- package/dist/src/lib/workflow-payload.d.ts +68 -0
- package/dist/src/lib/workflow-payload.js +150 -0
- package/dist/src/lib/workflow-payload.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.d.ts +1 -1
- package/dist/src/lib/workflow-toml-validator.js +37 -1
- package/dist/src/lib/workflow-toml-validator.js.map +1 -1
- package/dist/src/types/index.d.ts +11 -0
- package/dist/src/validators.d.ts +4 -3
- package/dist/src/validators.js +6 -5
- package/dist/src/validators.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared database-type operation IR (issue #1547, Phase 4).
|
|
3
|
+
*
|
|
4
|
+
* `describeDbType` resolves ONE database-type TOML into a naming-neutral
|
|
5
|
+
* descriptor of its record models and operations — the record fields (with
|
|
6
|
+
* inferred required-ness), the per-op input params, and the per-op result
|
|
7
|
+
* descriptor (query projection #1439, mutation, count, aggregate,
|
|
8
|
+
* applyToQuery, pipeline return #1437). It performs NO language-specific
|
|
9
|
+
* naming: the TS renderer (`dbGenerator.ts`) and the Swift renderer
|
|
10
|
+
* (`swift-codegen/dbGenerator.ts`) both consume this SAME IR and each apply
|
|
11
|
+
* their own identifier rules. Neither renderer re-walks the op definitions, so
|
|
12
|
+
* the two clients can never disagree on which operations a database type
|
|
13
|
+
* exposes, what params they take, or what shape they return (issue #1547
|
|
14
|
+
* binding item 5 — the same "shared operation IR, no metadata reconstruction"
|
|
15
|
+
* contract Phase 3's `describeWorkflowInvoker` gives the workflow invoker).
|
|
16
|
+
*
|
|
17
|
+
* The resolution logic here was lifted verbatim from `renderDbTypeFile`'s
|
|
18
|
+
* former inline body; the only change is that result descriptors reference a
|
|
19
|
+
* MODEL NAME (naming-neutral) rather than a resolved TS interface name, so the
|
|
20
|
+
* Swift renderer can map the same model to its own type name.
|
|
21
|
+
*/
|
|
22
|
+
import { parseConfigToml, stringifyConfigToml } from "../config-toml.js";
|
|
23
|
+
import { loadSchemaFromTomlString } from "js-bao";
|
|
24
|
+
import { parseDatabaseTypeToml } from "../../commands/sync.js";
|
|
25
|
+
import { fingerprintToml } from "./dbFingerprint.js";
|
|
26
|
+
import { tsTypeForDbFieldType } from "./dbTsTypes.js";
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a database-type TOML into the shared, naming-neutral IR. Pure: no
|
|
29
|
+
* I/O beyond parsing the passed content. Both the TS and Swift renderers call
|
|
30
|
+
* this so their op/record metadata can never diverge.
|
|
31
|
+
*/
|
|
32
|
+
export function describeDbType(input) {
|
|
33
|
+
const { tomlContent } = input;
|
|
34
|
+
const fingerprint = fingerprintToml(tomlContent);
|
|
35
|
+
// Parse the raw TOML once for the [type] / [[operations]] data, and route
|
|
36
|
+
// the [models.*] subtree through the shared js-bao loader (same path the
|
|
37
|
+
// server uses to validate the schema).
|
|
38
|
+
const tomlData = parseConfigToml(tomlContent);
|
|
39
|
+
const { typeConfig, operations, subscriptions } = parseDatabaseTypeToml(tomlData);
|
|
40
|
+
const schemas = tomlData.models
|
|
41
|
+
? loadSchemaFromTomlString(stringifyConfigToml({ models: tomlData.models }), {
|
|
42
|
+
strict: false,
|
|
43
|
+
})
|
|
44
|
+
: [];
|
|
45
|
+
const stampedFields = collectStampedFields(typeConfig);
|
|
46
|
+
// model → record fields that op params prove are always supplied at create
|
|
47
|
+
// time; OR'd with the schema-level `required` flag below (#842).
|
|
48
|
+
const inferredRequired = inferRequiredRecordFields(operations);
|
|
49
|
+
// model → the field names on its record (declared + stamped), used to guard
|
|
50
|
+
// projection `pick` against unknown keys (#1439).
|
|
51
|
+
const recordFieldsByModel = new Map();
|
|
52
|
+
// model → declared field name → field type, feeding array-param element-type
|
|
53
|
+
// inference (#1488).
|
|
54
|
+
const fieldTypesByModel = new Map();
|
|
55
|
+
for (const schema of schemas) {
|
|
56
|
+
const ftypes = new Map();
|
|
57
|
+
for (const [fname, fopts] of Object.entries(schema.fields)) {
|
|
58
|
+
const t = fopts?.type;
|
|
59
|
+
if (typeof t === "string")
|
|
60
|
+
ftypes.set(fname, t);
|
|
61
|
+
}
|
|
62
|
+
fieldTypesByModel.set(schema.name, ftypes);
|
|
63
|
+
const memberNames = new Set(Object.keys(schema.fields));
|
|
64
|
+
for (const stamped of stampedFields)
|
|
65
|
+
memberNames.add(stamped);
|
|
66
|
+
recordFieldsByModel.set(schema.name, memberNames);
|
|
67
|
+
}
|
|
68
|
+
const modelsWithRecord = new Set(schemas.map((s) => s.name));
|
|
69
|
+
// Record IRs (schema order — renderers sort by their own type name).
|
|
70
|
+
const records = schemas.map((schema) => {
|
|
71
|
+
const inferredForModel = inferredRequired.get(schema.name)?.fields;
|
|
72
|
+
const fields = Object.entries(schema.fields).map(([name, opts]) => ({
|
|
73
|
+
name,
|
|
74
|
+
type: opts.type,
|
|
75
|
+
required: opts.required === true ||
|
|
76
|
+
(opts.autoAssign === true && name === "id") ||
|
|
77
|
+
inferredForModel?.has(name) === true,
|
|
78
|
+
enum: opts.enum,
|
|
79
|
+
}));
|
|
80
|
+
return {
|
|
81
|
+
modelName: schema.name,
|
|
82
|
+
className: schema.options?.className,
|
|
83
|
+
fields,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
// Operation IRs, sorted by op name for deterministic output.
|
|
87
|
+
const sortedOps = [...operations]
|
|
88
|
+
.filter((op) => op && typeof op.name === "string")
|
|
89
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
90
|
+
const ops = sortedOps.map((op) => {
|
|
91
|
+
const inferredArrays = inferArrayParamElementTypes(op, fieldTypesByModel);
|
|
92
|
+
const params = paramsToFields(op.params, inferredArrays);
|
|
93
|
+
const resultModelName = op.type === "query" && op.modelName && modelsWithRecord.has(op.modelName)
|
|
94
|
+
? op.modelName
|
|
95
|
+
: null;
|
|
96
|
+
const projection = op.type === "query"
|
|
97
|
+
? classifyProjection(op.definition?.projection, (op.modelName && recordFieldsByModel.get(op.modelName)) ||
|
|
98
|
+
new Set())
|
|
99
|
+
: undefined;
|
|
100
|
+
const pipelineReturn = op.type === "pipeline"
|
|
101
|
+
? resolvePipelineReturn(op.definition, recordFieldsByModel, modelsWithRecord)
|
|
102
|
+
: undefined;
|
|
103
|
+
return {
|
|
104
|
+
opName: op.name,
|
|
105
|
+
opType: op.type,
|
|
106
|
+
params,
|
|
107
|
+
hasParams: params.length > 0,
|
|
108
|
+
resultModelName,
|
|
109
|
+
projection,
|
|
110
|
+
pipelineReturn,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
// Subscription IRs (#1544 Phase 2), sorted by subscription key for
|
|
114
|
+
// deterministic output. Each is bound to its declared `modelName`'s record
|
|
115
|
+
// type; `select` narrows that to a projection.
|
|
116
|
+
const subscriptionIRs = describeSubscriptions(subscriptions, input.databaseType, modelsWithRecord, recordFieldsByModel);
|
|
117
|
+
return {
|
|
118
|
+
databaseType: input.databaseType,
|
|
119
|
+
fingerprint,
|
|
120
|
+
stampedFields,
|
|
121
|
+
records,
|
|
122
|
+
ops,
|
|
123
|
+
subscriptions: subscriptionIRs,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolve the parsed `[[subscriptions]]` rows into naming-neutral IR
|
|
128
|
+
* (#1544 Phase 2). Sorted by subscription key.
|
|
129
|
+
*
|
|
130
|
+
* Precise per-subscription typing (maintainer decision, Fork 2 amended): each
|
|
131
|
+
* subscription is bound to its declared `modelName`. A subscription whose
|
|
132
|
+
* `modelName` is missing or names a model this type declares no record schema
|
|
133
|
+
* for is an authoring error the generator surfaces by THROWING — there is no
|
|
134
|
+
* silent `Record<string, unknown>` fallback and no discriminated-union fallback
|
|
135
|
+
* (the server has required `modelName` on every subscription since the feature
|
|
136
|
+
* shipped in #740, so no legacy no-`modelName` rows exist).
|
|
137
|
+
*
|
|
138
|
+
* `select` narrows the event record to a `Pick`; each selected field must be a
|
|
139
|
+
* known member of the record (or the record must be the open
|
|
140
|
+
* `Record<string, unknown>` form), else the generator throws rather than emit
|
|
141
|
+
* an invalid `Pick`.
|
|
142
|
+
*/
|
|
143
|
+
function describeSubscriptions(subscriptions, databaseType, modelsWithRecord, recordFieldsByModel) {
|
|
144
|
+
const result = (subscriptions ?? [])
|
|
145
|
+
.filter((sub) => sub && typeof sub.subscriptionKey === "string")
|
|
146
|
+
.map((sub) => {
|
|
147
|
+
const subscriptionKey = sub.subscriptionKey;
|
|
148
|
+
const modelName = sub.modelName;
|
|
149
|
+
if (typeof modelName !== "string" || modelName === "") {
|
|
150
|
+
throw new Error(`Subscription "${subscriptionKey}" on database type ` +
|
|
151
|
+
`"${databaseType}" has no modelName. Every subscription must ` +
|
|
152
|
+
`declare the model whose changes it delivers.`);
|
|
153
|
+
}
|
|
154
|
+
if (!modelsWithRecord.has(modelName)) {
|
|
155
|
+
throw new Error(`Subscription "${subscriptionKey}" on database type ` +
|
|
156
|
+
`"${databaseType}" names model "${modelName}", which has no ` +
|
|
157
|
+
`[models.${modelName}] schema block. Declare the model's schema ` +
|
|
158
|
+
`so its change payload can be typed.`);
|
|
159
|
+
}
|
|
160
|
+
// `select` present (non-empty array) → Pick over those fields. Guard each
|
|
161
|
+
// field against the record's known members unless the record is the open
|
|
162
|
+
// `Record<string, unknown>` form (no declared/stamped members), where any
|
|
163
|
+
// key is valid.
|
|
164
|
+
let select = null;
|
|
165
|
+
if (Array.isArray(sub.select) && sub.select.length > 0) {
|
|
166
|
+
const members = recordFieldsByModel.get(modelName) ?? new Set();
|
|
167
|
+
const recordIsOpen = members.size === 0;
|
|
168
|
+
for (const field of sub.select) {
|
|
169
|
+
if (typeof field !== "string" || field === "") {
|
|
170
|
+
throw new Error(`Subscription "${subscriptionKey}" on database type ` +
|
|
171
|
+
`"${databaseType}" has a non-string select entry.`);
|
|
172
|
+
}
|
|
173
|
+
if (!recordIsOpen && !members.has(field)) {
|
|
174
|
+
throw new Error(`Subscription "${subscriptionKey}" on database type ` +
|
|
175
|
+
`"${databaseType}" selects field "${field}", which is not ` +
|
|
176
|
+
`declared on model "${modelName}". Add it to ` +
|
|
177
|
+
`[models.${modelName}] or remove it from select.`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
select = [...new Set(sub.select)].sort();
|
|
181
|
+
}
|
|
182
|
+
return { subscriptionKey, modelName, select };
|
|
183
|
+
});
|
|
184
|
+
result.sort((a, b) => a.subscriptionKey.localeCompare(b.subscriptionKey));
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Classify a query op's static `projection` into how it narrows the record type
|
|
189
|
+
* (#1439). Kept private to the generator: the returned `{ kind, fields }` shape
|
|
190
|
+
* is what the template needs, and the field-guard / `id`-folding / sorting live
|
|
191
|
+
* here so the template stays a pure string-emitter.
|
|
192
|
+
*
|
|
193
|
+
* `recordFieldNames` is the set of members on the record interface (declared +
|
|
194
|
+
* stamped). A projected key that is not a member (a nested `"a.b"` path, or a
|
|
195
|
+
* field absent from the schema) makes the whole projection fall back to
|
|
196
|
+
* `Partial<M>` rather than emit an invalid `Pick`. Reused for a pipeline
|
|
197
|
+
* op's returning `query` step (#1437).
|
|
198
|
+
*
|
|
199
|
+
* Rules (projection values are validated server-side to be `1` or `0`, mixing
|
|
200
|
+
* rejected — codegen runs pre-push, so it still guards):
|
|
201
|
+
* - absent / not an object / empty `{}` → `full` (whole record `M`).
|
|
202
|
+
* - all `1` (inclusion), keys all known → `pick` (with `id` folded in,
|
|
203
|
+
* since inclusion always retains
|
|
204
|
+
* `id` at runtime).
|
|
205
|
+
* - all `0` (exclusion), keys all known → `omit` (over the excluded set
|
|
206
|
+
* minus `id`/`type`). The DO strips
|
|
207
|
+
* excluded fields server-side
|
|
208
|
+
* (#1493 / issue #1456), so the
|
|
209
|
+
* rows genuinely omit them and
|
|
210
|
+
* `Omit<M, …>` is truthful. Falls
|
|
211
|
+
* back to `partial` when the set is
|
|
212
|
+
* empty after dropping `id`/`type`.
|
|
213
|
+
* - mixed / dynamic / non-`1|0` / unknown / → `partial` (honest fallback).
|
|
214
|
+
* nested-key exclusion
|
|
215
|
+
*/
|
|
216
|
+
function classifyProjection(projection, recordFieldNames) {
|
|
217
|
+
if (!projection ||
|
|
218
|
+
typeof projection !== "object" ||
|
|
219
|
+
Array.isArray(projection)) {
|
|
220
|
+
return { kind: "full" };
|
|
221
|
+
}
|
|
222
|
+
const entries = Object.entries(projection);
|
|
223
|
+
if (entries.length === 0)
|
|
224
|
+
return { kind: "full" };
|
|
225
|
+
let allInclude = true;
|
|
226
|
+
let allExclude = true;
|
|
227
|
+
const included = [];
|
|
228
|
+
const excluded = [];
|
|
229
|
+
for (const [field, val] of entries) {
|
|
230
|
+
if (val === 1) {
|
|
231
|
+
included.push(field);
|
|
232
|
+
allExclude = false;
|
|
233
|
+
}
|
|
234
|
+
else if (val === 0) {
|
|
235
|
+
excluded.push(field);
|
|
236
|
+
allInclude = false;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// A dynamic (`$params.x`) or otherwise non-`1|0` value — can't resolve
|
|
240
|
+
// statically. Fall back rather than emit garbage.
|
|
241
|
+
allInclude = false;
|
|
242
|
+
allExclude = false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (allInclude && included.length > 0) {
|
|
246
|
+
if (!included.every((f) => recordFieldNames.has(f)))
|
|
247
|
+
return { kind: "partial" };
|
|
248
|
+
// Inclusion always retains `id` at runtime (the DO unshifts it), so fold it
|
|
249
|
+
// into the union when the model has an `id` field.
|
|
250
|
+
const fields = new Set(included);
|
|
251
|
+
if (recordFieldNames.has("id"))
|
|
252
|
+
fields.add("id");
|
|
253
|
+
return { kind: "pick", fields: [...fields].sort() };
|
|
254
|
+
}
|
|
255
|
+
if (allExclude && excluded.length > 0) {
|
|
256
|
+
// Static all-exclusion projection (e.g. `{ secret: 0 }`). Since #1493 (issue
|
|
257
|
+
// #1456) the DO's `_applyProjection` deletes excluded keys server-side, so
|
|
258
|
+
// the returned rows genuinely omit them and `Omit<M, …>` is the truthful,
|
|
259
|
+
// tighter type — reading an excluded field off the result is now a compile
|
|
260
|
+
// error rather than a value that silently existed.
|
|
261
|
+
//
|
|
262
|
+
// `id`/`type` are always returned (the validator 400s on excluding them and
|
|
263
|
+
// the DO force-keeps them), so they can never be in the Omit set — drop them
|
|
264
|
+
// first. Dropping them is defensive handling of invalid local/unpushed TOML,
|
|
265
|
+
// not a supported projection shape.
|
|
266
|
+
const omitKeys = excluded.filter((f) => f !== "id" && f !== "type");
|
|
267
|
+
// Every remaining key must be a known member so `Omit<M, union>` is valid TS.
|
|
268
|
+
// A nested `"a.b"` path or an off-schema key falls back to the honest
|
|
269
|
+
// `Partial`, and an exclusion set that is only `id`/`type` reduces to empty
|
|
270
|
+
// after filtering (op rejected server-side) → also `Partial`.
|
|
271
|
+
if (omitKeys.length > 0 && omitKeys.every((f) => recordFieldNames.has(f))) {
|
|
272
|
+
return { kind: "omit", fields: [...new Set(omitKeys)].sort() };
|
|
273
|
+
}
|
|
274
|
+
return { kind: "partial" };
|
|
275
|
+
}
|
|
276
|
+
return { kind: "partial" };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Resolve a pipeline op's `return`-step shape (#1437), naming-neutral (keyed on
|
|
280
|
+
* model name). Never throws — one odd op must not break codegen for the file.
|
|
281
|
+
*/
|
|
282
|
+
function resolvePipelineReturn(definition, recordFieldsByModel, modelsWithRecord) {
|
|
283
|
+
if (!definition || typeof definition !== "object")
|
|
284
|
+
return { kind: "opaque" };
|
|
285
|
+
const def = definition;
|
|
286
|
+
const ret = def.return ?? "all";
|
|
287
|
+
if (ret === "all" || typeof ret !== "string")
|
|
288
|
+
return { kind: "opaque" };
|
|
289
|
+
if (!Array.isArray(def.steps))
|
|
290
|
+
return { kind: "opaque" };
|
|
291
|
+
const step = def.steps.find((s) => s && typeof s === "object" && s.name === ret);
|
|
292
|
+
if (!step)
|
|
293
|
+
return { kind: "opaque" };
|
|
294
|
+
if (step.type === "query") {
|
|
295
|
+
const modelName = typeof step.modelName === "string" ? step.modelName : undefined;
|
|
296
|
+
const resultModelName = modelName && modelsWithRecord.has(modelName) ? modelName : null;
|
|
297
|
+
const fieldNames = (modelName && recordFieldsByModel.get(modelName)) || new Set();
|
|
298
|
+
const projection = classifyProjection(step.projection, fieldNames);
|
|
299
|
+
return { kind: "query", modelName: resultModelName, projection };
|
|
300
|
+
}
|
|
301
|
+
if (step.type === "count")
|
|
302
|
+
return { kind: "count" };
|
|
303
|
+
if (step.type === "aggregate")
|
|
304
|
+
return { kind: "aggregate" };
|
|
305
|
+
return { kind: "opaque" };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Collect server-stamped field names from the parsed [type] config: timestamp
|
|
309
|
+
* field names + auto-populated field names. These render as OPTIONAL record
|
|
310
|
+
* props.
|
|
311
|
+
*/
|
|
312
|
+
function collectStampedFields(typeConfig) {
|
|
313
|
+
const names = [];
|
|
314
|
+
const ts = typeConfig?.timestamps;
|
|
315
|
+
if (ts && typeof ts === "object") {
|
|
316
|
+
if (typeof ts.create === "string")
|
|
317
|
+
names.push(ts.create);
|
|
318
|
+
if (typeof ts.update === "string")
|
|
319
|
+
names.push(ts.update);
|
|
320
|
+
}
|
|
321
|
+
const apf = typeConfig?.autoPopulatedFields;
|
|
322
|
+
if (apf && typeof apf === "object") {
|
|
323
|
+
for (const key of Object.keys(apf))
|
|
324
|
+
names.push(key);
|
|
325
|
+
}
|
|
326
|
+
return [...new Set(names)];
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Convert the normalized op `params` map into a sorted `ParamField[]`. See the
|
|
330
|
+
* original doc in `dbGenerator.ts`. `inferredArrayElements` (#1488) narrows a
|
|
331
|
+
* `$in`/`$nin`-bound untyped/object param to its array element type.
|
|
332
|
+
*/
|
|
333
|
+
function paramsToFields(params, inferredArrayElements) {
|
|
334
|
+
if (!params || typeof params !== "object")
|
|
335
|
+
return [];
|
|
336
|
+
return Object.entries(params)
|
|
337
|
+
.map(([name, def]) => {
|
|
338
|
+
const rawType = def?.type;
|
|
339
|
+
const declaredType = rawType ?? "object";
|
|
340
|
+
const declaredItems = def?.items;
|
|
341
|
+
let type = declaredType;
|
|
342
|
+
let items = declaredItems;
|
|
343
|
+
const inferred = inferredArrayElements?.get(name);
|
|
344
|
+
if (declaredType === "object" && inferred !== undefined) {
|
|
345
|
+
type = "array";
|
|
346
|
+
items = inferred === "unknown" ? undefined : inferred;
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
name,
|
|
350
|
+
type,
|
|
351
|
+
required: def?.required === true,
|
|
352
|
+
enum: def?.enum,
|
|
353
|
+
items,
|
|
354
|
+
};
|
|
355
|
+
})
|
|
356
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Infer the scalar element type for op params consumed by a `$in`/`$nin`
|
|
360
|
+
* filter operator (#1488). See the original doc in `dbGenerator.ts` — moved
|
|
361
|
+
* here unchanged. Returns a map of param name → element TS type
|
|
362
|
+
* (`"unknown"` sentinel → widen to an untyped element).
|
|
363
|
+
*/
|
|
364
|
+
export function inferArrayParamElementTypes(op, fieldTypesByModel) {
|
|
365
|
+
const result = new Map();
|
|
366
|
+
if (!op || typeof op !== "object")
|
|
367
|
+
return result;
|
|
368
|
+
const def = op.definition;
|
|
369
|
+
if (!def || typeof def !== "object")
|
|
370
|
+
return result;
|
|
371
|
+
const arrayElems = new Map();
|
|
372
|
+
const scalarRefs = new Set();
|
|
373
|
+
const addArrayElem = (param, elem) => {
|
|
374
|
+
let s = arrayElems.get(param);
|
|
375
|
+
if (!s) {
|
|
376
|
+
s = new Set();
|
|
377
|
+
arrayElems.set(param, s);
|
|
378
|
+
}
|
|
379
|
+
s.add(elem);
|
|
380
|
+
};
|
|
381
|
+
const paramRef = (v) => {
|
|
382
|
+
if (typeof v !== "string")
|
|
383
|
+
return null;
|
|
384
|
+
const m = v.match(/^\$params\.([A-Za-z0-9_]+)$/);
|
|
385
|
+
return m ? m[1] : null;
|
|
386
|
+
};
|
|
387
|
+
const elemTypeForField = (field, fields) => {
|
|
388
|
+
const ftype = fields?.get(field);
|
|
389
|
+
if (ftype === undefined)
|
|
390
|
+
return "unknown";
|
|
391
|
+
if (ftype === "stringset")
|
|
392
|
+
return "string";
|
|
393
|
+
const ts = tsTypeForDbFieldType(ftype);
|
|
394
|
+
return ts === "string" || ts === "number" || ts === "boolean"
|
|
395
|
+
? ts
|
|
396
|
+
: "unknown";
|
|
397
|
+
};
|
|
398
|
+
const modelFields = (name) => typeof name === "string" ? fieldTypesByModel.get(name) : undefined;
|
|
399
|
+
const walkFilter = (filter, fields) => {
|
|
400
|
+
if (!filter || typeof filter !== "object" || Array.isArray(filter))
|
|
401
|
+
return;
|
|
402
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
403
|
+
if (key === "$and" || key === "$or") {
|
|
404
|
+
if (Array.isArray(value)) {
|
|
405
|
+
for (const sub of value)
|
|
406
|
+
walkFilter(sub, fields);
|
|
407
|
+
}
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
if (key === "$not") {
|
|
411
|
+
walkFilter(value, fields);
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
415
|
+
for (const [operator, opVal] of Object.entries(value)) {
|
|
416
|
+
const p = paramRef(opVal);
|
|
417
|
+
if (!p)
|
|
418
|
+
continue;
|
|
419
|
+
if (operator === "$in" || operator === "$nin") {
|
|
420
|
+
addArrayElem(p, elemTypeForField(key, fields));
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
scalarRefs.add(p);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
const p = paramRef(value);
|
|
429
|
+
if (p)
|
|
430
|
+
scalarRefs.add(p);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
walkFilter(def.filter, modelFields(op.modelName));
|
|
435
|
+
if (def.source && typeof def.source === "object") {
|
|
436
|
+
walkFilter(def.source.filter, modelFields(def.source.modelName ?? op.modelName));
|
|
437
|
+
}
|
|
438
|
+
if (Array.isArray(def.operations)) {
|
|
439
|
+
for (const inner of def.operations) {
|
|
440
|
+
if (inner && typeof inner === "object") {
|
|
441
|
+
walkFilter(inner.filter, modelFields(inner.modelName ?? op.modelName));
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (Array.isArray(def.steps)) {
|
|
446
|
+
for (const step of def.steps) {
|
|
447
|
+
if (step && typeof step === "object") {
|
|
448
|
+
walkFilter(step.filter, modelFields(step.modelName ?? op.modelName));
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
for (const [param, elems] of arrayElems) {
|
|
453
|
+
if (scalarRefs.has(param) || elems.size !== 1) {
|
|
454
|
+
result.set(param, "unknown");
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
result.set(param, [...elems][0]);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return result;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Infer which record fields are always supplied at create time from `save` op
|
|
464
|
+
* params (#842). See the original doc in `dbGenerator.ts` — moved here
|
|
465
|
+
* unchanged.
|
|
466
|
+
*/
|
|
467
|
+
export function inferRequiredRecordFields(operations) {
|
|
468
|
+
const verdicts = new Map();
|
|
469
|
+
for (const op of operations ?? []) {
|
|
470
|
+
if (!op || op.type !== "mutation")
|
|
471
|
+
continue;
|
|
472
|
+
const innerOps = op.definition?.operations;
|
|
473
|
+
if (!Array.isArray(innerOps))
|
|
474
|
+
continue;
|
|
475
|
+
const params = op.params && typeof op.params === "object" ? op.params : {};
|
|
476
|
+
for (const inner of innerOps) {
|
|
477
|
+
if (!inner || inner.op !== "save")
|
|
478
|
+
continue;
|
|
479
|
+
const data = inner.data;
|
|
480
|
+
if (!data || typeof data !== "object" || Array.isArray(data))
|
|
481
|
+
continue;
|
|
482
|
+
const modelName = inner.modelName ?? op.modelName;
|
|
483
|
+
if (typeof modelName !== "string" || modelName === "")
|
|
484
|
+
continue;
|
|
485
|
+
let fieldVerdicts = verdicts.get(modelName);
|
|
486
|
+
if (!fieldVerdicts) {
|
|
487
|
+
fieldVerdicts = new Map();
|
|
488
|
+
verdicts.set(modelName, fieldVerdicts);
|
|
489
|
+
}
|
|
490
|
+
for (const [field, value] of Object.entries(data)) {
|
|
491
|
+
const match = typeof value === "string"
|
|
492
|
+
? value.match(/^\$params\.([A-Za-z0-9_]+)$/)
|
|
493
|
+
: null;
|
|
494
|
+
if (!match) {
|
|
495
|
+
fieldVerdicts.set(field, false);
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
const paramName = match[1];
|
|
499
|
+
const required = params[paramName]?.required === true;
|
|
500
|
+
const prior = fieldVerdicts.get(field);
|
|
501
|
+
fieldVerdicts.set(field, prior === false ? false : required);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
const result = new Map();
|
|
506
|
+
for (const [modelName, fieldVerdicts] of verdicts) {
|
|
507
|
+
const fields = new Set();
|
|
508
|
+
for (const [field, verdict] of fieldVerdicts) {
|
|
509
|
+
if (verdict)
|
|
510
|
+
fields.add(field);
|
|
511
|
+
}
|
|
512
|
+
if (fields.size > 0)
|
|
513
|
+
result.set(modelName, { fields });
|
|
514
|
+
}
|
|
515
|
+
return result;
|
|
516
|
+
}
|
|
517
|
+
//# sourceMappingURL=dbTypeIR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbTypeIR.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTypeIR.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED FILE — DO NOT EDIT BY HAND.
|
|
3
|
+
*
|
|
4
|
+
* Vendored byte-for-byte from the canonical server module
|
|
5
|
+
* `src/app-api/controllers/operation-definition-descriptor.ts` — the SAME
|
|
6
|
+
* allow-lists the server validator (`validateDefinition` / `validateParams`)
|
|
7
|
+
* enforces. The client operation-definition types
|
|
8
|
+
* (`src/client/api/operationDefinition.ts`) hand-author the matching union;
|
|
9
|
+
* a key-parity test compares them against this committed copy.
|
|
10
|
+
*
|
|
11
|
+
* Regenerate with:
|
|
12
|
+
* node cli/scripts/gen-operation-def-descriptor.mjs (runs at CLI prebuild)
|
|
13
|
+
*
|
|
14
|
+
* A CI freshness guard
|
|
15
|
+
* (`cli/scripts/gen-operation-def-descriptor.mjs --check`, also asserted by
|
|
16
|
+
* `cli/tests/unit/operation-def-descriptor-drift-guard.test.ts`) fails if
|
|
17
|
+
* this committed copy does not match the source — see issue #1544 / #1442.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Canonical, dependency-free descriptor of the database operation-definition
|
|
21
|
+
* schema (issue #1544).
|
|
22
|
+
*
|
|
23
|
+
* The server validator (`validateDefinition` / `validateParams` in
|
|
24
|
+
* `database-type-operations-controller.ts`) and the CLIENT operation-definition
|
|
25
|
+
* types (`src/client/api/operationDefinition.ts`, consumed by
|
|
26
|
+
* `createOperation` / `updateOperation` / `DatabaseOperationInfo`) must agree on
|
|
27
|
+
* the set of operation types and the allowed keys for each definition shape —
|
|
28
|
+
* otherwise a hand-authored `OperationDefinition` member promises a key the
|
|
29
|
+
* runtime rejects (or omits one the runtime accepts).
|
|
30
|
+
*
|
|
31
|
+
* This module is the single source of that declarative contract: the op-type
|
|
32
|
+
* list, the per-type allowed definition-key sets, the per-type mutation/action
|
|
33
|
+
* op-name enums, and the param-schema key/type enums. The validator imports
|
|
34
|
+
* these constants directly (so a change here changes what the server enforces),
|
|
35
|
+
* and the CLI vendors a byte-for-byte copy as a committed artifact via
|
|
36
|
+
* `cli/scripts/gen-operation-def-descriptor.mjs` (the #1442 workflow
|
|
37
|
+
* schema-descriptor pattern). A drift-guard test runs that generator in
|
|
38
|
+
* `--check` mode, and a key-parity test asserts the hand-authored client type
|
|
39
|
+
* members' keys equal the corresponding allow-lists here — so the validator and
|
|
40
|
+
* the client types can never silently diverge. The CLI never imports server
|
|
41
|
+
* `src/` at runtime; only the build-time generator reads this file.
|
|
42
|
+
*
|
|
43
|
+
* The value-shape checks that are NOT purely declarative (requiredness, nested
|
|
44
|
+
* object structure, CEL parsing) stay imperative in the validator. This
|
|
45
|
+
* descriptor captures the declarative allow-lists — the part that is genuinely
|
|
46
|
+
* shared between the runtime boundary and the descriptive client types.
|
|
47
|
+
*
|
|
48
|
+
* Ordering is significant: the validator joins these arrays into its 400-level
|
|
49
|
+
* error messages (`Must be one of: ${X.join(", ")}`), so reordering an array
|
|
50
|
+
* changes an error string. Keep entries in their current order.
|
|
51
|
+
*/
|
|
52
|
+
/** The operation `type` values accepted by `createOperation` / `updateOperation`. */
|
|
53
|
+
export declare const OPERATION_TYPES: readonly string[];
|
|
54
|
+
/** Allowed top-level keys in a `query` definition. `cache` (#1247) is query-only. */
|
|
55
|
+
export declare const QUERY_DEF_KEYS: readonly string[];
|
|
56
|
+
/** Allowed top-level keys in a `mutation` definition. */
|
|
57
|
+
export declare const MUTATION_DEF_KEYS: readonly string[];
|
|
58
|
+
/** Allowed top-level keys in a `count` definition. */
|
|
59
|
+
export declare const COUNT_DEF_KEYS: readonly string[];
|
|
60
|
+
/** Allowed top-level keys in an `aggregate` definition. */
|
|
61
|
+
export declare const AGGREGATE_DEF_KEYS: readonly string[];
|
|
62
|
+
/** Allowed top-level keys in a `pipeline` definition. */
|
|
63
|
+
export declare const PIPELINE_DEF_KEYS: readonly string[];
|
|
64
|
+
/** Allowed top-level keys in an `applyToQuery` definition. */
|
|
65
|
+
export declare const APPLY_TO_QUERY_DEF_KEYS: readonly string[];
|
|
66
|
+
/** Mutation op names allowed in a `mutation` definition's `operations[]`. */
|
|
67
|
+
export declare const MUTATION_OPS: readonly string[];
|
|
68
|
+
/**
|
|
69
|
+
* Aggregate op `type` names allowed in an `aggregate` definition's
|
|
70
|
+
* `operations[]`.
|
|
71
|
+
*/
|
|
72
|
+
export declare const AGGREGATE_OP_TYPES: readonly string[];
|
|
73
|
+
/**
|
|
74
|
+
* `applyToQuery` action ops. Only mutation ops that operate on existing matched
|
|
75
|
+
* records — `save` is excluded because it makes no sense in a find-and-mutate
|
|
76
|
+
* flow.
|
|
77
|
+
*/
|
|
78
|
+
export declare const APPLY_TO_QUERY_ACTIONS: readonly string[];
|
|
79
|
+
/** Allowed keys in an `applyToQuery` `source` block. */
|
|
80
|
+
export declare const APPLY_TO_QUERY_SOURCE_KEYS: readonly string[];
|
|
81
|
+
/** Allowed keys in an `applyToQuery` `action` block. */
|
|
82
|
+
export declare const APPLY_TO_QUERY_ACTION_KEYS: readonly string[];
|
|
83
|
+
/** Step `type` values allowed inside a `pipeline` definition's `steps[]`. */
|
|
84
|
+
export declare const PIPELINE_STEP_TYPES: readonly string[];
|
|
85
|
+
/** Allowed keys on a pipeline `query` step. */
|
|
86
|
+
export declare const PIPELINE_QUERY_STEP_KEYS: readonly string[];
|
|
87
|
+
/** Allowed keys on a pipeline `count` step. */
|
|
88
|
+
export declare const PIPELINE_COUNT_STEP_KEYS: readonly string[];
|
|
89
|
+
/** Allowed keys on a pipeline `aggregate` step. */
|
|
90
|
+
export declare const PIPELINE_AGGREGATE_STEP_KEYS: readonly string[];
|
|
91
|
+
/**
|
|
92
|
+
* Built-in param types. `integer` (#1488) is accepted here and by the runtime
|
|
93
|
+
* coercion path. `array` (#1488) declares a list param with a scalar `items`
|
|
94
|
+
* element type. Keep in step with the runtime coercion list
|
|
95
|
+
* (`MODEL_PARAM_SCALAR_TYPES` in `database-operations-controller.ts`).
|
|
96
|
+
*/
|
|
97
|
+
export declare const PARAM_TYPES: readonly string[];
|
|
98
|
+
/** Scalar element types allowed for an `array` param's `items` (#1488). */
|
|
99
|
+
export declare const ARRAY_ELEMENT_TYPES: readonly string[];
|
|
100
|
+
/** Allowed keys in a single param definition. */
|
|
101
|
+
export declare const PARAM_DEF_KEYS: readonly string[];
|