@prisma-next/sql-contract-ts 0.12.0 → 0.13.0-dev.2
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 +8 -0
- package/dist/{build-contract-BCYW3_wE.mjs → build-contract-C-x2pfu4.mjs} +214 -76
- package/dist/build-contract-C-x2pfu4.mjs.map +1 -0
- package/dist/config-types.d.mts +7 -3
- package/dist/config-types.d.mts.map +1 -1
- package/dist/config-types.mjs +12 -9
- package/dist/config-types.mjs.map +1 -1
- package/dist/contract-builder.d.mts +319 -23
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +280 -44
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +13 -13
- package/schemas/data-contract-sql-v1.json +31 -0
- package/src/build-contract.ts +340 -95
- package/src/config-types.ts +24 -6
- package/src/contract-builder.ts +137 -16
- package/src/contract-definition.ts +57 -3
- package/src/contract-dsl.ts +346 -18
- package/src/contract-lowering.ts +188 -15
- package/src/contract-types.ts +18 -21
- package/src/enum-type.ts +236 -0
- package/src/exports/contract-builder.ts +5 -0
- package/dist/build-contract-BCYW3_wE.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -260,6 +260,14 @@ export default defineConfig({
|
|
|
260
260
|
});
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
+
Optional third argument (options bag) for `typescriptContract` / `typescriptContractFromPath`, and `defaultControlPolicy` on `emptyContract`:
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
typescriptContract(contract, 'src/prisma/contract.json', { defaultControlPolicy: 'external' });
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
The specifier value applies only when the loaded contract omits `defaultControlPolicy` (a value authored on the contract module wins).
|
|
270
|
+
|
|
263
271
|
## Dependencies
|
|
264
272
|
|
|
265
273
|
- **`@prisma-next/config`** - `ContractConfig` types used by `typescriptContract(...)`
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
2
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
2
3
|
import { computeExecutionHash, computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
|
|
3
4
|
import { asNamespaceId, coreHash, crossRef } from "@prisma-next/contract/types";
|
|
4
5
|
import { mergeCapabilityMatrices } from "@prisma-next/contract-authoring";
|
|
@@ -8,7 +9,6 @@ import { validateIndexTypes } from "@prisma-next/sql-contract/index-type-validat
|
|
|
8
9
|
import { createIndexTypeRegistry } from "@prisma-next/sql-contract/index-types";
|
|
9
10
|
import { SqlStorage, StorageTable, applyFkDefaults, buildSqlNamespace, isPostgresEnumStorageEntry, toStorageTypeInstance } from "@prisma-next/sql-contract/types";
|
|
10
11
|
import { validateStorageSemantics } from "@prisma-next/sql-contract/validators";
|
|
11
|
-
import { ifDefined } from "@prisma-next/utils/defined";
|
|
12
12
|
//#region src/build-contract.ts
|
|
13
13
|
function encodeDefaultLiteralValue(value, codecId, codecLookup) {
|
|
14
14
|
const codec = codecLookup?.get(codecId);
|
|
@@ -38,9 +38,12 @@ function assertStorageSemantics(definition, contract) {
|
|
|
38
38
|
}
|
|
39
39
|
validateIndexTypes(contract, indexTypeRegistry);
|
|
40
40
|
}
|
|
41
|
-
function assertKnownTargetModel(modelsByName, sourceModelName, targetModelName, context) {
|
|
42
|
-
const targetModel = modelsByName.get(targetModelName);
|
|
43
|
-
if (!targetModel)
|
|
41
|
+
function assertKnownTargetModel(modelsByName, modelsByCoordinate, sourceModelName, targetModelName, targetNamespaceId, context) {
|
|
42
|
+
const targetModel = targetNamespaceId !== void 0 && targetNamespaceId.length > 0 ? modelsByCoordinate.get(`${targetNamespaceId}:${targetModelName}`) : modelsByName.get(targetModelName);
|
|
43
|
+
if (!targetModel) {
|
|
44
|
+
const qualified = targetNamespaceId !== void 0 && targetNamespaceId.length > 0 ? `${targetNamespaceId}.${targetModelName}` : targetModelName;
|
|
45
|
+
throw new Error(`${context} on model "${sourceModelName}" references unknown model "${qualified}"`);
|
|
46
|
+
}
|
|
44
47
|
return targetModel;
|
|
45
48
|
}
|
|
46
49
|
function assertTargetTableMatches(sourceModelName, targetModel, referencedTableName, context) {
|
|
@@ -51,11 +54,29 @@ function isValueObjectField(field) {
|
|
|
51
54
|
}
|
|
52
55
|
const JSONB_CODEC_ID = "pg/jsonb@1";
|
|
53
56
|
const JSONB_NATIVE_TYPE = "jsonb";
|
|
54
|
-
function resolveModelNamespaceId(model, modelNameToNamespaceId,
|
|
57
|
+
function resolveModelNamespaceId(model, modelNameToNamespaceId, defaultNamespaceId) {
|
|
55
58
|
if (model.namespaceId !== void 0 && model.namespaceId.length > 0) return model.namespaceId;
|
|
56
|
-
return modelNameToNamespaceId.get(model.modelName) ??
|
|
59
|
+
return modelNameToNamespaceId.get(model.modelName) ?? defaultNamespaceId;
|
|
60
|
+
}
|
|
61
|
+
function buildThroughDescriptor(through, tableNamespaceByName, targetModel, modelName, fieldName) {
|
|
62
|
+
const namespaceId = tableNamespaceByName.get(through.table);
|
|
63
|
+
if (namespaceId === void 0) throw new Error(`buildSqlContractFromDefinition: junction table "${through.table}" for relation "${modelName}.${fieldName}" is not a declared model.`);
|
|
64
|
+
return {
|
|
65
|
+
table: through.table,
|
|
66
|
+
namespaceId,
|
|
67
|
+
parentColumns: through.parentColumns,
|
|
68
|
+
childColumns: through.childColumns,
|
|
69
|
+
targetColumns: targetColumnsForJunction(targetModel, fieldName)
|
|
70
|
+
};
|
|
57
71
|
}
|
|
58
|
-
function
|
|
72
|
+
function targetColumnsForJunction(targetModel, fieldName) {
|
|
73
|
+
const primaryKeyColumns = targetModel.id?.columns;
|
|
74
|
+
if (primaryKeyColumns && primaryKeyColumns.length > 0) return primaryKeyColumns;
|
|
75
|
+
const firstUnique = targetModel.uniques?.find((u) => u.columns.length > 0);
|
|
76
|
+
if (firstUnique) return firstUnique.columns;
|
|
77
|
+
throw new Error(`M:N target model "${targetModel.modelName}" (relation field "${fieldName}") has no primary id or unique key to derive junction targetColumns.`);
|
|
78
|
+
}
|
|
79
|
+
function buildStorageColumn(field, storageValueSetRef, codecLookup) {
|
|
59
80
|
if (isValueObjectField(field)) {
|
|
60
81
|
const encodedDefault = field.default !== void 0 ? encodeColumnDefault(field.default, JSONB_CODEC_ID, codecLookup) : void 0;
|
|
61
82
|
return {
|
|
@@ -78,10 +99,11 @@ function buildStorageColumn(field, codecLookup) {
|
|
|
78
99
|
nullable: field.nullable,
|
|
79
100
|
...ifDefined("typeParams", field.descriptor.typeParams),
|
|
80
101
|
...ifDefined("default", encodedDefault),
|
|
81
|
-
...ifDefined("typeRef", field.descriptor.typeRef)
|
|
102
|
+
...ifDefined("typeRef", field.descriptor.typeRef),
|
|
103
|
+
...ifDefined("valueSet", storageValueSetRef)
|
|
82
104
|
};
|
|
83
105
|
}
|
|
84
|
-
function buildDomainField(field, column) {
|
|
106
|
+
function buildDomainField(field, column, domainValueSetRef) {
|
|
85
107
|
if (isValueObjectField(field)) return {
|
|
86
108
|
type: {
|
|
87
109
|
kind: "valueObject",
|
|
@@ -97,21 +119,30 @@ function buildDomainField(field, column) {
|
|
|
97
119
|
...ifDefined("typeParams", column.typeParams)
|
|
98
120
|
},
|
|
99
121
|
nullable: column.nullable,
|
|
100
|
-
...field.many ? { many: true } : {}
|
|
122
|
+
...field.many ? { many: true } : {},
|
|
123
|
+
...ifDefined("valueSet", domainValueSetRef)
|
|
101
124
|
};
|
|
102
125
|
}
|
|
103
126
|
function collectStorageNamespaceCoordinateIds(definition) {
|
|
104
127
|
const ids = /* @__PURE__ */ new Set();
|
|
105
|
-
ids.add(
|
|
128
|
+
ids.add(definition.target.defaultNamespaceId);
|
|
106
129
|
for (const id of definition.namespaces ?? []) if (id.length > 0) ids.add(id);
|
|
107
130
|
for (const model of definition.models) if (model.namespaceId !== void 0 && model.namespaceId.length > 0) ids.add(model.namespaceId);
|
|
108
131
|
return ids;
|
|
109
132
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
133
|
+
function ensureUnboundNamespaceSlot(namespaces, createNamespace) {
|
|
134
|
+
if (Object.hasOwn(namespaces, UNBOUND_NAMESPACE_ID)) return namespaces;
|
|
135
|
+
const unboundInput = {
|
|
136
|
+
id: UNBOUND_NAMESPACE_ID,
|
|
137
|
+
entries: { table: {} }
|
|
138
|
+
};
|
|
139
|
+
const unbound = createNamespace ? createNamespace(unboundInput) : buildSqlNamespace(unboundInput);
|
|
140
|
+
return blindCast({
|
|
141
|
+
[UNBOUND_NAMESPACE_ID]: unbound,
|
|
142
|
+
...namespaces
|
|
143
|
+
});
|
|
114
144
|
}
|
|
145
|
+
const POSTGRES_ENUM_NAMESPACE_ID = "public";
|
|
115
146
|
function partitionStorageTypesForTarget(targetId, types, namespaceTypes) {
|
|
116
147
|
const documentTypes = {};
|
|
117
148
|
const namespaceEnumTypesById = {};
|
|
@@ -144,19 +175,26 @@ function partitionStorageTypesForTarget(targetId, types, namespaceTypes) {
|
|
|
144
175
|
}
|
|
145
176
|
function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
146
177
|
const target = definition.target.targetId;
|
|
178
|
+
const defaultNamespaceId = definition.target.defaultNamespaceId;
|
|
147
179
|
const targetFamily = "sql";
|
|
180
|
+
const resolveNamespaceId = (m) => m.namespaceId !== void 0 && m.namespaceId.length > 0 ? m.namespaceId : defaultNamespaceId;
|
|
148
181
|
const modelsByName = new Map(definition.models.map((m) => [m.modelName, m]));
|
|
182
|
+
const tableNamespaceByName = new Map(definition.models.map((m) => [m.tableName, m.namespaceId !== void 0 && m.namespaceId.length > 0 ? m.namespaceId : defaultNamespaceId]));
|
|
183
|
+
const modelsByCoordinate = new Map(definition.models.map((m) => [`${resolveNamespaceId(m)}:${m.modelName}`, m]));
|
|
149
184
|
const tablesByNamespace = {};
|
|
150
|
-
const tableNameToNamespaceId = /* @__PURE__ */ new Map();
|
|
151
185
|
const modelNameToNamespaceId = /* @__PURE__ */ new Map();
|
|
152
186
|
const executionDefaults = [];
|
|
153
187
|
const modelsByNamespace = {};
|
|
154
|
-
const
|
|
188
|
+
const rootEntries = [];
|
|
155
189
|
for (const semanticModel of definition.models) {
|
|
156
190
|
const tableName = semanticModel.tableName;
|
|
157
|
-
const namespaceId = semanticModel.namespaceId !== void 0 && semanticModel.namespaceId.length > 0 ? semanticModel.namespaceId :
|
|
191
|
+
const namespaceId = semanticModel.namespaceId !== void 0 && semanticModel.namespaceId.length > 0 ? semanticModel.namespaceId : defaultNamespaceId;
|
|
158
192
|
modelNameToNamespaceId.set(semanticModel.modelName, namespaceId);
|
|
159
|
-
|
|
193
|
+
if (!semanticModel.sharesBaseTable) rootEntries.push({
|
|
194
|
+
tableName,
|
|
195
|
+
namespaceId,
|
|
196
|
+
ref: crossRef(semanticModel.modelName, namespaceId)
|
|
197
|
+
});
|
|
160
198
|
const columns = {};
|
|
161
199
|
const fieldToColumn = {};
|
|
162
200
|
const domainFields = {};
|
|
@@ -167,10 +205,23 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
167
205
|
if (field.default !== void 0) throw new Error(`Field "${semanticModel.modelName}.${field.fieldName}" cannot define both default and executionDefaults.`);
|
|
168
206
|
if (field.nullable) throw new Error(`Field "${semanticModel.modelName}.${field.fieldName}" cannot be nullable when executionDefaults are present.`);
|
|
169
207
|
}
|
|
170
|
-
const
|
|
208
|
+
const enumHandle = !isValueObjectField(field) ? field.enumTypeHandle : void 0;
|
|
209
|
+
const storageValueSetRef = enumHandle !== void 0 ? {
|
|
210
|
+
plane: "storage",
|
|
211
|
+
entityKind: "value-set",
|
|
212
|
+
namespaceId: defaultNamespaceId,
|
|
213
|
+
name: enumHandle.enumName
|
|
214
|
+
} : void 0;
|
|
215
|
+
const domainValueSetRef = enumHandle !== void 0 ? {
|
|
216
|
+
plane: "domain",
|
|
217
|
+
entityKind: "enum",
|
|
218
|
+
namespaceId: defaultNamespaceId,
|
|
219
|
+
name: enumHandle.enumName
|
|
220
|
+
} : void 0;
|
|
221
|
+
const column = buildStorageColumn(field, storageValueSetRef, codecLookup);
|
|
171
222
|
columns[field.columnName] = column;
|
|
172
223
|
fieldToColumn[field.fieldName] = field.columnName;
|
|
173
|
-
domainFields[field.fieldName] = buildDomainField(field, column);
|
|
224
|
+
domainFields[field.fieldName] = buildDomainField(field, column, domainValueSetRef);
|
|
174
225
|
if (isValueObjectField(field)) domainFieldRefs[field.fieldName] = {
|
|
175
226
|
kind: "valueObject",
|
|
176
227
|
name: field.valueObjectName,
|
|
@@ -190,9 +241,32 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
190
241
|
});
|
|
191
242
|
}
|
|
192
243
|
const foreignKeys = (semanticModel.foreignKeys ?? []).map((fk) => {
|
|
193
|
-
|
|
244
|
+
if (fk.references.spaceId !== void 0) {
|
|
245
|
+
const targetNamespaceId = fk.references.namespaceId ?? defaultNamespaceId;
|
|
246
|
+
return {
|
|
247
|
+
source: {
|
|
248
|
+
namespaceId: asNamespaceId(namespaceId),
|
|
249
|
+
tableName,
|
|
250
|
+
columns: fk.columns
|
|
251
|
+
},
|
|
252
|
+
target: {
|
|
253
|
+
namespaceId: asNamespaceId(targetNamespaceId),
|
|
254
|
+
tableName: fk.references.table,
|
|
255
|
+
columns: fk.references.columns,
|
|
256
|
+
spaceId: fk.references.spaceId
|
|
257
|
+
},
|
|
258
|
+
...applyFkDefaults({
|
|
259
|
+
...ifDefined("constraint", fk.constraint),
|
|
260
|
+
...ifDefined("index", fk.index)
|
|
261
|
+
}, definition.foreignKeyDefaults),
|
|
262
|
+
...ifDefined("name", fk.name),
|
|
263
|
+
...ifDefined("onDelete", fk.onDelete),
|
|
264
|
+
...ifDefined("onUpdate", fk.onUpdate)
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const targetModel = assertKnownTargetModel(modelsByName, modelsByCoordinate, semanticModel.modelName, fk.references.model, fk.references.namespaceId, "Foreign key");
|
|
194
268
|
assertTargetTableMatches(semanticModel.modelName, targetModel, fk.references.table, "Foreign key");
|
|
195
|
-
const targetNamespaceId = fk.references.namespaceId ?? (targetModel.namespaceId !== void 0 && targetModel.namespaceId.length > 0 ? targetModel.namespaceId :
|
|
269
|
+
const targetNamespaceId = fk.references.namespaceId ?? (targetModel.namespaceId !== void 0 && targetModel.namespaceId.length > 0 ? targetModel.namespaceId : defaultNamespaceId);
|
|
196
270
|
return {
|
|
197
271
|
source: {
|
|
198
272
|
namespaceId: asNamespaceId(namespaceId),
|
|
@@ -213,55 +287,80 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
213
287
|
...ifDefined("onUpdate", fk.onUpdate)
|
|
214
288
|
};
|
|
215
289
|
});
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
columns
|
|
227
|
-
...ifDefined("
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
290
|
+
if (!semanticModel.sharesBaseTable) {
|
|
291
|
+
const checksForTable = Object.entries(columns).flatMap(([columnName, col]) => {
|
|
292
|
+
const valueSet = col.valueSet;
|
|
293
|
+
return valueSet === void 0 ? [] : [{
|
|
294
|
+
name: `${tableName}_${columnName}_check`,
|
|
295
|
+
column: columnName,
|
|
296
|
+
valueSet
|
|
297
|
+
}];
|
|
298
|
+
});
|
|
299
|
+
const tableInput = {
|
|
300
|
+
columns,
|
|
301
|
+
...ifDefined("control", semanticModel.control),
|
|
302
|
+
uniques: (semanticModel.uniques ?? []).map((u) => ({
|
|
303
|
+
columns: u.columns,
|
|
304
|
+
...ifDefined("name", u.name)
|
|
305
|
+
})),
|
|
306
|
+
indexes: (semanticModel.indexes ?? []).map((i) => ({
|
|
307
|
+
columns: i.columns,
|
|
308
|
+
...ifDefined("name", i.name),
|
|
309
|
+
...ifDefined("type", i.type),
|
|
310
|
+
...ifDefined("options", i.options)
|
|
311
|
+
})),
|
|
312
|
+
foreignKeys,
|
|
313
|
+
...semanticModel.id ? { primaryKey: {
|
|
314
|
+
columns: semanticModel.id.columns,
|
|
315
|
+
...ifDefined("name", semanticModel.id.name)
|
|
316
|
+
} } : {},
|
|
317
|
+
...checksForTable.length > 0 ? { checks: checksForTable } : {}
|
|
318
|
+
};
|
|
319
|
+
let nsTables = tablesByNamespace[namespaceId];
|
|
320
|
+
if (nsTables === void 0) {
|
|
321
|
+
nsTables = {};
|
|
322
|
+
tablesByNamespace[namespaceId] = nsTables;
|
|
323
|
+
}
|
|
324
|
+
if (nsTables[tableName] !== void 0) throw new Error(`buildSqlContractFromDefinition: duplicate table "${tableName}" in namespace "${namespaceId}".`);
|
|
325
|
+
nsTables[tableName] = new StorageTable(tableInput);
|
|
241
326
|
}
|
|
242
|
-
if (nsTables[tableName] !== void 0) throw new Error(`buildSqlContractFromDefinition: duplicate table "${tableName}" in namespace "${namespaceId}".`);
|
|
243
|
-
nsTables[tableName] = new StorageTable(tableInput);
|
|
244
327
|
const storageFields = {};
|
|
245
328
|
for (const [fieldName, columnName] of Object.entries(fieldToColumn)) storageFields[fieldName] = { column: columnName };
|
|
246
329
|
const columnToField = new Map(Object.entries(fieldToColumn).map(([field, col]) => [col, field]));
|
|
247
330
|
const modelRelations = {};
|
|
248
331
|
for (const relation of semanticModel.relations ?? []) {
|
|
249
|
-
|
|
332
|
+
if (relation.spaceId !== void 0) {
|
|
333
|
+
const targetNamespaceId = relation.namespaceId ?? defaultNamespaceId;
|
|
334
|
+
modelRelations[relation.fieldName] = {
|
|
335
|
+
to: crossRef(relation.toModel, targetNamespaceId, relation.spaceId),
|
|
336
|
+
cardinality: "N:1",
|
|
337
|
+
on: {
|
|
338
|
+
localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),
|
|
339
|
+
targetFields: relation.on.childColumns
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
const targetModel = assertKnownTargetModel(modelsByName, modelsByCoordinate, semanticModel.modelName, relation.toModel, relation.toNamespaceId, "Relation");
|
|
250
345
|
assertTargetTableMatches(semanticModel.modelName, targetModel, relation.toTable, "Relation");
|
|
251
|
-
if (relation.cardinality === "N:M" && !relation.through) throw new Error(`Relation "${semanticModel.modelName}.${relation.fieldName}" with cardinality "N:M" requires through metadata`);
|
|
252
346
|
const targetColumnToField = new Map(targetModel.fields.map((f) => [f.columnName, f.fieldName]));
|
|
253
|
-
|
|
254
|
-
|
|
347
|
+
const to = crossRef(relation.toModel, relation.toNamespaceId !== void 0 && relation.toNamespaceId.length > 0 ? relation.toNamespaceId : resolveModelNamespaceId(targetModel, modelNameToNamespaceId, defaultNamespaceId));
|
|
348
|
+
const on = {
|
|
349
|
+
localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),
|
|
350
|
+
targetFields: relation.on.childColumns.map((col) => targetColumnToField.get(col) ?? col)
|
|
351
|
+
};
|
|
352
|
+
if (relation.cardinality === "N:M") {
|
|
353
|
+
if (!relation.through) throw new Error(`Relation "${semanticModel.modelName}.${relation.fieldName}" with cardinality "N:M" requires through metadata`);
|
|
354
|
+
modelRelations[relation.fieldName] = {
|
|
355
|
+
to,
|
|
356
|
+
cardinality: "N:M",
|
|
357
|
+
on,
|
|
358
|
+
through: buildThroughDescriptor(relation.through, tableNamespaceByName, targetModel, semanticModel.modelName, relation.fieldName)
|
|
359
|
+
};
|
|
360
|
+
} else modelRelations[relation.fieldName] = {
|
|
361
|
+
to,
|
|
255
362
|
cardinality: relation.cardinality,
|
|
256
|
-
on
|
|
257
|
-
localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),
|
|
258
|
-
targetFields: relation.on.childColumns.map((col) => targetColumnToField.get(col) ?? col)
|
|
259
|
-
},
|
|
260
|
-
...relation.through ? { through: {
|
|
261
|
-
table: relation.through.table,
|
|
262
|
-
parentCols: relation.through.parentColumns,
|
|
263
|
-
childCols: relation.through.childColumns
|
|
264
|
-
} } : void 0
|
|
363
|
+
on
|
|
265
364
|
};
|
|
266
365
|
}
|
|
267
366
|
let namespaceModels = modelsByNamespace[namespaceId];
|
|
@@ -272,12 +371,20 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
272
371
|
namespaceModels[semanticModel.modelName] = {
|
|
273
372
|
storage: {
|
|
274
373
|
table: tableName,
|
|
374
|
+
namespaceId,
|
|
275
375
|
fields: storageFields
|
|
276
376
|
},
|
|
277
377
|
fields: domainFields,
|
|
278
378
|
relations: modelRelations
|
|
279
379
|
};
|
|
280
380
|
}
|
|
381
|
+
const rootTableNameCounts = /* @__PURE__ */ new Map();
|
|
382
|
+
for (const entry of rootEntries) rootTableNameCounts.set(entry.tableName, (rootTableNameCounts.get(entry.tableName) ?? 0) + 1);
|
|
383
|
+
const roots = {};
|
|
384
|
+
for (const entry of rootEntries) {
|
|
385
|
+
const key = (rootTableNameCounts.get(entry.tableName) ?? 0) > 1 ? `${entry.namespaceId}.${entry.tableName}` : entry.tableName;
|
|
386
|
+
roots[key] = entry.ref;
|
|
387
|
+
}
|
|
281
388
|
const rawStorageTypes = definition.storageTypes ?? {};
|
|
282
389
|
const { documentTypes, namespaceEnumTypesById } = partitionStorageTypesForTarget(target, Object.fromEntries(Object.entries(rawStorageTypes).map(([name, entry]) => {
|
|
283
390
|
if (isPostgresEnumStorageEntry(entry)) return [name, entry];
|
|
@@ -290,19 +397,46 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
290
397
|
})), definition.namespaceTypes);
|
|
291
398
|
const namespaceCoordinateIds = collectStorageNamespaceCoordinateIds(definition);
|
|
292
399
|
for (const id of Object.keys(namespaceEnumTypesById)) namespaceCoordinateIds.add(id);
|
|
400
|
+
const domainEnumsByNs = {};
|
|
401
|
+
const storageValueSetsByNs = {};
|
|
402
|
+
for (const [enumName, handle] of Object.entries(definition.enums ?? {})) {
|
|
403
|
+
if (enumName !== handle.enumName) throw new Error(`enum declaration key "${enumName}" must match enumType name "${handle.enumName}". Aliases are not supported.`);
|
|
404
|
+
const nsId = defaultNamespaceId;
|
|
405
|
+
let domainSlot = domainEnumsByNs[nsId];
|
|
406
|
+
if (domainSlot === void 0) {
|
|
407
|
+
domainSlot = {};
|
|
408
|
+
domainEnumsByNs[nsId] = domainSlot;
|
|
409
|
+
}
|
|
410
|
+
domainSlot[enumName] = {
|
|
411
|
+
codecId: handle.codecId,
|
|
412
|
+
members: handle.enumMembers
|
|
413
|
+
};
|
|
414
|
+
let storageSlot = storageValueSetsByNs[nsId];
|
|
415
|
+
if (storageSlot === void 0) {
|
|
416
|
+
storageSlot = {};
|
|
417
|
+
storageValueSetsByNs[nsId] = storageSlot;
|
|
418
|
+
}
|
|
419
|
+
storageSlot[enumName] = {
|
|
420
|
+
kind: "value-set",
|
|
421
|
+
values: handle.values
|
|
422
|
+
};
|
|
423
|
+
}
|
|
293
424
|
const { createNamespace } = definition;
|
|
294
425
|
const namespaces = blindCast(Object.fromEntries([...namespaceCoordinateIds].sort().map((id) => {
|
|
295
426
|
const enumTypes = namespaceEnumTypesById[id];
|
|
427
|
+
const valueSetEntries = storageValueSetsByNs[id];
|
|
296
428
|
const nsInput = {
|
|
297
429
|
id,
|
|
298
|
-
|
|
299
|
-
|
|
430
|
+
entries: {
|
|
431
|
+
table: tablesByNamespace[id] ?? {},
|
|
432
|
+
...valueSetEntries !== void 0 && Object.keys(valueSetEntries).length > 0 ? { valueSet: valueSetEntries } : {}
|
|
433
|
+
}
|
|
300
434
|
};
|
|
301
|
-
return [id, createNamespace ? createNamespace(nsInput) : buildSqlNamespace(nsInput)];
|
|
435
|
+
return [id, createNamespace ? createNamespace(nsInput, enumTypes) : buildSqlNamespace(nsInput)];
|
|
302
436
|
})));
|
|
303
437
|
const storageWithoutHash = {
|
|
304
438
|
...Object.keys(documentTypes).length > 0 ? { types: documentTypes } : {},
|
|
305
|
-
namespaces
|
|
439
|
+
namespaces: ensureUnboundNamespaceSlot(namespaces, createNamespace)
|
|
306
440
|
};
|
|
307
441
|
const storageHash = definition.storageHash ? coreHash(definition.storageHash) : computeStorageHash({
|
|
308
442
|
target,
|
|
@@ -354,20 +488,24 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
354
488
|
},
|
|
355
489
|
nullable: f.nullable
|
|
356
490
|
}])) }])) : void 0;
|
|
357
|
-
const defaultNamespaceId = defaultModelNamespaceId(target);
|
|
358
491
|
const domainNamespaceIds = new Set(Object.keys(modelsByNamespace));
|
|
359
492
|
if (domainNamespaceIds.size === 0) domainNamespaceIds.add(defaultNamespaceId);
|
|
360
493
|
if (valueObjects !== void 0) domainNamespaceIds.add(defaultNamespaceId);
|
|
494
|
+
for (const nsId of Object.keys(domainEnumsByNs)) domainNamespaceIds.add(nsId);
|
|
495
|
+
const domainNamespaces = Object.fromEntries([...domainNamespaceIds].sort().map((namespaceId) => {
|
|
496
|
+
const modelsInNs = modelsByNamespace[namespaceId] ?? {};
|
|
497
|
+
const enumsInNs = domainEnumsByNs[namespaceId];
|
|
498
|
+
return [namespaceId, {
|
|
499
|
+
models: modelsInNs,
|
|
500
|
+
...namespaceId === defaultNamespaceId && valueObjects !== void 0 ? { valueObjects } : {},
|
|
501
|
+
...enumsInNs !== void 0 && Object.keys(enumsInNs).length > 0 ? { enum: enumsInNs } : {}
|
|
502
|
+
}];
|
|
503
|
+
}));
|
|
361
504
|
const contract = {
|
|
362
505
|
target,
|
|
363
506
|
targetFamily,
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
return [namespaceId, namespaceId === defaultNamespaceId && valueObjects !== void 0 ? {
|
|
367
|
-
models: modelsInNs,
|
|
368
|
-
valueObjects
|
|
369
|
-
} : { models: modelsInNs }];
|
|
370
|
-
})) },
|
|
507
|
+
...ifDefined("defaultControlPolicy", definition.defaultControlPolicy),
|
|
508
|
+
domain: { namespaces: domainNamespaces },
|
|
371
509
|
roots,
|
|
372
510
|
storage,
|
|
373
511
|
...executionWithHash ? { execution: executionWithHash } : {},
|
|
@@ -382,4 +520,4 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
382
520
|
//#endregion
|
|
383
521
|
export { buildSqlContractFromDefinition as t };
|
|
384
522
|
|
|
385
|
-
//# sourceMappingURL=build-contract-
|
|
523
|
+
//# sourceMappingURL=build-contract-C-x2pfu4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-contract-C-x2pfu4.mjs","names":[],"sources":["../src/build-contract.ts"],"sourcesContent":["import {\n computeExecutionHash,\n computeProfileHash,\n computeStorageHash,\n} from '@prisma-next/contract/hashing';\nimport {\n asNamespaceId,\n type ColumnDefault,\n type ColumnDefaultLiteralInputValue,\n type Contract,\n type ContractEnum,\n type ContractField,\n type ContractModel,\n type ContractRelation,\n type ContractRelationThrough,\n type ContractValueObject,\n type CrossReference,\n coreHash,\n crossRef,\n type ExecutionMutationDefault,\n type JsonValue,\n type StorageHashBase,\n type ValueSetRef,\n} from '@prisma-next/contract/types';\nimport { type CapabilityMatrix, mergeCapabilityMatrices } from '@prisma-next/contract-authoring';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport { sqlContractCanonicalizationHooks } from '@prisma-next/sql-contract/canonicalization-hooks';\nimport { validateIndexTypes } from '@prisma-next/sql-contract/index-type-validation';\nimport {\n createIndexTypeRegistry,\n type IndexTypeMap,\n type IndexTypeRegistration,\n} from '@prisma-next/sql-contract/index-types';\nimport {\n applyFkDefaults,\n buildSqlNamespace,\n type CheckConstraintInput,\n isPostgresEnumStorageEntry,\n type PostgresEnumStorageEntry,\n type SqlNamespaceTablesInput,\n SqlStorage,\n type SqlStorageInput,\n type StorageColumn,\n StorageTable,\n type StorageTableInput,\n type StorageTypeInstance,\n type StorageValueSetInput,\n toStorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport { validateStorageSemantics } from '@prisma-next/sql-contract/validators';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ContractDefinition,\n FieldNode,\n ModelNode,\n RelationNode,\n ValueObjectFieldNode,\n} from './contract-definition';\n\ntype DomainFieldRef =\n | { readonly kind: 'scalar'; readonly many?: boolean }\n | { readonly kind: 'valueObject'; readonly name: string; readonly many?: boolean };\n\nfunction encodeDefaultLiteralValue(\n value: ColumnDefaultLiteralInputValue,\n codecId: string,\n codecLookup?: CodecLookup,\n): JsonValue {\n const codec = codecLookup?.get(codecId);\n if (codec) {\n return codec.encodeJson(value);\n }\n return value as JsonValue;\n}\n\nfunction encodeColumnDefault(\n defaultInput: ColumnDefault,\n codecId: string,\n codecLookup?: CodecLookup,\n): ColumnDefault {\n if (defaultInput.kind === 'function') {\n return { kind: 'function', expression: defaultInput.expression };\n }\n return {\n kind: 'literal',\n value: encodeDefaultLiteralValue(defaultInput.value, codecId, codecLookup),\n };\n}\n\nfunction assertStorageSemantics(\n definition: ContractDefinition,\n contract: Contract<SqlStorage>,\n): void {\n const semanticErrors = validateStorageSemantics(contract.storage);\n if (semanticErrors.length > 0) {\n throw new Error(`Contract semantic validation failed: ${semanticErrors.join('; ')}`);\n }\n\n const indexTypeRegistry = createIndexTypeRegistry();\n const packsToRegister: ReadonlyArray<{ readonly id?: string; readonly indexTypes?: unknown }> = [\n definition.target,\n ...Object.values(definition.extensionPacks ?? {}),\n ];\n for (const pack of packsToRegister) {\n const registration = pack.indexTypes;\n if (registration === undefined) continue;\n if (\n typeof registration !== 'object' ||\n registration === null ||\n !Array.isArray((registration as { entries?: unknown }).entries)\n ) {\n throw new Error(\n `Pack \"${pack.id ?? '<unknown>'}\" declares \"indexTypes\" but its value is not an IndexTypeRegistration (expected an object with an \"entries\" array; got ${typeof registration}).`,\n );\n }\n for (const entry of (registration as IndexTypeRegistration<IndexTypeMap>).entries) {\n indexTypeRegistry.register(entry);\n }\n }\n validateIndexTypes(contract, indexTypeRegistry);\n}\n\nfunction assertKnownTargetModel(\n modelsByName: ReadonlyMap<string, ModelNode>,\n modelsByCoordinate: ReadonlyMap<string, ModelNode>,\n sourceModelName: string,\n targetModelName: string,\n targetNamespaceId: string | undefined,\n context: string,\n): ModelNode {\n const targetModel =\n targetNamespaceId !== undefined && targetNamespaceId.length > 0\n ? modelsByCoordinate.get(`${targetNamespaceId}:${targetModelName}`)\n : modelsByName.get(targetModelName);\n if (!targetModel) {\n const qualified =\n targetNamespaceId !== undefined && targetNamespaceId.length > 0\n ? `${targetNamespaceId}.${targetModelName}`\n : targetModelName;\n throw new Error(\n `${context} on model \"${sourceModelName}\" references unknown model \"${qualified}\"`,\n );\n }\n return targetModel;\n}\n\nfunction assertTargetTableMatches(\n sourceModelName: string,\n targetModel: ModelNode,\n referencedTableName: string,\n context: string,\n): void {\n if (targetModel.tableName !== referencedTableName) {\n throw new Error(\n `${context} on model \"${sourceModelName}\" references table \"${referencedTableName}\" but model \"${targetModel.modelName}\" maps to \"${targetModel.tableName}\"`,\n );\n }\n}\n\nfunction isValueObjectField(\n field: FieldNode | ValueObjectFieldNode,\n): field is ValueObjectFieldNode {\n return 'valueObjectName' in field;\n}\n\nconst JSONB_CODEC_ID = 'pg/jsonb@1';\nconst JSONB_NATIVE_TYPE = 'jsonb';\n\nfunction resolveModelNamespaceId(\n model: ModelNode,\n modelNameToNamespaceId: ReadonlyMap<string, string>,\n defaultNamespaceId: string,\n): string {\n if (model.namespaceId !== undefined && model.namespaceId.length > 0) {\n return model.namespaceId;\n }\n return modelNameToNamespaceId.get(model.modelName) ?? defaultNamespaceId;\n}\n\nfunction buildThroughDescriptor(\n through: NonNullable<RelationNode['through']>,\n tableNamespaceByName: ReadonlyMap<string, string>,\n targetModel: ModelNode,\n modelName: string,\n fieldName: string,\n): ContractRelationThrough {\n const namespaceId = tableNamespaceByName.get(through.table);\n if (namespaceId === undefined) {\n throw new Error(\n `buildSqlContractFromDefinition: junction table \"${through.table}\" for relation \"${modelName}.${fieldName}\" is not a declared model.`,\n );\n }\n\n return {\n table: through.table,\n namespaceId,\n parentColumns: through.parentColumns,\n childColumns: through.childColumns,\n targetColumns: targetColumnsForJunction(targetModel, fieldName),\n };\n}\n\nfunction targetColumnsForJunction(targetModel: ModelNode, fieldName: string): readonly string[] {\n const primaryKeyColumns = targetModel.id?.columns;\n if (primaryKeyColumns && primaryKeyColumns.length > 0) {\n return primaryKeyColumns;\n }\n const firstUnique = targetModel.uniques?.find((u) => u.columns.length > 0);\n if (firstUnique) {\n return firstUnique.columns;\n }\n throw new Error(\n `M:N target model \"${targetModel.modelName}\" (relation field \"${fieldName}\") has no primary id or unique key to derive junction targetColumns.`,\n );\n}\n\nfunction buildStorageColumn(\n field: FieldNode | ValueObjectFieldNode,\n storageValueSetRef: ValueSetRef | undefined,\n codecLookup?: CodecLookup,\n): StorageColumn {\n if (isValueObjectField(field)) {\n const encodedDefault =\n field.default !== undefined\n ? encodeColumnDefault(field.default, JSONB_CODEC_ID, codecLookup)\n : undefined;\n\n return {\n nativeType: JSONB_NATIVE_TYPE,\n codecId: JSONB_CODEC_ID,\n nullable: field.nullable,\n ...ifDefined('default', encodedDefault),\n };\n }\n\n if (field.many) {\n return {\n nativeType: JSONB_NATIVE_TYPE,\n codecId: JSONB_CODEC_ID,\n nullable: field.nullable,\n };\n }\n\n const codecId = field.descriptor.codecId;\n const encodedDefault =\n field.default !== undefined\n ? encodeColumnDefault(field.default, codecId, codecLookup)\n : undefined;\n\n return {\n nativeType: field.descriptor.nativeType,\n codecId,\n nullable: field.nullable,\n ...ifDefined('typeParams', field.descriptor.typeParams),\n ...ifDefined('default', encodedDefault),\n ...ifDefined('typeRef', field.descriptor.typeRef),\n ...ifDefined('valueSet', storageValueSetRef),\n };\n}\n\nfunction buildDomainField(\n field: FieldNode | ValueObjectFieldNode,\n column: StorageColumn,\n domainValueSetRef: ValueSetRef | undefined,\n): ContractField {\n if (isValueObjectField(field)) {\n return {\n type: { kind: 'valueObject', name: field.valueObjectName },\n nullable: field.nullable,\n ...(field.many ? { many: true } : {}),\n };\n }\n\n return {\n type: {\n kind: 'scalar',\n codecId: column.codecId,\n ...ifDefined('typeParams', column.typeParams),\n },\n nullable: column.nullable,\n ...(field.many ? { many: true } : {}),\n ...ifDefined('valueSet', domainValueSetRef),\n };\n}\n\nfunction collectStorageNamespaceCoordinateIds(definition: ContractDefinition): Set<string> {\n const ids = new Set<string>();\n ids.add(definition.target.defaultNamespaceId);\n for (const id of definition.namespaces ?? []) {\n if (id.length > 0) {\n ids.add(id);\n }\n }\n for (const model of definition.models) {\n if (model.namespaceId !== undefined && model.namespaceId.length > 0) {\n ids.add(model.namespaceId);\n }\n }\n return ids;\n}\n\nfunction ensureUnboundNamespaceSlot(\n namespaces: SqlStorageInput['namespaces'],\n createNamespace: ContractDefinition['createNamespace'],\n): SqlStorageInput['namespaces'] {\n if (Object.hasOwn(namespaces, UNBOUND_NAMESPACE_ID)) {\n return namespaces;\n }\n const unboundInput: SqlNamespaceTablesInput = {\n id: UNBOUND_NAMESPACE_ID,\n entries: { table: {} },\n };\n const unbound = createNamespace ? createNamespace(unboundInput) : buildSqlNamespace(unboundInput);\n return blindCast<\n SqlStorageInput['namespaces'],\n 'createNamespace may return a target namespace concretion; the unbound slot matches SqlNamespace at runtime'\n >({\n [UNBOUND_NAMESPACE_ID]: unbound,\n ...namespaces,\n });\n}\n\nconst POSTGRES_ENUM_NAMESPACE_ID = 'public';\n\nfunction partitionStorageTypesForTarget(\n targetId: string,\n types: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>,\n namespaceTypes?: Readonly<Record<string, Readonly<Record<string, PostgresEnumStorageEntry>>>>,\n): {\n readonly documentTypes: Record<string, StorageTypeInstance>;\n readonly namespaceEnumTypesById: Record<string, Record<string, PostgresEnumStorageEntry>>;\n} {\n const documentTypes: Record<string, StorageTypeInstance> = {};\n const namespaceEnumTypesById: Record<string, Record<string, PostgresEnumStorageEntry>> = {};\n for (const [name, entry] of Object.entries(types)) {\n if (isPostgresEnumStorageEntry(entry)) {\n if (targetId !== 'postgres') {\n throw new Error(\n `buildSqlContractFromDefinition: postgres enum \"${name}\" is only valid when target is \"postgres\" (got \"${targetId}\").`,\n );\n }\n let slot = namespaceEnumTypesById[POSTGRES_ENUM_NAMESPACE_ID];\n if (slot === undefined) {\n slot = {};\n namespaceEnumTypesById[POSTGRES_ENUM_NAMESPACE_ID] = slot;\n }\n slot[name] = entry;\n continue;\n }\n documentTypes[name] = entry;\n }\n if (namespaceTypes !== undefined) {\n for (const [nsId, enumsInNs] of Object.entries(namespaceTypes)) {\n for (const [name, entry] of Object.entries(enumsInNs)) {\n if (targetId !== 'postgres') {\n throw new Error(\n `buildSqlContractFromDefinition: postgres enum \"${name}\" is only valid when target is \"postgres\" (got \"${targetId}\").`,\n );\n }\n let slot = namespaceEnumTypesById[nsId];\n if (slot === undefined) {\n slot = {};\n namespaceEnumTypesById[nsId] = slot;\n }\n slot[name] = entry;\n }\n }\n }\n return { documentTypes, namespaceEnumTypesById };\n}\n\nexport function buildSqlContractFromDefinition(\n definition: ContractDefinition,\n codecLookup?: CodecLookup,\n): Contract<SqlStorage> {\n const target = definition.target.targetId;\n const defaultNamespaceId = definition.target.defaultNamespaceId;\n const targetFamily = 'sql';\n const resolveNamespaceId = (m: ModelNode): string =>\n m.namespaceId !== undefined && m.namespaceId.length > 0 ? m.namespaceId : defaultNamespaceId;\n const modelsByName = new Map(definition.models.map((m) => [m.modelName, m]));\n const tableNamespaceByName = new Map(\n definition.models.map((m) => [\n m.tableName,\n m.namespaceId !== undefined && m.namespaceId.length > 0 ? m.namespaceId : defaultNamespaceId,\n ]),\n );\n const modelsByCoordinate = new Map(\n definition.models.map((m) => [`${resolveNamespaceId(m)}:${m.modelName}`, m]),\n );\n\n const tablesByNamespace: Record<string, Record<string, StorageTable>> = {};\n const modelNameToNamespaceId = new Map<string, string>();\n const executionDefaults: ExecutionMutationDefault[] = [];\n const modelsByNamespace: Record<string, Record<string, ContractModel>> = {};\n const rootEntries: Array<{\n readonly tableName: string;\n readonly namespaceId: string;\n readonly ref: CrossReference;\n }> = [];\n\n for (const semanticModel of definition.models) {\n const tableName = semanticModel.tableName;\n const namespaceId =\n semanticModel.namespaceId !== undefined && semanticModel.namespaceId.length > 0\n ? semanticModel.namespaceId\n : defaultNamespaceId;\n modelNameToNamespaceId.set(semanticModel.modelName, namespaceId);\n // STI variants share the base table; the base model already owns this\n // table name and its root, so the variant contributes neither.\n if (!semanticModel.sharesBaseTable) {\n rootEntries.push({\n tableName,\n namespaceId,\n ref: crossRef(semanticModel.modelName, namespaceId),\n });\n }\n\n // --- Build storage table ---\n\n const columns: Record<string, StorageColumn> = {};\n const fieldToColumn: Record<string, string> = {};\n const domainFields: Record<string, ContractField> = {};\n const domainFieldRefs: Record<string, DomainFieldRef> = {};\n\n for (const field of semanticModel.fields) {\n const executionDefaultPhases =\n field.executionDefaults?.onCreate || field.executionDefaults?.onUpdate\n ? field.executionDefaults\n : undefined;\n if (executionDefaultPhases) {\n if (field.default !== undefined) {\n throw new Error(\n `Field \"${semanticModel.modelName}.${field.fieldName}\" cannot define both default and executionDefaults.`,\n );\n }\n if (field.nullable) {\n throw new Error(\n `Field \"${semanticModel.modelName}.${field.fieldName}\" cannot be nullable when executionDefaults are present.`,\n );\n }\n }\n\n const enumHandle = !isValueObjectField(field) ? field.enumTypeHandle : undefined;\n // Authored enums are always registered under the contract's defaultNamespaceId\n // (see the enum registration loop below), so refs must point there regardless\n // of which namespace the consuming model lives in.\n const storageValueSetRef: ValueSetRef | undefined =\n enumHandle !== undefined\n ? {\n plane: 'storage',\n entityKind: 'value-set',\n namespaceId: defaultNamespaceId,\n name: enumHandle.enumName,\n }\n : undefined;\n const domainValueSetRef: ValueSetRef | undefined =\n enumHandle !== undefined\n ? {\n plane: 'domain',\n entityKind: 'enum',\n namespaceId: defaultNamespaceId,\n name: enumHandle.enumName,\n }\n : undefined;\n\n const column = buildStorageColumn(field, storageValueSetRef, codecLookup);\n columns[field.columnName] = column;\n fieldToColumn[field.fieldName] = field.columnName;\n\n domainFields[field.fieldName] = buildDomainField(field, column, domainValueSetRef);\n\n if (isValueObjectField(field)) {\n domainFieldRefs[field.fieldName] = {\n kind: 'valueObject',\n name: field.valueObjectName,\n ...(field.many ? { many: true } : {}),\n };\n } else if (field.many) {\n domainFieldRefs[field.fieldName] = { kind: 'scalar', many: true };\n }\n\n if (executionDefaultPhases) {\n executionDefaults.push({\n ref: { table: tableName, column: field.columnName },\n ...ifDefined('onCreate', executionDefaultPhases.onCreate),\n ...ifDefined('onUpdate', executionDefaultPhases.onUpdate),\n });\n }\n }\n\n const foreignKeys = (semanticModel.foreignKeys ?? []).map((fk) => {\n if (fk.references.spaceId !== undefined) {\n // Cross-space FK: the target lives in a different contract space.\n // Skip local model lookup and carry the spaceId coordinate through.\n const targetNamespaceId = fk.references.namespaceId ?? defaultNamespaceId;\n return {\n source: { namespaceId: asNamespaceId(namespaceId), tableName, columns: fk.columns },\n target: {\n namespaceId: asNamespaceId(targetNamespaceId),\n tableName: fk.references.table,\n columns: fk.references.columns,\n spaceId: fk.references.spaceId,\n },\n ...applyFkDefaults(\n {\n ...ifDefined('constraint', fk.constraint),\n ...ifDefined('index', fk.index),\n },\n definition.foreignKeyDefaults,\n ),\n ...ifDefined('name', fk.name),\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n };\n }\n\n const targetModel = assertKnownTargetModel(\n modelsByName,\n modelsByCoordinate,\n semanticModel.modelName,\n fk.references.model,\n fk.references.namespaceId,\n 'Foreign key',\n );\n assertTargetTableMatches(\n semanticModel.modelName,\n targetModel,\n fk.references.table,\n 'Foreign key',\n );\n const targetNamespaceId =\n fk.references.namespaceId ??\n (targetModel.namespaceId !== undefined && targetModel.namespaceId.length > 0\n ? targetModel.namespaceId\n : defaultNamespaceId);\n return {\n source: { namespaceId: asNamespaceId(namespaceId), tableName, columns: fk.columns },\n target: {\n namespaceId: asNamespaceId(targetNamespaceId),\n tableName: fk.references.table,\n columns: fk.references.columns,\n },\n ...applyFkDefaults(\n {\n ...ifDefined('constraint', fk.constraint),\n ...ifDefined('index', fk.index),\n },\n definition.foreignKeyDefaults,\n ),\n ...ifDefined('name', fk.name),\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n };\n });\n\n // STI variants share the base table: their columns are already\n // materialised onto the base `ModelNode`, so the variant builds a domain\n // model (below) but no storage table of its own.\n if (!semanticModel.sharesBaseTable) {\n const checksForTable: CheckConstraintInput[] = Object.entries(columns).flatMap(\n ([columnName, col]) => {\n const valueSet = col.valueSet;\n return valueSet === undefined\n ? []\n : [{ name: `${tableName}_${columnName}_check`, column: columnName, valueSet }];\n },\n );\n\n const tableInput: StorageTableInput = {\n columns,\n ...ifDefined('control', semanticModel.control),\n uniques: (semanticModel.uniques ?? []).map((u) => ({\n columns: u.columns,\n ...ifDefined('name', u.name),\n })),\n indexes: (semanticModel.indexes ?? []).map((i) => ({\n columns: i.columns,\n ...ifDefined('name', i.name),\n ...ifDefined('type', i.type),\n ...ifDefined('options', i.options),\n })),\n foreignKeys,\n ...(semanticModel.id\n ? {\n primaryKey: {\n columns: semanticModel.id.columns,\n ...ifDefined('name', semanticModel.id.name),\n },\n }\n : {}),\n ...(checksForTable.length > 0 ? { checks: checksForTable } : {}),\n };\n\n let nsTables = tablesByNamespace[namespaceId];\n if (nsTables === undefined) {\n nsTables = {};\n tablesByNamespace[namespaceId] = nsTables;\n }\n if (nsTables[tableName] !== undefined) {\n throw new Error(\n `buildSqlContractFromDefinition: duplicate table \"${tableName}\" in namespace \"${namespaceId}\".`,\n );\n }\n nsTables[tableName] = new StorageTable(tableInput);\n }\n\n // --- Build contract model ---\n\n const storageFields: Record<string, { readonly column: string }> = {};\n for (const [fieldName, columnName] of Object.entries(fieldToColumn)) {\n storageFields[fieldName] = { column: columnName };\n }\n\n const columnToField = new Map(\n Object.entries(fieldToColumn).map(([field, col]) => [col, field]),\n );\n const modelRelations: Record<string, ContractRelation> = {};\n for (const relation of semanticModel.relations ?? []) {\n // Cross-space relations have `spaceId` set — the target model lives in\n // a different contract space, so skip local model lookup and validation.\n if (relation.spaceId !== undefined) {\n const targetNamespaceId = relation.namespaceId ?? defaultNamespaceId;\n modelRelations[relation.fieldName] = {\n to: crossRef(relation.toModel, targetNamespaceId, relation.spaceId),\n // Cross-space belongsTo relations are always N:1 (the FK-owning side).\n cardinality: 'N:1',\n on: {\n localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),\n // For cross-space targets the lowering carries field names directly\n // (no fieldToColumn map available for the remote model).\n targetFields: relation.on.childColumns,\n },\n };\n continue;\n }\n\n const targetModel = assertKnownTargetModel(\n modelsByName,\n modelsByCoordinate,\n semanticModel.modelName,\n relation.toModel,\n relation.toNamespaceId,\n 'Relation',\n );\n assertTargetTableMatches(semanticModel.modelName, targetModel, relation.toTable, 'Relation');\n\n const targetColumnToField = new Map(\n targetModel.fields.map((f) => [f.columnName, f.fieldName]),\n );\n\n const to = crossRef(\n relation.toModel,\n relation.toNamespaceId !== undefined && relation.toNamespaceId.length > 0\n ? relation.toNamespaceId\n : resolveModelNamespaceId(targetModel, modelNameToNamespaceId, defaultNamespaceId),\n );\n const on = {\n localFields: relation.on.parentColumns.map((col) => columnToField.get(col) ?? col),\n targetFields: relation.on.childColumns.map((col) => targetColumnToField.get(col) ?? col),\n };\n\n if (relation.cardinality === 'N:M') {\n if (!relation.through) {\n throw new Error(\n `Relation \"${semanticModel.modelName}.${relation.fieldName}\" with cardinality \"N:M\" requires through metadata`,\n );\n }\n modelRelations[relation.fieldName] = {\n to,\n cardinality: 'N:M',\n on,\n through: buildThroughDescriptor(\n relation.through,\n tableNamespaceByName,\n targetModel,\n semanticModel.modelName,\n relation.fieldName,\n ),\n };\n } else {\n modelRelations[relation.fieldName] = { to, cardinality: relation.cardinality, on };\n }\n }\n\n let namespaceModels = modelsByNamespace[namespaceId];\n if (namespaceModels === undefined) {\n namespaceModels = {};\n modelsByNamespace[namespaceId] = namespaceModels;\n }\n namespaceModels[semanticModel.modelName] = {\n storage: {\n table: tableName,\n namespaceId,\n fields: storageFields,\n },\n fields: domainFields,\n relations: modelRelations,\n };\n }\n\n // --- Assemble contract ---\n\n // Aggregate roots are keyed by bare storage table name. When two models in\n // different namespaces map to the same bare table name, the bare key would\n // collide (last write wins, silently dropping a root), so those entries fall\n // back to a namespace-qualified key. Single-namespace contracts never\n // collide and keep their bare keys unchanged.\n const rootTableNameCounts = new Map<string, number>();\n for (const entry of rootEntries) {\n rootTableNameCounts.set(entry.tableName, (rootTableNameCounts.get(entry.tableName) ?? 0) + 1);\n }\n const roots: Record<string, CrossReference> = {};\n for (const entry of rootEntries) {\n const key =\n (rootTableNameCounts.get(entry.tableName) ?? 0) > 1\n ? `${entry.namespaceId}.${entry.tableName}`\n : entry.tableName;\n roots[key] = entry.ref;\n }\n\n // Normalise raw codec-triple inputs to the `kind: 'codec-instance'`\n // discriminator shape before hashing so the storageHash matches the\n // persisted JSON envelope produced from the SqlStorage class instance\n // (which always carries the discriminator).\n const rawStorageTypes = (definition.storageTypes ?? {}) as Record<\n string,\n StorageTypeInstance | PostgresEnumStorageEntry\n >;\n const storageTypes = Object.fromEntries(\n Object.entries(rawStorageTypes).map(([name, entry]) => {\n if (isPostgresEnumStorageEntry(entry)) return [name, entry];\n if ((entry as { kind?: unknown }).kind === 'codec-instance') return [name, entry];\n return [\n name,\n toStorageTypeInstance({\n codecId: entry.codecId,\n nativeType: entry.nativeType,\n typeParams: (entry as { typeParams?: Record<string, unknown> }).typeParams ?? {},\n }),\n ];\n }),\n );\n const { documentTypes, namespaceEnumTypesById } = partitionStorageTypesForTarget(\n target,\n storageTypes,\n definition.namespaceTypes,\n );\n const namespaceCoordinateIds = collectStorageNamespaceCoordinateIds(definition);\n for (const id of Object.keys(namespaceEnumTypesById)) {\n namespaceCoordinateIds.add(id);\n }\n\n // Build per-namespace registries for `enumType()` handles.\n // All authored enums target the contract's default namespace.\n const domainEnumsByNs: Record<string, Record<string, ContractEnum>> = {};\n const storageValueSetsByNs: Record<string, Record<string, StorageValueSetInput>> = {};\n for (const [enumName, handle] of Object.entries(definition.enums ?? {})) {\n if (enumName !== handle.enumName) {\n throw new Error(\n `enum declaration key \"${enumName}\" must match enumType name \"${handle.enumName}\". Aliases are not supported.`,\n );\n }\n const nsId = defaultNamespaceId;\n let domainSlot = domainEnumsByNs[nsId];\n if (domainSlot === undefined) {\n domainSlot = {};\n domainEnumsByNs[nsId] = domainSlot;\n }\n domainSlot[enumName] = {\n codecId: handle.codecId,\n members: handle.enumMembers,\n };\n\n let storageSlot = storageValueSetsByNs[nsId];\n if (storageSlot === undefined) {\n storageSlot = {};\n storageValueSetsByNs[nsId] = storageSlot;\n }\n storageSlot[enumName] = {\n kind: 'value-set',\n values: handle.values,\n };\n }\n\n const { createNamespace } = definition;\n const namespaces = blindCast<\n SqlStorageInput['namespaces'],\n 'contract authoring materialises each namespace coordinate from the model set and explicit namespace list'\n >(\n Object.fromEntries(\n [...namespaceCoordinateIds].sort().map((id) => {\n const enumTypes = namespaceEnumTypesById[id];\n const valueSetEntries = storageValueSetsByNs[id];\n const nsInput: SqlNamespaceTablesInput = {\n id,\n entries: {\n table: tablesByNamespace[id] ?? {},\n ...(valueSetEntries !== undefined && Object.keys(valueSetEntries).length > 0\n ? { valueSet: valueSetEntries }\n : {}),\n },\n };\n return [\n id,\n createNamespace ? createNamespace(nsInput, enumTypes) : buildSqlNamespace(nsInput),\n ];\n }),\n ),\n );\n const storageWithoutHash = {\n ...(Object.keys(documentTypes).length > 0 ? { types: documentTypes } : {}),\n namespaces: ensureUnboundNamespaceSlot(namespaces, createNamespace),\n };\n const storageHash: StorageHashBase<string> = definition.storageHash\n ? coreHash(definition.storageHash)\n : computeStorageHash({\n target,\n targetFamily,\n storage: storageWithoutHash as Record<string, unknown>,\n ...sqlContractCanonicalizationHooks,\n });\n const storage = new SqlStorage({ ...storageWithoutHash, storageHash });\n\n const executionSection =\n executionDefaults.length > 0\n ? {\n mutations: {\n defaults: executionDefaults.sort((a, b) => {\n const tableCompare = a.ref.table.localeCompare(b.ref.table);\n if (tableCompare !== 0) {\n return tableCompare;\n }\n return a.ref.column.localeCompare(b.ref.column);\n }),\n },\n }\n : undefined;\n\n const extensionNamespaces = definition.extensionPacks\n ? Object.values(definition.extensionPacks).map((pack) => pack.id)\n : undefined;\n\n const extensionPacks: Record<string, unknown> = { ...(definition.extensionPacks || {}) };\n if (extensionNamespaces) {\n for (const namespace of extensionNamespaces) {\n if (!Object.hasOwn(extensionPacks, namespace)) {\n extensionPacks[namespace] = {};\n }\n }\n }\n\n const extensionPackCapabilitySources = definition.extensionPacks\n ? Object.values(definition.extensionPacks).map(\n (pack) => pack.capabilities as CapabilityMatrix | undefined,\n )\n : [];\n const capabilities = mergeCapabilityMatrices(\n definition.target.capabilities as CapabilityMatrix | undefined,\n ...extensionPackCapabilitySources,\n );\n // Internal `profileHash` computation is unchanged from `origin/main`: it\n // continues to fingerprint the author-declared capability subset. With\n // `capabilities` removed from the `defineContract` input that subset is\n // now always empty, so the hash naturally stabilises at `hash({})`.\n const profileHash = computeProfileHash({\n target,\n targetFamily,\n capabilities: {},\n });\n\n const executionWithHash = executionSection\n ? {\n ...executionSection,\n executionHash: computeExecutionHash({ target, targetFamily, execution: executionSection }),\n }\n : undefined;\n\n const valueObjects: Record<string, ContractValueObject> | undefined =\n definition.valueObjects && definition.valueObjects.length > 0\n ? Object.fromEntries(\n definition.valueObjects.map((vo) => [\n vo.name,\n {\n fields: Object.fromEntries(\n vo.fields.map((f) => [\n f.fieldName,\n isValueObjectField(f)\n ? {\n type: { kind: 'valueObject' as const, name: f.valueObjectName },\n nullable: f.nullable,\n ...(f.many ? { many: true } : {}),\n }\n : {\n type: {\n kind: 'scalar' as const,\n codecId: f.descriptor.codecId,\n ...ifDefined('typeParams', f.descriptor.typeParams),\n },\n nullable: f.nullable,\n },\n ]),\n ),\n },\n ]),\n )\n : undefined;\n\n const domainNamespaceIds = new Set(Object.keys(modelsByNamespace));\n if (domainNamespaceIds.size === 0) {\n domainNamespaceIds.add(defaultNamespaceId);\n }\n if (valueObjects !== undefined) {\n domainNamespaceIds.add(defaultNamespaceId);\n }\n for (const nsId of Object.keys(domainEnumsByNs)) {\n domainNamespaceIds.add(nsId);\n }\n const domainNamespaces = Object.fromEntries(\n [...domainNamespaceIds].sort().map((namespaceId) => {\n const modelsInNs = modelsByNamespace[namespaceId] ?? {};\n const enumsInNs = domainEnumsByNs[namespaceId];\n const namespaceSlice = {\n models: modelsInNs,\n ...(namespaceId === defaultNamespaceId && valueObjects !== undefined\n ? { valueObjects }\n : {}),\n ...(enumsInNs !== undefined && Object.keys(enumsInNs).length > 0\n ? { enum: enumsInNs }\n : {}),\n };\n return [namespaceId, namespaceSlice];\n }),\n );\n\n const contract: Contract<SqlStorage> = {\n target,\n targetFamily,\n ...ifDefined('defaultControlPolicy', definition.defaultControlPolicy),\n domain: { namespaces: domainNamespaces },\n roots,\n storage,\n ...(executionWithHash ? { execution: executionWithHash } : {}),\n extensionPacks,\n capabilities,\n profileHash,\n meta: {},\n };\n\n assertStorageSemantics(definition, contract);\n\n return contract;\n}\n"],"mappings":"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"}
|
package/dist/config-types.d.mts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { Contract } from "@prisma-next/contract/types";
|
|
1
|
+
import { Contract, ControlPolicy } from "@prisma-next/contract/types";
|
|
2
2
|
import { ContractConfig, ContractConfig as ContractConfig$1 } from "@prisma-next/config/config-types";
|
|
3
3
|
import { TargetPackRef } from "@prisma-next/framework-components/components";
|
|
4
4
|
|
|
5
5
|
//#region src/config-types.d.ts
|
|
6
|
+
interface TypeScriptContractSpecifierOptions {
|
|
7
|
+
readonly defaultControlPolicy?: ControlPolicy;
|
|
8
|
+
}
|
|
6
9
|
declare function emptyContract(options: {
|
|
7
10
|
readonly output?: string;
|
|
8
11
|
readonly target: TargetPackRef<'sql', string>;
|
|
12
|
+
readonly defaultControlPolicy?: ControlPolicy;
|
|
9
13
|
}): ContractConfig$1;
|
|
10
|
-
declare function typescriptContract(contract: Contract, output?: string): ContractConfig$1;
|
|
11
|
-
declare function typescriptContractFromPath(contractPath: string, output?: string): ContractConfig$1;
|
|
14
|
+
declare function typescriptContract(contract: Contract, output?: string, options?: TypeScriptContractSpecifierOptions): ContractConfig$1;
|
|
15
|
+
declare function typescriptContractFromPath(contractPath: string, output?: string, options?: TypeScriptContractSpecifierOptions): ContractConfig$1;
|
|
12
16
|
//#endregion
|
|
13
17
|
export { type ContractConfig, emptyContract, typescriptContract, typescriptContractFromPath };
|
|
14
18
|
//# sourceMappingURL=config-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-types.d.mts","names":[],"sources":["../src/config-types.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"config-types.d.mts","names":[],"sources":["../src/config-types.ts"],"mappings":";;;;;UAsBiB,kCAAA;EAAA,SACN,oBAAA,GAAuB,aAAa;AAAA;AAAA,iBAG/B,aAAA,CAAc,OAAA;EAAA,SACnB,MAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EAAA,SACR,oBAAA,GAAuB,aAAA;AAAA,IAC9B,gBAAA;AAAA,iBAYY,kBAAA,CACd,QAAA,EAAU,QAAA,EACV,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAA;AAAA,iBAYa,0BAAA,CACd,YAAA,UACA,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAc"}
|
package/dist/config-types.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { t as buildSqlContractFromDefinition } from "./build-contract-
|
|
1
|
+
import { t as buildSqlContractFromDefinition } from "./build-contract-C-x2pfu4.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { applySpecifierDefaultControlPolicy } from "@prisma-next/contract/apply-specifier-default-control-policy";
|
|
4
5
|
import { ok } from "@prisma-next/utils/result";
|
|
5
6
|
import { extname } from "pathe";
|
|
6
7
|
//#region src/config-types.ts
|
|
@@ -17,20 +18,22 @@ function defaultOutputFromContractPath(contractPath) {
|
|
|
17
18
|
}
|
|
18
19
|
function emptyContract(options) {
|
|
19
20
|
return {
|
|
20
|
-
source: { load: async () =>
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
source: { load: async () => {
|
|
22
|
+
return ok(applySpecifierDefaultControlPolicy(buildSqlContractFromDefinition({
|
|
23
|
+
target: options.target,
|
|
24
|
+
models: []
|
|
25
|
+
}), options.defaultControlPolicy));
|
|
26
|
+
} },
|
|
24
27
|
...ifDefined("output", options.output)
|
|
25
28
|
};
|
|
26
29
|
}
|
|
27
|
-
function typescriptContract(contract, output) {
|
|
30
|
+
function typescriptContract(contract, output, options) {
|
|
28
31
|
return {
|
|
29
|
-
source: { load: async () => ok(contract) },
|
|
32
|
+
source: { load: async () => ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)) },
|
|
30
33
|
...ifDefined("output", output)
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
|
-
function typescriptContractFromPath(contractPath, output) {
|
|
36
|
+
function typescriptContractFromPath(contractPath, output, options) {
|
|
34
37
|
return {
|
|
35
38
|
source: {
|
|
36
39
|
inputs: [contractPath],
|
|
@@ -40,7 +43,7 @@ function typescriptContractFromPath(contractPath, output) {
|
|
|
40
43
|
const mod = await import(pathToFileURL(absolutePath).href);
|
|
41
44
|
const contract = mod.default ?? mod.contract;
|
|
42
45
|
if (contract === void 0) throw new Error(`typescriptContractFromPath: module at "${absolutePath}" has no "default" or "contract" export.`);
|
|
43
|
-
return ok(contract);
|
|
46
|
+
return ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy));
|
|
44
47
|
}
|
|
45
48
|
},
|
|
46
49
|
output: output ?? defaultOutputFromContractPath(contractPath)
|