@prisma-next/sql-contract-ts 0.14.0-dev.2 → 0.14.0-dev.21
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/dist/{build-contract-CQ4u83jx.mjs → build-contract-DyyzDMK7.mjs} +10 -12
- package/dist/build-contract-DyyzDMK7.mjs.map +1 -0
- package/dist/config-types.d.mts +2 -0
- package/dist/config-types.d.mts.map +1 -1
- package/dist/config-types.mjs +16 -8
- package/dist/config-types.mjs.map +1 -1
- package/dist/contract-builder.d.mts +41 -35
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +11 -4
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +10 -10
- package/src/build-contract.ts +19 -28
- package/src/config-types.ts +10 -1
- package/src/contract-builder.ts +8 -5
- package/src/contract-definition.ts +4 -4
- package/src/contract-dsl.ts +108 -41
- package/src/contract-lowering.ts +2 -1
- package/src/contract-types.ts +34 -10
- package/dist/build-contract-CQ4u83jx.mjs.map +0 -1
|
@@ -7,7 +7,7 @@ import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
|
|
|
7
7
|
import { sqlContractCanonicalizationHooks } from "@prisma-next/sql-contract/canonicalization-hooks";
|
|
8
8
|
import { validateIndexTypes } from "@prisma-next/sql-contract/index-type-validation";
|
|
9
9
|
import { createIndexTypeRegistry } from "@prisma-next/sql-contract/index-types";
|
|
10
|
-
import { SqlStorage, applyFkDefaults,
|
|
10
|
+
import { SqlStorage, applyFkDefaults, toStorageTypeInstance } from "@prisma-next/sql-contract/types";
|
|
11
11
|
import { validateStorageSemantics } from "@prisma-next/sql-contract/validators";
|
|
12
12
|
//#region src/build-contract.ts
|
|
13
13
|
function encodeViaCodec(value, codecId, codecLookup) {
|
|
@@ -132,15 +132,14 @@ function collectStorageNamespaceCoordinateIds(definition) {
|
|
|
132
132
|
}
|
|
133
133
|
function ensureUnboundNamespaceSlot(namespaces, createNamespace) {
|
|
134
134
|
if (Object.hasOwn(namespaces, UNBOUND_NAMESPACE_ID)) return namespaces;
|
|
135
|
-
const
|
|
135
|
+
const unbound = createNamespace({
|
|
136
136
|
id: UNBOUND_NAMESPACE_ID,
|
|
137
137
|
entries: { table: {} }
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
return blindCast({
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
141
140
|
[UNBOUND_NAMESPACE_ID]: unbound,
|
|
142
141
|
...namespaces
|
|
143
|
-
}
|
|
142
|
+
};
|
|
144
143
|
}
|
|
145
144
|
function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
146
145
|
const target = definition.target.targetId;
|
|
@@ -393,17 +392,16 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
393
392
|
};
|
|
394
393
|
}
|
|
395
394
|
const { createNamespace } = definition;
|
|
396
|
-
const namespaces =
|
|
395
|
+
const namespaces = Object.fromEntries([...namespaceCoordinateIds].sort().map((id) => {
|
|
397
396
|
const valueSetEntries = storageValueSetsByNs[id];
|
|
398
|
-
|
|
397
|
+
return [id, createNamespace({
|
|
399
398
|
id,
|
|
400
399
|
entries: {
|
|
401
400
|
table: tablesByNamespace[id] ?? {},
|
|
402
401
|
...valueSetEntries !== void 0 && Object.keys(valueSetEntries).length > 0 ? { valueSet: valueSetEntries } : {}
|
|
403
402
|
}
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
})));
|
|
403
|
+
})];
|
|
404
|
+
}));
|
|
407
405
|
const storageWithoutHash = {
|
|
408
406
|
...Object.keys(documentTypes).length > 0 ? { types: documentTypes } : {},
|
|
409
407
|
namespaces: defaultNamespaceId === UNBOUND_NAMESPACE_ID ? ensureUnboundNamespaceSlot(namespaces, createNamespace) : namespaces
|
|
@@ -490,4 +488,4 @@ function buildSqlContractFromDefinition(definition, codecLookup) {
|
|
|
490
488
|
//#endregion
|
|
491
489
|
export { buildSqlContractFromDefinition as t };
|
|
492
490
|
|
|
493
|
-
//# sourceMappingURL=build-contract-
|
|
491
|
+
//# sourceMappingURL=build-contract-DyyzDMK7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-contract-DyyzDMK7.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 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 type CheckConstraintInput,\n type SqlNamespaceInput,\n SqlStorage,\n type SqlStorageInput,\n type StorageColumn,\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 encodeViaCodec(value: unknown, codecId: string, codecLookup?: CodecLookup): JsonValue {\n const codec = codecLookup?.get(codecId);\n if (codec) {\n return codec.encodeJson(value);\n }\n return blindCast<\n JsonValue,\n 'no codec lookup at build time: literal/enum member value is already JSON-safe'\n >(value);\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: encodeViaCodec(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 defaultNamespaceId: string,\n): ContractRelationThrough {\n if (!tableNamespaceByName.has(through.table)) {\n throw new Error(\n `buildSqlContractFromDefinition: junction table \"${through.table}\" for relation \"${modelName}.${fieldName}\" is not a declared model.`,\n );\n }\n // Junction table names are unique per namespace, not globally. Prefer the\n // junction's own declared namespace (carried on the through node); fall back to\n // the target's default namespace. Resolving by bare table name would pick the\n // wrong namespace when the same junction table name exists in two namespaces.\n const namespaceId = through.namespaceId ?? defaultNamespaceId;\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: SqlNamespaceInput = {\n id: UNBOUND_NAMESPACE_ID,\n entries: { table: {} },\n };\n const unbound = createNamespace(unboundInput);\n return {\n [UNBOUND_NAMESPACE_ID]: unbound,\n ...namespaces,\n };\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, StorageTableInput>> = {};\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: 'valueSet',\n namespaceId: defaultNamespaceId,\n entityName: enumHandle.enumName,\n }\n : undefined;\n const domainValueSetRef: ValueSetRef | undefined =\n enumHandle !== undefined\n ? {\n plane: 'domain',\n entityKind: 'enum',\n namespaceId: defaultNamespaceId,\n entityName: 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: { namespace: namespaceId, 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] = 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 defaultNamespaceId,\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 ?? {};\n const documentTypes: Record<string, StorageTypeInstance> = Object.fromEntries(\n Object.entries(rawStorageTypes).map(([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 namespaceCoordinateIds = collectStorageNamespaceCoordinateIds(definition);\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.map((m) => ({\n name: m.name,\n value: encodeViaCodec(m.value, handle.codecId, codecLookup),\n })),\n };\n\n let storageSlot = storageValueSetsByNs[nsId];\n if (storageSlot === undefined) {\n storageSlot = {};\n storageValueSetsByNs[nsId] = storageSlot;\n }\n storageSlot[enumName] = {\n kind: 'valueSet',\n values: handle.values.map((v) => encodeViaCodec(v, handle.codecId, codecLookup)),\n };\n }\n\n const { createNamespace } = definition;\n const namespaces: SqlStorageInput['namespaces'] = Object.fromEntries(\n [...namespaceCoordinateIds].sort().map((id) => {\n const valueSetEntries = storageValueSetsByNs[id];\n const nsInput: SqlNamespaceInput = {\n id,\n entries: {\n table: tablesByNamespace[id] ?? {},\n ...(valueSetEntries !== undefined && Object.keys(valueSetEntries).length > 0\n ? { valueSet: valueSetEntries }\n : {}),\n },\n };\n return [id, createNamespace(nsInput)];\n }),\n );\n const storageWithoutHash = {\n ...(Object.keys(documentTypes).length > 0 ? { types: documentTypes } : {}),\n namespaces:\n defaultNamespaceId === UNBOUND_NAMESPACE_ID\n ? ensureUnboundNamespaceSlot(namespaces, createNamespace)\n : namespaces,\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,4 +1,5 @@
|
|
|
1
1
|
import { Contract, ControlPolicy } from "@prisma-next/contract/types";
|
|
2
|
+
import { SqlNamespaceBase, SqlNamespaceInput } from "@prisma-next/sql-contract/types";
|
|
2
3
|
import { ContractConfig, ContractConfig as ContractConfig$1 } from "@prisma-next/config/config-types";
|
|
3
4
|
import { TargetPackRef } from "@prisma-next/framework-components/components";
|
|
4
5
|
|
|
@@ -9,6 +10,7 @@ interface TypeScriptContractSpecifierOptions {
|
|
|
9
10
|
declare function emptyContract(options: {
|
|
10
11
|
readonly output?: string;
|
|
11
12
|
readonly target: TargetPackRef<'sql', string>;
|
|
13
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
12
14
|
readonly defaultControlPolicy?: ControlPolicy;
|
|
13
15
|
}): ContractConfig$1;
|
|
14
16
|
declare function typescriptContract(contract: Contract, output?: string, options?: TypeScriptContractSpecifierOptions): ContractConfig$1;
|
|
@@ -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":";;;;;;UAuBiB,kCAAA;EAAA,SACN,oBAAA,GAAuB,aAAa;AAAA;AAAA,iBAG/B,aAAA,CAAc,OAAA;EAAA,SACnB,MAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EAAA,SACR,eAAA,GAAkB,KAAA,EAAO,iBAAA,KAAsB,gBAAA;EAAA,SAC/C,oBAAA,GAAuB,aAAA;AAAA,IAC9B,gBAAA;AAAA,iBAiBY,kBAAA,CACd,QAAA,EAAU,QAAA,EACV,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAA;AAAA,iBAaa,0BAAA,CACd,YAAA,UACA,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAc"}
|
package/dist/config-types.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as buildSqlContractFromDefinition } from "./build-contract-
|
|
1
|
+
import { t as buildSqlContractFromDefinition } from "./build-contract-DyyzDMK7.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
4
|
import { applySpecifierDefaultControlPolicy } from "@prisma-next/contract/apply-specifier-default-control-policy";
|
|
@@ -18,24 +18,32 @@ function defaultOutputFromContractPath(contractPath) {
|
|
|
18
18
|
}
|
|
19
19
|
function emptyContract(options) {
|
|
20
20
|
return {
|
|
21
|
-
source: {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
source: {
|
|
22
|
+
sourceFormat: "typescript",
|
|
23
|
+
load: async () => {
|
|
24
|
+
return ok(applySpecifierDefaultControlPolicy(buildSqlContractFromDefinition({
|
|
25
|
+
target: options.target,
|
|
26
|
+
createNamespace: options.createNamespace,
|
|
27
|
+
models: []
|
|
28
|
+
}), options.defaultControlPolicy));
|
|
29
|
+
}
|
|
30
|
+
},
|
|
27
31
|
...ifDefined("output", options.output)
|
|
28
32
|
};
|
|
29
33
|
}
|
|
30
34
|
function typescriptContract(contract, output, options) {
|
|
31
35
|
return {
|
|
32
|
-
source: {
|
|
36
|
+
source: {
|
|
37
|
+
sourceFormat: "typescript",
|
|
38
|
+
load: async () => ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy))
|
|
39
|
+
},
|
|
33
40
|
...ifDefined("output", output)
|
|
34
41
|
};
|
|
35
42
|
}
|
|
36
43
|
function typescriptContractFromPath(contractPath, output, options) {
|
|
37
44
|
return {
|
|
38
45
|
source: {
|
|
46
|
+
sourceFormat: "typescript",
|
|
39
47
|
inputs: [contractPath],
|
|
40
48
|
load: async (context) => {
|
|
41
49
|
const [absolutePath] = context.resolvedInputs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-types.mjs","names":[],"sources":["../src/config-types.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport { applySpecifierDefaultControlPolicy } from '@prisma-next/contract/apply-specifier-default-control-policy';\nimport type { Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport type { TargetPackRef } from '@prisma-next/framework-components/components';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { ok } from '@prisma-next/utils/result';\nimport { extname } from 'pathe';\nimport { buildSqlContractFromDefinition } from './build-contract';\n\n/**\n * Derives the emit output path from the TS contract input so artefacts land\n * colocated with the source (e.g. `prisma/contract.ts` →\n * `prisma/contract.json`). Mirrors the same default-derivation logic in\n * `@prisma-next/sql-contract-psl/provider`.\n */\nfunction defaultOutputFromContractPath(contractPath: string): string {\n const ext = extname(contractPath);\n if (ext.length === 0) return `${contractPath}.json`;\n return `${contractPath.slice(0, -ext.length)}.json`;\n}\n\nexport interface TypeScriptContractSpecifierOptions {\n readonly defaultControlPolicy?: ControlPolicy;\n}\n\nexport function emptyContract(options: {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', string>;\n readonly defaultControlPolicy?: ControlPolicy;\n}): ContractConfig {\n return {\n source: {\n load: async () => {\n const built = buildSqlContractFromDefinition({
|
|
1
|
+
{"version":3,"file":"config-types.mjs","names":[],"sources":["../src/config-types.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport { applySpecifierDefaultControlPolicy } from '@prisma-next/contract/apply-specifier-default-control-policy';\nimport type { Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport type { TargetPackRef } from '@prisma-next/framework-components/components';\nimport type { SqlNamespaceBase, SqlNamespaceInput } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { ok } from '@prisma-next/utils/result';\nimport { extname } from 'pathe';\nimport { buildSqlContractFromDefinition } from './build-contract';\n\n/**\n * Derives the emit output path from the TS contract input so artefacts land\n * colocated with the source (e.g. `prisma/contract.ts` →\n * `prisma/contract.json`). Mirrors the same default-derivation logic in\n * `@prisma-next/sql-contract-psl/provider`.\n */\nfunction defaultOutputFromContractPath(contractPath: string): string {\n const ext = extname(contractPath);\n if (ext.length === 0) return `${contractPath}.json`;\n return `${contractPath.slice(0, -ext.length)}.json`;\n}\n\nexport interface TypeScriptContractSpecifierOptions {\n readonly defaultControlPolicy?: ControlPolicy;\n}\n\nexport function emptyContract(options: {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', string>;\n readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;\n readonly defaultControlPolicy?: ControlPolicy;\n}): ContractConfig {\n return {\n source: {\n sourceFormat: 'typescript',\n load: async () => {\n const built = buildSqlContractFromDefinition({\n target: options.target,\n createNamespace: options.createNamespace,\n models: [],\n });\n return ok(applySpecifierDefaultControlPolicy(built, options.defaultControlPolicy));\n },\n },\n ...ifDefined('output', options.output),\n };\n}\n\nexport function typescriptContract(\n contract: Contract,\n output?: string,\n options?: TypeScriptContractSpecifierOptions,\n): ContractConfig {\n return {\n source: {\n sourceFormat: 'typescript',\n load: async () =>\n ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)),\n },\n // The in-memory variant has no input path to anchor on; fall through to\n // the global default in `normalizeContractConfig` when caller doesn't pin it.\n ...ifDefined('output', output),\n };\n}\n\nexport function typescriptContractFromPath(\n contractPath: string,\n output?: string,\n options?: TypeScriptContractSpecifierOptions,\n): ContractConfig {\n return {\n source: {\n sourceFormat: 'typescript',\n inputs: [contractPath],\n load: async (context) => {\n const [absolutePath] = context.resolvedInputs;\n if (absolutePath === undefined) {\n throw new Error(\n 'typescriptContractFromPath: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\n const mod = await import(pathToFileURL(absolutePath).href);\n const contract: Contract | undefined = mod.default ?? mod.contract;\n if (contract === undefined) {\n throw new Error(\n `typescriptContractFromPath: module at \"${absolutePath}\" has no \"default\" or \"contract\" export.`,\n );\n }\n return ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy));\n },\n },\n output: output ?? defaultOutputFromContractPath(contractPath),\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAiBA,SAAS,8BAA8B,cAA8B;CACnE,MAAM,MAAM,QAAQ,YAAY;CAChC,IAAI,IAAI,WAAW,GAAG,OAAO,GAAG,aAAa;CAC7C,OAAO,GAAG,aAAa,MAAM,GAAG,CAAC,IAAI,MAAM,EAAE;AAC/C;AAMA,SAAgB,cAAc,SAKX;CACjB,OAAO;EACL,QAAQ;GACN,cAAc;GACd,MAAM,YAAY;IAMhB,OAAO,GAAG,mCALI,+BAA+B;KAC3C,QAAQ,QAAQ;KAChB,iBAAiB,QAAQ;KACzB,QAAQ,CAAC;IACX,CACiD,GAAG,QAAQ,oBAAoB,CAAC;GACnF;EACF;EACA,GAAG,UAAU,UAAU,QAAQ,MAAM;CACvC;AACF;AAEA,SAAgB,mBACd,UACA,QACA,SACgB;CAChB,OAAO;EACL,QAAQ;GACN,cAAc;GACd,MAAM,YACJ,GAAG,mCAAmC,UAAU,SAAS,oBAAoB,CAAC;EAClF;EAGA,GAAG,UAAU,UAAU,MAAM;CAC/B;AACF;AAEA,SAAgB,2BACd,cACA,QACA,SACgB;CAChB,OAAO;EACL,QAAQ;GACN,cAAc;GACd,QAAQ,CAAC,YAAY;GACrB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,gBAAgB,QAAQ;IAC/B,IAAI,iBAAiB,KAAA,GACnB,MAAM,IAAI,MACR,8IACF;IAEF,MAAM,MAAM,MAAM,OAAO,cAAc,YAAY,CAAC,CAAC;IACrD,MAAM,WAAiC,IAAI,WAAW,IAAI;IAC1D,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MACR,0CAA0C,aAAa,yCACzD;IAEF,OAAO,GAAG,mCAAmC,UAAU,SAAS,oBAAoB,CAAC;GACvF;EACF;EACA,QAAQ,UAAU,8BAA8B,YAAY;CAC9D;AACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ColumnDefault, ColumnDefaultLiteralInputValue, Contract, ContractEnum, ContractRelation, ContractValueObject, ControlPolicy, ExecutionMutationDefaultPhases, ExecutionMutationDefaultPhases as ExecutionMutationDefaultPhases$1, ExecutionMutationDefaultValue, NamespaceId, StorageHashBase } from "@prisma-next/contract/types";
|
|
2
2
|
import { EntityHelpersFromNamespace, ExtractAuthoringNamespaceFromPack, ForeignKeyDefaultsState, MergeExtensionAuthoringNamespaces } from "@prisma-next/contract-authoring";
|
|
3
|
-
import {
|
|
3
|
+
import { StorageType } from "@prisma-next/framework-components/ir";
|
|
4
4
|
import { IndexTypeRegistration } from "@prisma-next/sql-contract/index-types";
|
|
5
|
-
import { ContractWithTypeMaps, Index as Index$1, ReferentialAction,
|
|
5
|
+
import { ContractWithTypeMaps, Index as Index$1, ReferentialAction, SqlNamespaceBase, SqlNamespaceInput, SqlStorage, StorageTypeInstance, TypeMaps } from "@prisma-next/sql-contract/types";
|
|
6
6
|
import { AuthoringArgumentDescriptor, AuthoringFieldPresetDescriptor, AuthoringTypeConstructorDescriptor } from "@prisma-next/framework-components/authoring";
|
|
7
7
|
import { ExtensionPackRef, FamilyPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
|
|
8
8
|
import { CodecLookup, ColumnTypeDescriptor } from "@prisma-next/framework-components/codec";
|
|
@@ -154,7 +154,7 @@ type NamedStorageTypeRef = string | StorageTypeInstance | EnumTypeHandle;
|
|
|
154
154
|
type NamedConstraintNameSpec<Name extends string = string> = {
|
|
155
155
|
readonly name: Name;
|
|
156
156
|
};
|
|
157
|
-
type ScalarFieldState<CodecId extends string = string, TypeRef extends NamedStorageTypeRef | undefined = undefined, Nullable extends boolean = boolean, ColumnName extends string | undefined = string | undefined, IdSpec extends NamedConstraintSpec | undefined = undefined, UniqueSpec extends NamedConstraintSpec | undefined = undefined> = {
|
|
157
|
+
type ScalarFieldState<CodecId extends string = string, TypeRef extends NamedStorageTypeRef | undefined = undefined, Nullable extends boolean = boolean, ColumnName extends string | undefined = string | undefined, IdSpec extends NamedConstraintSpec | undefined = undefined, UniqueSpec extends NamedConstraintSpec | undefined = undefined, Many extends boolean = false> = {
|
|
158
158
|
readonly kind: 'scalar';
|
|
159
159
|
readonly descriptor?: (ColumnTypeDescriptor & {
|
|
160
160
|
readonly codecId: CodecId;
|
|
@@ -164,6 +164,7 @@ type ScalarFieldState<CodecId extends string = string, TypeRef extends NamedStor
|
|
|
164
164
|
readonly columnName?: ColumnName | undefined;
|
|
165
165
|
readonly default?: ColumnDefault | undefined;
|
|
166
166
|
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
167
|
+
readonly many?: Many extends true ? true : undefined;
|
|
167
168
|
} & (IdSpec extends NamedConstraintSpec ? {
|
|
168
169
|
readonly id: IdSpec;
|
|
169
170
|
} : {
|
|
@@ -183,11 +184,12 @@ type AnyScalarFieldState = {
|
|
|
183
184
|
readonly columnName?: string | undefined;
|
|
184
185
|
readonly default?: ColumnDefault | undefined;
|
|
185
186
|
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
187
|
+
readonly many?: boolean | undefined;
|
|
186
188
|
readonly id?: NamedConstraintSpec | undefined;
|
|
187
189
|
readonly unique?: NamedConstraintSpec | undefined;
|
|
188
190
|
};
|
|
189
|
-
type HasNamedConstraintId<State extends AnyScalarFieldState> = State extends ScalarFieldState<string, NamedStorageTypeRef | undefined, boolean, string | undefined, infer IdSpec, NamedConstraintSpec | undefined> ? IdSpec extends NamedConstraintSpec ? true : false : false;
|
|
190
|
-
type HasNamedConstraintUnique<State extends AnyScalarFieldState> = State extends ScalarFieldState<string, NamedStorageTypeRef | undefined, boolean, string | undefined, NamedConstraintSpec | undefined, infer UniqueSpec> ? UniqueSpec extends NamedConstraintSpec ? true : false : false;
|
|
191
|
+
type HasNamedConstraintId<State extends AnyScalarFieldState> = State extends ScalarFieldState<string, NamedStorageTypeRef | undefined, boolean, string | undefined, infer IdSpec, NamedConstraintSpec | undefined, boolean> ? IdSpec extends NamedConstraintSpec ? true : false : false;
|
|
192
|
+
type HasNamedConstraintUnique<State extends AnyScalarFieldState> = State extends ScalarFieldState<string, NamedStorageTypeRef | undefined, boolean, string | undefined, NamedConstraintSpec | undefined, infer UniqueSpec, boolean> ? UniqueSpec extends NamedConstraintSpec ? true : false : false;
|
|
191
193
|
type FieldSqlSpecForState<State extends AnyScalarFieldState> = {
|
|
192
194
|
readonly column?: string;
|
|
193
195
|
} & (HasNamedConstraintId<State> extends true ? {
|
|
@@ -195,7 +197,7 @@ type FieldSqlSpecForState<State extends AnyScalarFieldState> = {
|
|
|
195
197
|
} : Record<never, never>) & (HasNamedConstraintUnique<State> extends true ? {
|
|
196
198
|
readonly unique?: NamedConstraintNameSpec;
|
|
197
199
|
} : Record<never, never>);
|
|
198
|
-
type ApplyFieldSqlSpec<State extends AnyScalarFieldState, Spec extends FieldSqlSpecForState<State>> = State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, Nullable, Spec extends {
|
|
200
|
+
type ApplyFieldSqlSpec<State extends AnyScalarFieldState, Spec extends FieldSqlSpecForState<State>> = State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, infer UniqueSpec, infer Many> ? ScalarFieldState<CodecId, TypeRef, Nullable, Spec extends {
|
|
199
201
|
readonly column: infer NextColumn extends string;
|
|
200
202
|
} ? NextColumn : ColumnName, Spec extends {
|
|
201
203
|
readonly id: {
|
|
@@ -205,7 +207,7 @@ type ApplyFieldSqlSpec<State extends AnyScalarFieldState, Spec extends FieldSqlS
|
|
|
205
207
|
readonly unique: {
|
|
206
208
|
readonly name: infer UniqueName extends string;
|
|
207
209
|
};
|
|
208
|
-
} ? UniqueSpec extends NamedConstraintSpec ? NamedConstraintSpec<UniqueName> : UniqueSpec : UniqueSpec> :
|
|
210
|
+
} ? UniqueSpec extends NamedConstraintSpec ? NamedConstraintSpec<UniqueName> : UniqueSpec : UniqueSpec, Many> : AnyScalarFieldState;
|
|
209
211
|
type GeneratedFieldSpec = {
|
|
210
212
|
readonly type: ColumnTypeDescriptor;
|
|
211
213
|
readonly typeParams?: Record<string, unknown>;
|
|
@@ -222,12 +224,13 @@ declare class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFi
|
|
|
222
224
|
* `TargetFieldRef.columnName` so FK target columns are resolved correctly.
|
|
223
225
|
*/
|
|
224
226
|
get physicalColumnName(): string | undefined;
|
|
225
|
-
optional(): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, boolean, infer ColumnName, infer IdSpec, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec> :
|
|
226
|
-
column<ColumnName extends string>(name: ColumnName): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, string | undefined, infer IdSpec, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec> :
|
|
227
|
+
optional(): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, boolean, infer ColumnName, infer IdSpec, infer UniqueSpec, infer Many> ? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec, Many> : AnyScalarFieldState>;
|
|
228
|
+
column<ColumnName extends string>(name: ColumnName): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, string | undefined, infer IdSpec, infer UniqueSpec, infer Many> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, Many> : AnyScalarFieldState>;
|
|
229
|
+
many(): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, infer UniqueSpec, boolean> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, true> : AnyScalarFieldState>;
|
|
227
230
|
default(value: ColumnDefaultLiteralInputValue | ColumnDefault): ScalarFieldBuilder<State>;
|
|
228
231
|
defaultSql(expression: string): ScalarFieldBuilder<State>;
|
|
229
|
-
id<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, NamedConstraintSpec | undefined, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, NamedConstraintSpec<Name>, UniqueSpec> :
|
|
230
|
-
unique<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, NamedConstraintSpec | undefined> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name
|
|
232
|
+
id<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, NamedConstraintSpec | undefined, infer UniqueSpec, infer Many> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, NamedConstraintSpec<Name>, UniqueSpec, Many> : AnyScalarFieldState>;
|
|
233
|
+
unique<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, NamedConstraintSpec | undefined, infer Many> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>, Many> : AnyScalarFieldState>;
|
|
231
234
|
sql<const Spec extends FieldSqlSpecForState<State>>(spec: Spec): ScalarFieldBuilder<ApplyFieldSqlSpec<State, Spec>>;
|
|
232
235
|
build(): State;
|
|
233
236
|
}
|
|
@@ -571,7 +574,7 @@ type ContractInput<Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
|
571
574
|
*/
|
|
572
575
|
readonly namespaces?: readonly string[];
|
|
573
576
|
/**
|
|
574
|
-
* Target-supplied factory that materialises a `
|
|
577
|
+
* Target-supplied factory that materialises a `SqlNamespaceBase` concretion
|
|
575
578
|
* for a declared namespace coordinate. The SQL family layer is
|
|
576
579
|
* target-agnostic and cannot import concretions like
|
|
577
580
|
* `PostgresSchema` or `SqliteUnboundDatabase`; the factory is the
|
|
@@ -583,14 +586,8 @@ type ContractInput<Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
|
583
586
|
* `StorageTable.namespaceId` referenced by a model, and the
|
|
584
587
|
* framework `UNBOUND_NAMESPACE_ID` sentinel (always present so the
|
|
585
588
|
* late-bound slot stays available regardless of authoring choices).
|
|
586
|
-
*
|
|
587
|
-
* When omitted, the family layer falls back to its placeholder
|
|
588
|
-
* `SqlUnboundNamespace` singleton for the unbound slot and rejects
|
|
589
|
-
* any non-unbound coordinate — single-namespace contracts authored
|
|
590
|
-
* before targets ship their factory stay byte-stable; multi-namespace
|
|
591
|
-
* contracts must pass the factory through.
|
|
592
589
|
*/
|
|
593
|
-
readonly createNamespace
|
|
590
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
594
591
|
readonly types?: Types;
|
|
595
592
|
readonly models?: Models;
|
|
596
593
|
readonly codecLookup?: CodecLookup;
|
|
@@ -727,10 +724,10 @@ type FieldHelpersFromNamespace<Namespace> = { readonly [K in keyof Namespace]: N
|
|
|
727
724
|
//#endregion
|
|
728
725
|
//#region src/contract-types.d.ts
|
|
729
726
|
type ExtractCodecTypesFromPack<P> = P extends {
|
|
730
|
-
__codecTypes?: infer C
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
}
|
|
727
|
+
__codecTypes?: infer C extends Record<string, {
|
|
728
|
+
output: unknown;
|
|
729
|
+
}>;
|
|
730
|
+
} ? C : Record<string, never>;
|
|
734
731
|
type MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<{ [K in keyof Packs]: ExtractCodecTypesFromPack<Packs[K]> }[keyof Packs]>;
|
|
735
732
|
type MergeExtensionCodecTypesSafe<Packs> = Packs extends Record<string, unknown> ? keyof Packs extends never ? Record<string, never> : MergeExtensionCodecTypes<Packs> : Record<string, never>;
|
|
736
733
|
type ExtractIndexTypesFromPack<P> = P extends {
|
|
@@ -813,6 +810,9 @@ type FieldTypeRefOf<FieldState> = Present<FieldState extends {
|
|
|
813
810
|
type FieldNullableOf<FieldState> = FieldState extends {
|
|
814
811
|
readonly nullable: infer Nullable extends boolean;
|
|
815
812
|
} ? Nullable : boolean;
|
|
813
|
+
type FieldManyOf<FieldState> = FieldState extends {
|
|
814
|
+
readonly many?: true;
|
|
815
|
+
} ? true : false;
|
|
816
816
|
type FieldColumnOverrideOf<FieldState> = Present<FieldState extends {
|
|
817
817
|
readonly columnName?: infer ColumnName;
|
|
818
818
|
} ? ColumnName : never>;
|
|
@@ -865,17 +865,19 @@ type AttributeIdName<Definition, ModelName extends ModelNames<Definition>> = Pre
|
|
|
865
865
|
} ? Name : never>;
|
|
866
866
|
type ModelIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = [AttributeIdFieldNames<Definition, ModelName>] extends [undefined] ? InlineIdFieldNames<Definition, ModelName> : AttributeIdFieldNames<Definition, ModelName>;
|
|
867
867
|
type ModelIdName<Definition, ModelName extends ModelNames<Definition>> = [AttributeIdName<Definition, ModelName>] extends [never] ? Present<InlineIdName<Definition, ModelName>> : AttributeIdName<Definition, ModelName>;
|
|
868
|
-
type StorageColumn<CodecId extends string, Nullable extends boolean, NativeType extends string, TypeRef extends string | undefined = undefined, TypeParams extends Record<string, unknown> | undefined = undefined> = {
|
|
868
|
+
type StorageColumn<CodecId extends string, Nullable extends boolean, NativeType extends string, TypeRef extends string | undefined = undefined, TypeParams extends Record<string, unknown> | undefined = undefined, Many extends boolean = false> = {
|
|
869
869
|
readonly nativeType: NativeType;
|
|
870
870
|
readonly codecId: CodecId;
|
|
871
871
|
readonly nullable: Nullable;
|
|
872
872
|
readonly default?: ColumnDefault;
|
|
873
873
|
} & (TypeRef extends string ? {
|
|
874
874
|
readonly typeRef: TypeRef;
|
|
875
|
-
} : Record<
|
|
875
|
+
} : Record<never, never>) & (TypeParams extends Record<string, unknown> ? {
|
|
876
876
|
readonly typeParams: TypeParams;
|
|
877
|
-
} : Record<
|
|
878
|
-
|
|
877
|
+
} : Record<never, never>) & (Many extends true ? {
|
|
878
|
+
readonly many: true;
|
|
879
|
+
} : Record<never, never>);
|
|
880
|
+
type ModelStorageColumn<Definition, ModelName extends ModelNames<Definition>, FieldName extends string> = FieldName extends ModelFieldNames<Definition, ModelName> ? StorageColumn<DescriptorCodecId<ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>>, FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>>, DescriptorNativeType<ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>>, ResolveFieldColumnTypeRef<Definition, ModelFieldState<Definition, ModelName, FieldName>>, ResolveFieldColumnTypeParams<Definition, ModelFieldState<Definition, ModelName, FieldName>>, FieldManyOf<ModelFieldState<Definition, ModelName, FieldName>>> : never;
|
|
879
881
|
type BuiltModels<Definition> = { readonly [ModelName in ModelNames<Definition>]: {
|
|
880
882
|
readonly storage: {
|
|
881
883
|
readonly table: ModelTableName<Definition, ModelName>;
|
|
@@ -967,10 +969,14 @@ type BuiltStorage<Definition> = {
|
|
|
967
969
|
};
|
|
968
970
|
} };
|
|
969
971
|
};
|
|
972
|
+
type StorageColumnManyOf<Col> = Col extends {
|
|
973
|
+
readonly many: true;
|
|
974
|
+
} ? true : false;
|
|
970
975
|
type EnumValueUnion<FieldState> = [FieldTypeRefOf<FieldState>] extends [EnumTypeHandle<string, infer Values>] ? readonly unknown[] extends Values ? never : Values[number] : never;
|
|
971
|
-
type CodecChannelType<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>, Channel extends 'output' | 'input'> = ModelStorageColumn<Definition, ModelName, FieldName>['codecId'] extends infer Id extends keyof CodecTypesFromDefinition<Definition> ? CodecTypesFromDefinition<Definition>[Id] extends { readonly [K in Channel]: infer T } ? T : unknown : unknown;
|
|
972
|
-
type FieldChannelType<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>, Channel extends 'output' | 'input'> = ([EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>] extends [never] ? CodecChannelType<Definition, ModelName, FieldName, Channel> : EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>) | (FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>> extends true ? null : never);
|
|
976
|
+
type CodecChannelType<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>, Channel extends 'output' | 'input'> = ModelStorageColumn<Definition, ModelName, FieldName>['codecId'] extends infer Id extends keyof CodecTypesFromDefinition<Definition> ? CodecTypesFromDefinition<Definition>[Id] extends { readonly [K in Channel]: infer T } ? StorageColumnManyOf<ModelStorageColumn<Definition, ModelName, FieldName>> extends true ? ReadonlyArray<T> : T : unknown : unknown;
|
|
977
|
+
type FieldChannelType<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>, Channel extends 'output' | 'input'> = ([EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>] extends [never] ? CodecChannelType<Definition, ModelName, FieldName, Channel> : StorageColumnManyOf<ModelStorageColumn<Definition, ModelName, FieldName>> extends true ? ReadonlyArray<EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>> : EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>) | (FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>> extends true ? null : never);
|
|
973
978
|
type FieldChannelTypes<Definition, Channel extends 'output' | 'input'> = { readonly [Ns in DefaultStorageNamespaceId<Definition>]: { readonly [ModelName in ModelNames<Definition>]: { readonly [FieldName in ModelFieldNames<Definition, ModelName>]: FieldChannelType<Definition, ModelName, FieldName, Channel> } } };
|
|
979
|
+
type StorageColumnChannelTypes<Definition, Channel extends 'output' | 'input'> = { readonly [Ns in DefaultStorageNamespaceId<Definition>]: { readonly [ModelName in ModelNames<Definition> as BuiltModelTableName<Definition, ModelName>]: { readonly [FieldName in ModelFieldNames<Definition, ModelName> as BuiltModelColumnMappings<Definition, ModelName>[FieldName]['column']]: FieldChannelType<Definition, ModelName, FieldName, Channel> } } };
|
|
974
980
|
type SqlContractResult<Definition> = ContractWithTypeMaps<Omit<Contract<BuiltStorage<Definition>>, 'domain'> & {
|
|
975
981
|
readonly target: DefinitionTargetId<Definition>;
|
|
976
982
|
readonly targetFamily: 'sql';
|
|
@@ -982,7 +988,7 @@ type SqlContractResult<Definition> = ContractWithTypeMaps<Omit<Contract<BuiltSto
|
|
|
982
988
|
readonly extensionPacks: keyof DefinitionExtensionPacks<Definition> extends never ? Record<string, never> : DefinitionExtensionPacks<Definition>;
|
|
983
989
|
readonly capabilities: DerivedCapabilities<Definition>;
|
|
984
990
|
readonly enumAccessors: BuiltEnumAccessors<Definition>;
|
|
985
|
-
}, TypeMaps<CodecTypesFromDefinition<Definition>, Record<string, never>, FieldChannelTypes<Definition, 'output'>, FieldChannelTypes<Definition, 'input'>>>;
|
|
991
|
+
}, TypeMaps<CodecTypesFromDefinition<Definition>, Record<string, never>, FieldChannelTypes<Definition, 'output'>, FieldChannelTypes<Definition, 'input'>, StorageColumnChannelTypes<Definition, 'output'>, StorageColumnChannelTypes<Definition, 'input'>>>;
|
|
986
992
|
//#endregion
|
|
987
993
|
//#region src/composed-authoring-helpers.d.ts
|
|
988
994
|
type ExtractTypeNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<Pack, 'type', Record<never, never>>;
|
|
@@ -1181,8 +1187,8 @@ interface ContractDefinition {
|
|
|
1181
1187
|
* `SqlStorage.namespaces` together with `createNamespace`.
|
|
1182
1188
|
*/
|
|
1183
1189
|
readonly namespaces?: readonly string[];
|
|
1184
|
-
/** Target-supplied factory that materialises a `
|
|
1185
|
-
readonly createNamespace
|
|
1190
|
+
/** Target-supplied factory that materialises a `SqlNamespaceBase` concretion for a declared namespace coordinate. */
|
|
1191
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
1186
1192
|
readonly models: readonly ModelNode[];
|
|
1187
1193
|
readonly valueObjects?: readonly ValueObjectNode[];
|
|
1188
1194
|
/**
|
|
@@ -1218,7 +1224,7 @@ type ContractDefinition$1<Family extends FamilyPackRef<string>, Target extends T
|
|
|
1218
1224
|
readonly foreignKeyDefaults?: ForeignKeyDefaults;
|
|
1219
1225
|
readonly defaultControlPolicy?: ControlPolicy;
|
|
1220
1226
|
readonly namespaces?: Namespaces;
|
|
1221
|
-
readonly createNamespace
|
|
1227
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
1222
1228
|
readonly types?: Types;
|
|
1223
1229
|
readonly models?: Models;
|
|
1224
1230
|
readonly codecLookup?: CodecLookup;
|
|
@@ -1233,7 +1239,7 @@ type ContractScaffold<Family extends FamilyPackRef<string>, Target extends Targe
|
|
|
1233
1239
|
readonly foreignKeyDefaults?: ForeignKeyDefaults;
|
|
1234
1240
|
readonly defaultControlPolicy?: ControlPolicy;
|
|
1235
1241
|
readonly namespaces?: Namespaces;
|
|
1236
|
-
readonly createNamespace
|
|
1242
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
1237
1243
|
readonly types?: never;
|
|
1238
1244
|
readonly models?: never;
|
|
1239
1245
|
readonly codecLookup?: CodecLookup;
|
|
@@ -1251,7 +1257,7 @@ type BoundDefinitionInput<Types extends Record<string, StorageTypeInstance> = Re
|
|
|
1251
1257
|
readonly foreignKeyDefaults?: ForeignKeyDefaults;
|
|
1252
1258
|
readonly defaultControlPolicy?: ControlPolicy;
|
|
1253
1259
|
readonly namespaces?: Namespaces;
|
|
1254
|
-
readonly createNamespace
|
|
1260
|
+
readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase;
|
|
1255
1261
|
readonly types?: Types;
|
|
1256
1262
|
readonly models?: Models;
|
|
1257
1263
|
readonly codecLookup?: CodecLookup;
|