@prisma-next/sql-contract-emitter 0.11.0-dev.9 → 0.12.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;cAkEa,WAAA;EAAA;qCAGa,QAAA,EAAQ,IAAA,EAAQ,iBAAA;EAAA,uCA6BZ,QAAA;EAAA,yCAmJE,QAAA,EAAQ,mBAAA;EAAA,wDAQK,KAAA,EAAS,aAAA;EAAA,sDAoBhC,SAAA,UACD,KAAA,EACV,aAAA,EAAa,QAAA,EACV,QAAA,KACT,MAAA;EAAA;4CA+C4B,4BAAA;EAAA;0DAwBY,YAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;cAsEa,WAAA;EAAA;qCAGa,QAAA,EAAQ,IAAA,EAAQ,iBAAA;EAAA,uCA6BZ,QAAA;EAAA,yCAsJE,QAAA,EAAQ,mBAAA;EAAA,wDAQK,KAAA,EAAS,aAAA;EAAA,sDAoBhC,SAAA,UACD,KAAA,EACV,aAAA,EAAa,QAAA,EACV,QAAA,KACT,MAAA;EAAA;4CA8C4B,4BAAA;EAAA;0DAwBY,YAAA;AAAA"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { serializeObjectKey, serializeValue } from "@prisma-next/emitter/domain-type-generation";
1
+ import { serializeNamespaceId, serializeObjectKey, serializeValue } from "@prisma-next/emitter/domain-type-generation";
2
2
  import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
3
3
  import { isPostgresEnumStorageEntry } from "@prisma-next/sql-contract/types";
4
4
  //#region src/index.ts
@@ -54,23 +54,26 @@ const sqlEmission = {
54
54
  const storage = contract.storage;
55
55
  if (!storage?.namespaces) throw new Error("SQL contract must have storage.namespaces");
56
56
  assertUniqueSqlTableNames(storage);
57
- const models = contract.models;
58
57
  const tableNames = /* @__PURE__ */ new Set();
59
58
  for (const ns of Object.values(storage.namespaces)) for (const t of Object.keys(ns.tables)) tableNames.add(t);
60
- if (models) for (const [modelName, model] of Object.entries(models)) {
61
- if (!model.storage?.table) throw new Error(`Model "${modelName}" is missing storage.table`);
62
- const tableName = model.storage.table;
63
- const located = findSqlTable(storage, tableName);
64
- if (!located) throw new Error(`Model "${modelName}" references non-existent table "${tableName}"`);
65
- const { table } = located;
66
- const columnNames = new Set(Object.keys(table.columns));
67
- const storageFields = model.storage.fields;
68
- if (!storageFields || Object.keys(storageFields).length === 0) throw new Error(`Model "${modelName}" is missing storage.fields`);
69
- for (const [fieldName, field] of Object.entries(storageFields)) {
70
- if (!field.column) throw new Error(`Model "${modelName}" field "${fieldName}" is missing column property`);
71
- if (!columnNames.has(field.column)) throw new Error(`Model "${modelName}" field "${fieldName}" references non-existent column "${field.column}" in table "${tableName}"`);
59
+ for (const [namespaceId, domainNs] of Object.entries(contract.domain.namespaces)) {
60
+ const models = domainNs.models;
61
+ for (const [modelName, model] of Object.entries(models)) {
62
+ const qualifiedName = `${namespaceId}:${modelName}`;
63
+ if (!model.storage?.table) throw new Error(`Model "${qualifiedName}" is missing storage.table`);
64
+ const tableName = model.storage.table;
65
+ const located = findSqlTable(storage, tableName);
66
+ if (!located) throw new Error(`Model "${qualifiedName}" references non-existent table "${tableName}"`);
67
+ const { table } = located;
68
+ const columnNames = new Set(Object.keys(table.columns));
69
+ const storageFields = model.storage.fields;
70
+ if (!storageFields || Object.keys(storageFields).length === 0) throw new Error(`Model "${qualifiedName}" is missing storage.fields`);
71
+ for (const [fieldName, field] of Object.entries(storageFields)) {
72
+ if (!field.column) throw new Error(`Model "${qualifiedName}" field "${fieldName}" is missing column property`);
73
+ if (!columnNames.has(field.column)) throw new Error(`Model "${qualifiedName}" field "${fieldName}" references non-existent column "${field.column}" in table "${tableName}"`);
74
+ }
75
+ if (!model.relations || typeof model.relations !== "object") throw new Error(`Model "${qualifiedName}" is missing required field "relations" (must be an object)`);
72
76
  }
73
- if (!model.relations || typeof model.relations !== "object") throw new Error(`Model "${modelName}" is missing required field "relations" (must be an object)`);
74
77
  }
75
78
  for (const ns of Object.values(storage.namespaces)) for (const [tableName, tableUnknown] of Object.entries(ns.tables)) {
76
79
  const table = tableUnknown;
@@ -124,9 +127,7 @@ const sqlEmission = {
124
127
  if (!column) return void 0;
125
128
  if (column.typeRef) {
126
129
  const ns = storage.namespaces[located.namespaceId];
127
- const fromNamespace = (ns !== void 0 && "enum" in ns ? ns.enum : void 0)?.[column.typeRef];
128
- const fromDocument = storage.types?.[column.typeRef];
129
- const typeInstance = fromNamespace ?? fromDocument;
130
+ const typeInstance = (ns !== void 0 && "enum" in ns ? ns.enum : void 0)?.[column.typeRef] ?? storage.types?.[column.typeRef];
130
131
  if (typeInstance === void 0) return void 0;
131
132
  if (isPostgresEnumStorageEntry(typeInstance)) return { values: typeInstance.values };
132
133
  return typeInstance.typeParams;
@@ -160,7 +161,7 @@ const sqlEmission = {
160
161
  `export type Contract = ContractWithTypeMaps<${contractBaseName}, ${typeMapsName}>;`,
161
162
  "",
162
163
  "export type Namespaces = Contract['storage']['namespaces'];",
163
- "export type Models = Contract['models'];"
164
+ "export type Models = ContractModelsMap<Contract>;"
164
165
  ].join("\n");
165
166
  }
166
167
  };
@@ -233,7 +234,7 @@ function generateTableLiteralType(table) {
233
234
  const srcCols = fk.source.columns.map((c) => serializeValue(c)).join(", ");
234
235
  const tgtCols = fk.target.columns.map((c) => serializeValue(c)).join(", ");
235
236
  const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : "";
236
- return `{ readonly source: ${`{ readonly namespaceId: ${serializeValue(fk.source.namespaceId)}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`}; readonly target: ${`{ readonly namespaceId: ${serializeValue(fk.target.namespaceId)}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`}${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;
237
+ return `{ readonly source: ${`{ readonly namespaceId: ${serializeNamespaceId(String(fk.source.namespaceId))}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`}; readonly target: ${`{ readonly namespaceId: ${serializeNamespaceId(String(fk.target.namespaceId))}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`}${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;
237
238
  }).join(", ");
238
239
  tableParts.push(`foreignKeys: readonly [${fks}]`);
239
240
  return `{ ${tableParts.join("; ")} }`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["col","codecShape"],"sources":["../src/index.ts"],"sourcesContent":["import type { Contract, ContractModel } from '@prisma-next/contract/types';\nimport { serializeObjectKey, serializeValue } from '@prisma-next/emitter/domain-type-generation';\nimport type {\n GenerateContractTypesOptions,\n ValidationContext,\n} from '@prisma-next/framework-components/emission';\nimport { type Namespace, UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n isPostgresEnumStorageEntry,\n type PostgresEnumStorageEntry,\n type SqlModelStorage,\n type SqlStorage,\n type StorageTable,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\n\nfunction serializeTypeParamsLiteral(params: Record<string, unknown> | undefined): string {\n if (!params || Object.keys(params).length === 0) {\n return 'Record<string, never>';\n }\n\n const entries: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n entries.push(`readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`);\n }\n\n return `{ ${entries.join('; ')} }`;\n}\n\n/**\n * Name-only lookup that walks every namespace until it finds a table\n * with the given name. Survives this slice only for the two model-side\n * call sites whose `SqlModelStorage.table` is still a bare name without\n * a namespace coordinate; both call sites — and this helper — are\n * deleted by TML-2584, which promotes `SqlModelStorage` to carry the\n * model's namespace id so model→table resolution can use explicit\n * coordinates like the FK-ref site already does.\n */\nfunction findSqlTable(\n storage: SqlStorage,\n tableName: string,\n): { readonly table: StorageTable; readonly namespaceId: string } | undefined {\n for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {\n const table = ns.tables[tableName] as StorageTable | undefined;\n if (table !== undefined) {\n return { table, namespaceId };\n }\n }\n return undefined;\n}\n\nfunction assertUniqueSqlTableNames(storage: SqlStorage): void {\n const seen = new Map<string, string>();\n for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {\n for (const tableName of Object.keys(ns.tables)) {\n const existing = seen.get(tableName);\n if (existing !== undefined && existing !== namespaceId) {\n throw new Error(\n `Duplicate table name \"${tableName}\" in namespaces \"${existing}\" and \"${namespaceId}\"`,\n );\n }\n seen.set(tableName, namespaceId);\n }\n }\n}\n\nexport const sqlEmission = {\n id: 'sql',\n\n validateTypes(contract: Contract, _ctx: ValidationContext): void {\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage?.namespaces) {\n return;\n }\n\n const typeIdRegex = /^([^/]+)\\/([^@]+)@(\\d+)$/;\n\n for (const ns of Object.values(storage.namespaces)) {\n for (const [tableName, tableUnknown] of Object.entries(ns.tables)) {\n const table = tableUnknown as StorageTable;\n for (const [colName, colUnknown] of Object.entries(table.columns)) {\n const col = colUnknown as { codecId?: string };\n const codecId = col.codecId;\n if (!codecId) {\n throw new Error(`Column \"${colName}\" in table \"${tableName}\" is missing codecId`);\n }\n\n const match = codecId.match(typeIdRegex);\n if (!match?.[1]) {\n throw new Error(\n `Column \"${colName}\" in table \"${tableName}\" has invalid codec ID format \"${codecId}\". Expected format: ns/name@version`,\n );\n }\n }\n }\n }\n },\n\n validateStructure(contract: Contract): void {\n if (contract.targetFamily !== 'sql') {\n throw new Error(`Expected targetFamily \"sql\", got \"${contract.targetFamily}\"`);\n }\n\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage?.namespaces) {\n throw new Error('SQL contract must have storage.namespaces');\n }\n\n assertUniqueSqlTableNames(storage);\n\n const models = contract.models as Record<string, ContractModel<SqlModelStorage>>;\n const tableNames = new Set<string>();\n for (const ns of Object.values(storage.namespaces)) {\n for (const t of Object.keys(ns.tables)) {\n tableNames.add(t);\n }\n }\n\n if (models) {\n for (const [modelName, model] of Object.entries(models)) {\n if (!model.storage?.table) {\n throw new Error(`Model \"${modelName}\" is missing storage.table`);\n }\n\n const tableName = model.storage.table;\n const located = findSqlTable(storage, tableName);\n if (!located) {\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n const { table } = located;\n const columnNames = new Set(Object.keys(table.columns));\n const storageFields = model.storage.fields;\n if (!storageFields || Object.keys(storageFields).length === 0) {\n throw new Error(`Model \"${modelName}\" is missing storage.fields`);\n }\n\n for (const [fieldName, field] of Object.entries(storageFields)) {\n if (!field.column) {\n throw new Error(`Model \"${modelName}\" field \"${fieldName}\" is missing column property`);\n }\n\n if (!columnNames.has(field.column)) {\n throw new Error(\n `Model \"${modelName}\" field \"${fieldName}\" references non-existent column \"${field.column}\" in table \"${tableName}\"`,\n );\n }\n }\n\n if (!model.relations || typeof model.relations !== 'object') {\n throw new Error(\n `Model \"${modelName}\" is missing required field \"relations\" (must be an object)`,\n );\n }\n }\n }\n\n for (const ns of Object.values(storage.namespaces)) {\n for (const [tableName, tableUnknown] of Object.entries(ns.tables)) {\n const table = tableUnknown as StorageTable;\n const columnNames = new Set(Object.keys(table.columns));\n\n if (!Array.isArray(table.uniques)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"uniques\" (must be an array)`,\n );\n }\n if (!Array.isArray(table.indexes)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"indexes\" (must be an array)`,\n );\n }\n if (!Array.isArray(table.foreignKeys)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"foreignKeys\" (must be an array)`,\n );\n }\n\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" index references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const fk of table.foreignKeys) {\n for (const colName of fk.source.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n const referencedTable = storage.namespaces[fk.target.namespaceId]?.tables[\n fk.target.tableName\n ] as StorageTable | undefined;\n if (!referencedTable) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.target.tableName}\" in namespace \"${fk.target.namespaceId}\"`,\n );\n }\n\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.target.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.target.tableName}\"`,\n );\n }\n }\n\n if (fk.source.columns.length !== fk.target.columns.length) {\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.source.columns.length}) does not match referenced column count (${fk.target.columns.length})`,\n );\n }\n }\n }\n }\n },\n\n generateStorageType(contract: Contract, storageHashTypeName: string): string {\n const storage = contract.storage as unknown as SqlStorage;\n const namespacesType = generateStorageNamespacesType(storage.namespaces);\n const docTypes = generateDocumentScopedStorageTypesType(storage.types);\n const typesClause = docTypes === undefined ? '' : `; readonly types: ${docTypes}`;\n return `{ readonly namespaces: ${namespacesType}${typesClause}; readonly storageHash: ${storageHashTypeName} }`;\n },\n\n generateModelStorageType(_modelName: string, model: ContractModel): string {\n const sqlModel = model as ContractModel<SqlModelStorage>;\n const tableName = sqlModel.storage.table;\n const storageFields = sqlModel.storage.fields;\n\n const storageParts = [`readonly table: ${serializeValue(tableName)}`];\n if (Object.keys(storageFields).length > 0) {\n const fieldParts: string[] = [];\n for (const [fieldName, field] of Object.entries(storageFields)) {\n fieldParts.push(\n `readonly ${serializeObjectKey(fieldName)}: { readonly column: ${serializeValue(field.column)} }`,\n );\n }\n storageParts.push(`readonly fields: { ${fieldParts.join('; ')} }`);\n }\n\n return `{ ${storageParts.join('; ')} }`;\n },\n\n resolveFieldTypeParams(\n _modelName: string,\n fieldName: string,\n model: ContractModel,\n contract: Contract,\n ): Record<string, unknown> | undefined {\n const sqlModel = model as ContractModel<SqlModelStorage>;\n const storageField = sqlModel.storage?.fields?.[fieldName];\n if (!storageField) return undefined;\n\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage) return undefined;\n\n const tableName = sqlModel.storage.table;\n const located = findSqlTable(storage, tableName);\n if (!located) return undefined;\n\n const column = located.table.columns[storageField.column];\n if (!column) return undefined;\n\n if (column.typeRef) {\n const ns = storage.namespaces[located.namespaceId];\n const nsEnums =\n ns !== undefined && 'enum' in ns\n ? (\n ns as {\n enum?: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>;\n }\n ).enum\n : undefined;\n const fromNamespace = nsEnums?.[column.typeRef];\n const fromDocument = storage.types?.[column.typeRef];\n const typeInstance = fromNamespace ?? fromDocument;\n if (typeInstance === undefined) return undefined;\n if (isPostgresEnumStorageEntry(typeInstance)) {\n return { values: typeInstance.values };\n }\n const codecShape = typeInstance as Partial<StorageTypeInstance>;\n return codecShape.typeParams;\n }\n return column.typeParams;\n },\n\n getFamilyImports(): string[] {\n return [\n 'import type {',\n ' ContractWithTypeMaps,',\n ' TypeMaps as TypeMapsType,',\n \"} from '@prisma-next/sql-contract/types';\",\n ];\n },\n\n getFamilyTypeAliases(options?: GenerateContractTypesOptions): string {\n const queryOperationTypeImports = options?.queryOperationTypeImports ?? [];\n const queryOperationAliases = queryOperationTypeImports\n .filter((imp) => imp.named === 'QueryOperationTypes')\n .map((imp) => `${imp.alias}<CodecTypes>`);\n const queryOperationTypes =\n queryOperationAliases.length > 0\n ? queryOperationAliases.join(' & ')\n : 'Record<string, never>';\n\n return [\n 'export type LaneCodecTypes = CodecTypes;',\n `export type QueryOperationTypes = ${queryOperationTypes};`,\n 'type DefaultLiteralValue<CodecId extends string, _Encoded> =',\n ' CodecId extends keyof CodecTypes',\n \" ? CodecTypes[CodecId]['output']\",\n ' : _Encoded;',\n ].join('\\n');\n },\n\n getTypeMapsExpression(): string {\n return 'TypeMapsType<CodecTypes, QueryOperationTypes, FieldOutputTypes, FieldInputTypes>';\n },\n\n getContractWrapper(contractBaseName: string, typeMapsName: string): string {\n return [\n `export type Contract = ContractWithTypeMaps<${contractBaseName}, ${typeMapsName}>;`,\n '',\n \"export type Namespaces = Contract['storage']['namespaces'];\",\n \"export type Models = Contract['models'];\",\n ].join('\\n');\n },\n} as const;\n\nfunction generateDocumentScopedStorageTypesType(types: SqlStorage['types']): string | undefined {\n if (!types || Object.keys(types).length === 0) {\n return undefined;\n }\n\n const typeEntries: string[] = [];\n for (const [typeName, typeInstance] of Object.entries(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n throw new Error(\n `Document-scoped storage.types entry \"${typeName}\" is a postgres-enum; enums belong under storage.namespaces[namespaceId].enum`,\n );\n }\n const codecInstanceShape = typeInstance as Partial<StorageTypeInstance>;\n if (\n typeof codecInstanceShape.codecId !== 'string' ||\n typeof codecInstanceShape.nativeType !== 'string'\n ) {\n throw new Error(\n `Unknown storage type kind for \"${typeName}\" in document-scoped storage.types; expected a codec-instance triple.`,\n );\n }\n const codecId = serializeValue(codecInstanceShape.codecId);\n const nativeType = serializeValue(codecInstanceShape.nativeType);\n const typeParamsStr = serializeTypeParamsLiteral(codecInstanceShape.typeParams);\n typeEntries.push(\n `readonly ${typeName}: { readonly kind: 'codec-instance'; readonly codecId: ${codecId}; readonly nativeType: ${nativeType}; readonly typeParams: ${typeParamsStr} }`,\n );\n }\n\n return `{ ${typeEntries.join('; ')} }`;\n}\n\nfunction generatePostgresNamespaceTypesType(\n types: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>,\n): string {\n if (Object.keys(types).length === 0) {\n return 'Record<string, never>';\n }\n\n const typeEntries: string[] = [];\n for (const [typeName, typeInstance] of Object.entries(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n const codecId = serializeValue(typeInstance.codecId);\n const nativeType = serializeValue(typeInstance.nativeType);\n const name = serializeValue(typeInstance.name);\n const valuesLiteral = typeInstance.values.map((v) => serializeValue(v)).join(', ');\n typeEntries.push(\n `readonly ${serializeObjectKey(typeName)}: { readonly kind: 'postgres-enum'; readonly name: ${name}; readonly nativeType: ${nativeType}; readonly codecId: ${codecId}; readonly values: readonly [${valuesLiteral}] }`,\n );\n continue;\n }\n throw new Error(\n `Unknown namespace storage type kind for \"${typeName}\"; expected postgres-enum in namespace.enum.`,\n );\n }\n return `{ ${typeEntries.join('; ')} }`;\n}\n\nfunction isPostgresSchemaNamespace(ns: Namespace): ns is Namespace & {\n readonly enum: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>;\n} {\n return (\n (ns as { kind?: unknown }).kind === 'schema' &&\n 'enum' in ns &&\n typeof (ns as { enum?: unknown }).enum === 'object' &&\n (ns as { enum?: unknown }).enum !== null\n );\n}\n\nconst SQL_NAMESPACE_KIND_FALLBACK = 'sql-namespace' as const;\n\nfunction namespaceSerializedKind(ns: Namespace): string {\n const kind = (ns as { kind?: unknown }).kind;\n if (kind === 'schema') {\n const id = ns.id;\n const lit = id === UNBOUND_NAMESPACE_ID ? 'postgres-unbound-schema' : 'postgres-schema';\n return `readonly kind: '${lit}'`;\n }\n if (typeof kind === 'string') {\n return `readonly kind: ${serializeValue(kind)}`;\n }\n // Plain-literal namespaces built via the contract-ts DSL bypass the\n // class-level `Object.defineProperty(this, 'kind', { value, enumerable: false })`\n // path, so `ns.kind` is missing on the runtime object. Surfacing the\n // framework-default kind here keeps the emitted `.d.ts` literal\n // structurally assignable to `Namespace`, which now requires `kind`.\n return `readonly kind: '${SQL_NAMESPACE_KIND_FALLBACK}'`;\n}\n\nfunction generateTableLiteralType(table: StorageTable): string {\n const columns: string[] = [];\n for (const [colName, col] of Object.entries(table.columns)) {\n const nullable = col.nullable ? 'true' : 'false';\n const nativeType = serializeValue(col.nativeType);\n const codecId = serializeValue(col.codecId);\n const defaultSpec = col.default\n ? col.default.kind === 'literal'\n ? `; readonly default: { readonly kind: 'literal'; readonly value: DefaultLiteralValue<${codecId}, ${serializeValue(\n col.default.value,\n )}> }`\n : `; readonly default: { readonly kind: 'function'; readonly expression: ${serializeValue(\n col.default.expression,\n )} }`\n : '';\n const typeParamsSpec =\n col.typeParams && Object.keys(col.typeParams).length > 0\n ? `; readonly typeParams: ${serializeTypeParamsLiteral(col.typeParams)}`\n : '';\n const typeRefSpec = col.typeRef ? `; readonly typeRef: ${serializeValue(col.typeRef)}` : '';\n columns.push(\n `readonly ${colName}: { readonly nativeType: ${nativeType}; readonly codecId: ${codecId}; readonly nullable: ${nullable}${defaultSpec}${typeParamsSpec}${typeRefSpec} }`,\n );\n }\n\n const tableParts: string[] = [`columns: { ${columns.join('; ')} }`];\n\n if (table.primaryKey) {\n const pkCols = table.primaryKey.columns.map((c) => serializeValue(c)).join(', ');\n const pkName = table.primaryKey.name\n ? `; readonly name: ${serializeValue(table.primaryKey.name)}`\n : '';\n tableParts.push(`primaryKey: { readonly columns: readonly [${pkCols}]${pkName} }`);\n }\n\n const uniques = table.uniques\n .map((u) => {\n const cols = u.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = u.name ? `; readonly name: ${serializeValue(u.name)}` : '';\n return `{ readonly columns: readonly [${cols}]${name} }`;\n })\n .join(', ');\n tableParts.push(`uniques: readonly [${uniques}]`);\n\n const indexes = table.indexes\n .map((i) => {\n const cols = i.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = i.name !== undefined ? `; readonly name: ${serializeValue(i.name)}` : '';\n const indexType = i.type !== undefined ? `; readonly type: ${serializeValue(i.type)}` : '';\n const indexOptions =\n i.options !== undefined ? `; readonly options: ${serializeValue(i.options)}` : '';\n return `{ readonly columns: readonly [${cols}]${name}${indexType}${indexOptions} }`;\n })\n .join(', ');\n tableParts.push(`indexes: readonly [${indexes}]`);\n\n const fks = table.foreignKeys\n .map((fk) => {\n const srcCols = fk.source.columns.map((c: string) => serializeValue(c)).join(', ');\n const tgtCols = fk.target.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : '';\n const srcRef = `{ readonly namespaceId: ${serializeValue(fk.source.namespaceId)}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`;\n const tgtRef = `{ readonly namespaceId: ${serializeValue(fk.target.namespaceId)}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`;\n return `{ readonly source: ${srcRef}; readonly target: ${tgtRef}${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;\n })\n .join(', ');\n tableParts.push(`foreignKeys: readonly [${fks}]`);\n\n return `{ ${tableParts.join('; ')} }`;\n}\n\nfunction generateTablesMapType(tables: Readonly<Record<string, StorageTable>>): string {\n const tableEntries: string[] = [];\n for (const [tableName, table] of Object.entries(tables).sort(([a], [b]) => a.localeCompare(b))) {\n tableEntries.push(`readonly ${tableName}: ${generateTableLiteralType(table)}`);\n }\n if (tableEntries.length === 0) {\n // Empty namespaces must emit `{}` (whose `keyof` is `never`), not\n // `Record<string, never>` (whose `keyof` is `string`). The latter\n // collapses `Db<C>` to a string-indexed shape and erases literal\n // table-name inference at every consumer site that walks all\n // namespaces (e.g. `db.sql.<tableName>`).\n return '{}';\n }\n return `{ ${tableEntries.join('; ')} }`;\n}\n\nfunction generateStorageNamespacesType(namespaces: SqlStorage['namespaces']): string {\n const entries = Object.entries(namespaces ?? {}).sort(([a], [b]) => a.localeCompare(b));\n if (entries.length === 0) {\n return 'Record<string, never>';\n }\n const parts: string[] = [];\n for (const [name, ns] of entries) {\n const kindSuffix = `; ${namespaceSerializedKind(ns)}`;\n const tablesType = generateTablesMapType(ns.tables as Readonly<Record<string, StorageTable>>);\n const isPg = isPostgresSchemaNamespace(ns);\n const enumClause = isPg\n ? `; readonly enum: ${generatePostgresNamespaceTypesType(ns.enum)}`\n : '';\n parts.push(\n `readonly ${serializeObjectKey(name)}: { readonly id: ${serializeValue(ns.id)}${kindSuffix}; readonly tables: ${tablesType}${enumClause} }`,\n );\n }\n return `{ ${parts.join('; ')} }`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["col","codecShape"],"sources":["../src/index.ts"],"sourcesContent":["import type { Contract, ContractModel } from '@prisma-next/contract/types';\nimport {\n serializeNamespaceId,\n serializeObjectKey,\n serializeValue,\n} from '@prisma-next/emitter/domain-type-generation';\nimport type {\n GenerateContractTypesOptions,\n ValidationContext,\n} from '@prisma-next/framework-components/emission';\nimport { type Namespace, UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n isPostgresEnumStorageEntry,\n type PostgresEnumStorageEntry,\n type SqlModelStorage,\n type SqlStorage,\n type StorageTable,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\n\nfunction serializeTypeParamsLiteral(params: Record<string, unknown> | undefined): string {\n if (!params || Object.keys(params).length === 0) {\n return 'Record<string, never>';\n }\n\n const entries: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n entries.push(`readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`);\n }\n\n return `{ ${entries.join('; ')} }`;\n}\n\n/**\n * Name-only lookup that walks every namespace until it finds a table\n * with the given name. Survives this slice only for the two model-side\n * call sites whose `SqlModelStorage.table` is still a bare name without\n * a namespace coordinate; both call sites — and this helper — are\n * deleted by TML-2584, which promotes `SqlModelStorage` to carry the\n * model's namespace id so model→table resolution can use explicit\n * coordinates like the FK-ref site already does.\n */\nfunction findSqlTable(\n storage: SqlStorage,\n tableName: string,\n): { readonly table: StorageTable; readonly namespaceId: string } | undefined {\n for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {\n const table = ns.tables[tableName] as StorageTable | undefined;\n if (table !== undefined) {\n return { table, namespaceId };\n }\n }\n return undefined;\n}\n\nfunction assertUniqueSqlTableNames(storage: SqlStorage): void {\n const seen = new Map<string, string>();\n for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {\n for (const tableName of Object.keys(ns.tables)) {\n const existing = seen.get(tableName);\n if (existing !== undefined && existing !== namespaceId) {\n throw new Error(\n `Duplicate table name \"${tableName}\" in namespaces \"${existing}\" and \"${namespaceId}\"`,\n );\n }\n seen.set(tableName, namespaceId);\n }\n }\n}\n\nexport const sqlEmission = {\n id: 'sql',\n\n validateTypes(contract: Contract, _ctx: ValidationContext): void {\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage?.namespaces) {\n return;\n }\n\n const typeIdRegex = /^([^/]+)\\/([^@]+)@(\\d+)$/;\n\n for (const ns of Object.values(storage.namespaces)) {\n for (const [tableName, tableUnknown] of Object.entries(ns.tables)) {\n const table = tableUnknown as StorageTable;\n for (const [colName, colUnknown] of Object.entries(table.columns)) {\n const col = colUnknown as { codecId?: string };\n const codecId = col.codecId;\n if (!codecId) {\n throw new Error(`Column \"${colName}\" in table \"${tableName}\" is missing codecId`);\n }\n\n const match = codecId.match(typeIdRegex);\n if (!match?.[1]) {\n throw new Error(\n `Column \"${colName}\" in table \"${tableName}\" has invalid codec ID format \"${codecId}\". Expected format: ns/name@version`,\n );\n }\n }\n }\n }\n },\n\n validateStructure(contract: Contract): void {\n if (contract.targetFamily !== 'sql') {\n throw new Error(`Expected targetFamily \"sql\", got \"${contract.targetFamily}\"`);\n }\n\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage?.namespaces) {\n throw new Error('SQL contract must have storage.namespaces');\n }\n\n assertUniqueSqlTableNames(storage);\n\n const tableNames = new Set<string>();\n for (const ns of Object.values(storage.namespaces)) {\n for (const t of Object.keys(ns.tables)) {\n tableNames.add(t);\n }\n }\n\n for (const [namespaceId, domainNs] of Object.entries(contract.domain.namespaces)) {\n const models = domainNs.models as Record<string, ContractModel<SqlModelStorage>>;\n for (const [modelName, model] of Object.entries(models)) {\n const qualifiedName = `${namespaceId}:${modelName}`;\n if (!model.storage?.table) {\n throw new Error(`Model \"${qualifiedName}\" is missing storage.table`);\n }\n\n const tableName = model.storage.table;\n const located = findSqlTable(storage, tableName);\n if (!located) {\n throw new Error(`Model \"${qualifiedName}\" references non-existent table \"${tableName}\"`);\n }\n\n const { table } = located;\n const columnNames = new Set(Object.keys(table.columns));\n const storageFields = model.storage.fields;\n if (!storageFields || Object.keys(storageFields).length === 0) {\n throw new Error(`Model \"${qualifiedName}\" is missing storage.fields`);\n }\n\n for (const [fieldName, field] of Object.entries(storageFields)) {\n if (!field.column) {\n throw new Error(\n `Model \"${qualifiedName}\" field \"${fieldName}\" is missing column property`,\n );\n }\n\n if (!columnNames.has(field.column)) {\n throw new Error(\n `Model \"${qualifiedName}\" field \"${fieldName}\" references non-existent column \"${field.column}\" in table \"${tableName}\"`,\n );\n }\n }\n\n if (!model.relations || typeof model.relations !== 'object') {\n throw new Error(\n `Model \"${qualifiedName}\" is missing required field \"relations\" (must be an object)`,\n );\n }\n }\n }\n\n for (const ns of Object.values(storage.namespaces)) {\n for (const [tableName, tableUnknown] of Object.entries(ns.tables)) {\n const table = tableUnknown as StorageTable;\n const columnNames = new Set(Object.keys(table.columns));\n\n if (!Array.isArray(table.uniques)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"uniques\" (must be an array)`,\n );\n }\n if (!Array.isArray(table.indexes)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"indexes\" (must be an array)`,\n );\n }\n if (!Array.isArray(table.foreignKeys)) {\n throw new Error(\n `Table \"${tableName}\" is missing required field \"foreignKeys\" (must be an array)`,\n );\n }\n\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" index references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const fk of table.foreignKeys) {\n for (const colName of fk.source.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n const referencedTable = storage.namespaces[fk.target.namespaceId]?.tables[\n fk.target.tableName\n ] as StorageTable | undefined;\n if (!referencedTable) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.target.tableName}\" in namespace \"${fk.target.namespaceId}\"`,\n );\n }\n\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.target.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.target.tableName}\"`,\n );\n }\n }\n\n if (fk.source.columns.length !== fk.target.columns.length) {\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.source.columns.length}) does not match referenced column count (${fk.target.columns.length})`,\n );\n }\n }\n }\n }\n },\n\n generateStorageType(contract: Contract, storageHashTypeName: string): string {\n const storage = contract.storage as unknown as SqlStorage;\n const namespacesType = generateStorageNamespacesType(storage.namespaces);\n const docTypes = generateDocumentScopedStorageTypesType(storage.types);\n const typesClause = docTypes === undefined ? '' : `; readonly types: ${docTypes}`;\n return `{ readonly namespaces: ${namespacesType}${typesClause}; readonly storageHash: ${storageHashTypeName} }`;\n },\n\n generateModelStorageType(_modelName: string, model: ContractModel): string {\n const sqlModel = model as ContractModel<SqlModelStorage>;\n const tableName = sqlModel.storage.table;\n const storageFields = sqlModel.storage.fields;\n\n const storageParts = [`readonly table: ${serializeValue(tableName)}`];\n if (Object.keys(storageFields).length > 0) {\n const fieldParts: string[] = [];\n for (const [fieldName, field] of Object.entries(storageFields)) {\n fieldParts.push(\n `readonly ${serializeObjectKey(fieldName)}: { readonly column: ${serializeValue(field.column)} }`,\n );\n }\n storageParts.push(`readonly fields: { ${fieldParts.join('; ')} }`);\n }\n\n return `{ ${storageParts.join('; ')} }`;\n },\n\n resolveFieldTypeParams(\n _modelName: string,\n fieldName: string,\n model: ContractModel,\n contract: Contract,\n ): Record<string, unknown> | undefined {\n const sqlModel = model as ContractModel<SqlModelStorage>;\n const storageField = sqlModel.storage?.fields?.[fieldName];\n if (!storageField) return undefined;\n\n const storage = contract.storage as unknown as SqlStorage | undefined;\n if (!storage) return undefined;\n\n const tableName = sqlModel.storage.table;\n const located = findSqlTable(storage, tableName);\n if (!located) return undefined;\n\n const column = located.table.columns[storageField.column];\n if (!column) return undefined;\n\n if (column.typeRef) {\n const ns = storage.namespaces[located.namespaceId];\n const nsEnums =\n ns !== undefined && 'enum' in ns\n ? (\n ns as {\n enum?: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>;\n }\n ).enum\n : undefined;\n const fromNamespace = nsEnums?.[column.typeRef];\n const typeInstance = fromNamespace ?? storage.types?.[column.typeRef];\n if (typeInstance === undefined) return undefined;\n if (isPostgresEnumStorageEntry(typeInstance)) {\n return { values: typeInstance.values };\n }\n const codecShape = typeInstance as Partial<StorageTypeInstance>;\n return codecShape.typeParams;\n }\n return column.typeParams;\n },\n\n getFamilyImports(): string[] {\n return [\n 'import type {',\n ' ContractWithTypeMaps,',\n ' TypeMaps as TypeMapsType,',\n \"} from '@prisma-next/sql-contract/types';\",\n ];\n },\n\n getFamilyTypeAliases(options?: GenerateContractTypesOptions): string {\n const queryOperationTypeImports = options?.queryOperationTypeImports ?? [];\n const queryOperationAliases = queryOperationTypeImports\n .filter((imp) => imp.named === 'QueryOperationTypes')\n .map((imp) => `${imp.alias}<CodecTypes>`);\n const queryOperationTypes =\n queryOperationAliases.length > 0\n ? queryOperationAliases.join(' & ')\n : 'Record<string, never>';\n\n return [\n 'export type LaneCodecTypes = CodecTypes;',\n `export type QueryOperationTypes = ${queryOperationTypes};`,\n 'type DefaultLiteralValue<CodecId extends string, _Encoded> =',\n ' CodecId extends keyof CodecTypes',\n \" ? CodecTypes[CodecId]['output']\",\n ' : _Encoded;',\n ].join('\\n');\n },\n\n getTypeMapsExpression(): string {\n return 'TypeMapsType<CodecTypes, QueryOperationTypes, FieldOutputTypes, FieldInputTypes>';\n },\n\n getContractWrapper(contractBaseName: string, typeMapsName: string): string {\n return [\n `export type Contract = ContractWithTypeMaps<${contractBaseName}, ${typeMapsName}>;`,\n '',\n \"export type Namespaces = Contract['storage']['namespaces'];\",\n 'export type Models = ContractModelsMap<Contract>;',\n ].join('\\n');\n },\n} as const;\n\nfunction generateDocumentScopedStorageTypesType(types: SqlStorage['types']): string | undefined {\n if (!types || Object.keys(types).length === 0) {\n return undefined;\n }\n\n const typeEntries: string[] = [];\n for (const [typeName, typeInstance] of Object.entries(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n throw new Error(\n `Document-scoped storage.types entry \"${typeName}\" is a postgres-enum; enums belong under storage.namespaces[namespaceId].enum`,\n );\n }\n const codecInstanceShape = typeInstance as Partial<StorageTypeInstance>;\n if (\n typeof codecInstanceShape.codecId !== 'string' ||\n typeof codecInstanceShape.nativeType !== 'string'\n ) {\n throw new Error(\n `Unknown storage type kind for \"${typeName}\" in document-scoped storage.types; expected a codec-instance triple.`,\n );\n }\n const codecId = serializeValue(codecInstanceShape.codecId);\n const nativeType = serializeValue(codecInstanceShape.nativeType);\n const typeParamsStr = serializeTypeParamsLiteral(codecInstanceShape.typeParams);\n typeEntries.push(\n `readonly ${typeName}: { readonly kind: 'codec-instance'; readonly codecId: ${codecId}; readonly nativeType: ${nativeType}; readonly typeParams: ${typeParamsStr} }`,\n );\n }\n\n return `{ ${typeEntries.join('; ')} }`;\n}\n\nfunction generatePostgresNamespaceTypesType(\n types: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>,\n): string {\n if (Object.keys(types).length === 0) {\n return 'Record<string, never>';\n }\n\n const typeEntries: string[] = [];\n for (const [typeName, typeInstance] of Object.entries(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n const codecId = serializeValue(typeInstance.codecId);\n const nativeType = serializeValue(typeInstance.nativeType);\n const name = serializeValue(typeInstance.name);\n const valuesLiteral = typeInstance.values.map((v) => serializeValue(v)).join(', ');\n typeEntries.push(\n `readonly ${serializeObjectKey(typeName)}: { readonly kind: 'postgres-enum'; readonly name: ${name}; readonly nativeType: ${nativeType}; readonly codecId: ${codecId}; readonly values: readonly [${valuesLiteral}] }`,\n );\n continue;\n }\n throw new Error(\n `Unknown namespace storage type kind for \"${typeName}\"; expected postgres-enum in namespace.enum.`,\n );\n }\n return `{ ${typeEntries.join('; ')} }`;\n}\n\nfunction isPostgresSchemaNamespace(ns: Namespace): ns is Namespace & {\n readonly enum: Readonly<Record<string, PostgresEnumStorageEntry | StorageTypeInstance>>;\n} {\n return (\n (ns as { kind?: unknown }).kind === 'schema' &&\n 'enum' in ns &&\n typeof (ns as { enum?: unknown }).enum === 'object' &&\n (ns as { enum?: unknown }).enum !== null\n );\n}\n\nconst SQL_NAMESPACE_KIND_FALLBACK = 'sql-namespace' as const;\n\nfunction namespaceSerializedKind(ns: Namespace): string {\n const kind = (ns as { kind?: unknown }).kind;\n if (kind === 'schema') {\n const id = ns.id;\n const lit = id === UNBOUND_NAMESPACE_ID ? 'postgres-unbound-schema' : 'postgres-schema';\n return `readonly kind: '${lit}'`;\n }\n if (typeof kind === 'string') {\n return `readonly kind: ${serializeValue(kind)}`;\n }\n // Plain-literal namespaces built via the contract-ts DSL bypass the\n // class-level `Object.defineProperty(this, 'kind', { value, enumerable: false })`\n // path, so `ns.kind` is missing on the runtime object. Surfacing the\n // framework-default kind here keeps the emitted `.d.ts` literal\n // structurally assignable to `Namespace`, which now requires `kind`.\n return `readonly kind: '${SQL_NAMESPACE_KIND_FALLBACK}'`;\n}\n\nfunction generateTableLiteralType(table: StorageTable): string {\n const columns: string[] = [];\n for (const [colName, col] of Object.entries(table.columns)) {\n const nullable = col.nullable ? 'true' : 'false';\n const nativeType = serializeValue(col.nativeType);\n const codecId = serializeValue(col.codecId);\n const defaultSpec = col.default\n ? col.default.kind === 'literal'\n ? `; readonly default: { readonly kind: 'literal'; readonly value: DefaultLiteralValue<${codecId}, ${serializeValue(\n col.default.value,\n )}> }`\n : `; readonly default: { readonly kind: 'function'; readonly expression: ${serializeValue(\n col.default.expression,\n )} }`\n : '';\n const typeParamsSpec =\n col.typeParams && Object.keys(col.typeParams).length > 0\n ? `; readonly typeParams: ${serializeTypeParamsLiteral(col.typeParams)}`\n : '';\n const typeRefSpec = col.typeRef ? `; readonly typeRef: ${serializeValue(col.typeRef)}` : '';\n columns.push(\n `readonly ${colName}: { readonly nativeType: ${nativeType}; readonly codecId: ${codecId}; readonly nullable: ${nullable}${defaultSpec}${typeParamsSpec}${typeRefSpec} }`,\n );\n }\n\n const tableParts: string[] = [`columns: { ${columns.join('; ')} }`];\n\n if (table.primaryKey) {\n const pkCols = table.primaryKey.columns.map((c) => serializeValue(c)).join(', ');\n const pkName = table.primaryKey.name\n ? `; readonly name: ${serializeValue(table.primaryKey.name)}`\n : '';\n tableParts.push(`primaryKey: { readonly columns: readonly [${pkCols}]${pkName} }`);\n }\n\n const uniques = table.uniques\n .map((u) => {\n const cols = u.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = u.name ? `; readonly name: ${serializeValue(u.name)}` : '';\n return `{ readonly columns: readonly [${cols}]${name} }`;\n })\n .join(', ');\n tableParts.push(`uniques: readonly [${uniques}]`);\n\n const indexes = table.indexes\n .map((i) => {\n const cols = i.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = i.name !== undefined ? `; readonly name: ${serializeValue(i.name)}` : '';\n const indexType = i.type !== undefined ? `; readonly type: ${serializeValue(i.type)}` : '';\n const indexOptions =\n i.options !== undefined ? `; readonly options: ${serializeValue(i.options)}` : '';\n return `{ readonly columns: readonly [${cols}]${name}${indexType}${indexOptions} }`;\n })\n .join(', ');\n tableParts.push(`indexes: readonly [${indexes}]`);\n\n const fks = table.foreignKeys\n .map((fk) => {\n const srcCols = fk.source.columns.map((c: string) => serializeValue(c)).join(', ');\n const tgtCols = fk.target.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : '';\n const srcRef = `{ readonly namespaceId: ${serializeNamespaceId(String(fk.source.namespaceId))}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`;\n const tgtRef = `{ readonly namespaceId: ${serializeNamespaceId(String(fk.target.namespaceId))}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`;\n return `{ readonly source: ${srcRef}; readonly target: ${tgtRef}${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;\n })\n .join(', ');\n tableParts.push(`foreignKeys: readonly [${fks}]`);\n\n return `{ ${tableParts.join('; ')} }`;\n}\n\nfunction generateTablesMapType(tables: Readonly<Record<string, StorageTable>>): string {\n const tableEntries: string[] = [];\n for (const [tableName, table] of Object.entries(tables).sort(([a], [b]) => a.localeCompare(b))) {\n tableEntries.push(`readonly ${tableName}: ${generateTableLiteralType(table)}`);\n }\n if (tableEntries.length === 0) {\n // Empty namespaces must emit `{}` (whose `keyof` is `never`), not\n // `Record<string, never>` (whose `keyof` is `string`). The latter\n // collapses `Db<C>` to a string-indexed shape and erases literal\n // table-name inference at every consumer site that walks all\n // namespaces (e.g. `db.sql.<tableName>`).\n return '{}';\n }\n return `{ ${tableEntries.join('; ')} }`;\n}\n\nfunction generateStorageNamespacesType(namespaces: SqlStorage['namespaces']): string {\n const entries = Object.entries(namespaces ?? {}).sort(([a], [b]) => a.localeCompare(b));\n if (entries.length === 0) {\n return 'Record<string, never>';\n }\n const parts: string[] = [];\n for (const [name, ns] of entries) {\n const kindSuffix = `; ${namespaceSerializedKind(ns)}`;\n const tablesType = generateTablesMapType(ns.tables as Readonly<Record<string, StorageTable>>);\n const isPg = isPostgresSchemaNamespace(ns);\n const enumClause = isPg\n ? `; readonly enum: ${generatePostgresNamespaceTypesType(ns.enum)}`\n : '';\n parts.push(\n `readonly ${serializeObjectKey(name)}: { readonly id: ${serializeValue(ns.id)}${kindSuffix}; readonly tables: ${tablesType}${enumClause} }`,\n );\n }\n return `{ ${parts.join('; ')} }`;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,34 +1,45 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-contract-emitter",
3
- "version": "0.11.0-dev.9",
3
+ "version": "0.12.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "SQL emitter hook for Prisma Next",
8
8
  "dependencies": {
9
- "@prisma-next/contract": "0.11.0-dev.9",
10
- "@prisma-next/emitter": "0.11.0-dev.9",
11
- "@prisma-next/framework-components": "0.11.0-dev.9",
12
- "@prisma-next/sql-contract": "0.11.0-dev.9",
13
- "@prisma-next/utils": "0.11.0-dev.9"
9
+ "@prisma-next/contract": "0.12.0",
10
+ "@prisma-next/emitter": "0.12.0",
11
+ "@prisma-next/framework-components": "0.12.0",
12
+ "@prisma-next/sql-contract": "0.12.0",
13
+ "@prisma-next/utils": "0.12.0"
14
14
  },
15
15
  "devDependencies": {
16
- "@prisma-next/test-utils": "0.11.0-dev.9",
17
- "@prisma-next/tsconfig": "0.11.0-dev.9",
18
- "@prisma-next/tsdown": "0.11.0-dev.9",
16
+ "@prisma-next/test-utils": "0.12.0",
17
+ "@prisma-next/tsconfig": "0.12.0",
18
+ "@prisma-next/tsdown": "0.12.0",
19
19
  "tsdown": "0.22.0",
20
20
  "typescript": "5.9.3",
21
21
  "vitest": "4.1.6"
22
22
  },
23
+ "peerDependencies": {
24
+ "typescript": ">=5.9"
25
+ },
26
+ "peerDependenciesMeta": {
27
+ "typescript": {
28
+ "optional": true
29
+ }
30
+ },
23
31
  "files": [
24
32
  "dist",
25
33
  "src"
26
34
  ],
35
+ "types": "./dist/index.d.mts",
27
36
  "exports": {
28
37
  ".": "./dist/index.mjs",
29
38
  "./package.json": "./package.json"
30
39
  },
31
- "types": "./dist/index.d.mts",
40
+ "engines": {
41
+ "node": ">=24"
42
+ },
32
43
  "repository": {
33
44
  "type": "git",
34
45
  "url": "https://github.com/prisma/prisma-next.git",
package/src/index.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import type { Contract, ContractModel } from '@prisma-next/contract/types';
2
- import { serializeObjectKey, serializeValue } from '@prisma-next/emitter/domain-type-generation';
2
+ import {
3
+ serializeNamespaceId,
4
+ serializeObjectKey,
5
+ serializeValue,
6
+ } from '@prisma-next/emitter/domain-type-generation';
3
7
  import type {
4
8
  GenerateContractTypesOptions,
5
9
  ValidationContext,
@@ -108,7 +112,6 @@ export const sqlEmission = {
108
112
 
109
113
  assertUniqueSqlTableNames(storage);
110
114
 
111
- const models = contract.models as Record<string, ContractModel<SqlModelStorage>>;
112
115
  const tableNames = new Set<string>();
113
116
  for (const ns of Object.values(storage.namespaces)) {
114
117
  for (const t of Object.keys(ns.tables)) {
@@ -116,40 +119,44 @@ export const sqlEmission = {
116
119
  }
117
120
  }
118
121
 
119
- if (models) {
122
+ for (const [namespaceId, domainNs] of Object.entries(contract.domain.namespaces)) {
123
+ const models = domainNs.models as Record<string, ContractModel<SqlModelStorage>>;
120
124
  for (const [modelName, model] of Object.entries(models)) {
125
+ const qualifiedName = `${namespaceId}:${modelName}`;
121
126
  if (!model.storage?.table) {
122
- throw new Error(`Model "${modelName}" is missing storage.table`);
127
+ throw new Error(`Model "${qualifiedName}" is missing storage.table`);
123
128
  }
124
129
 
125
130
  const tableName = model.storage.table;
126
131
  const located = findSqlTable(storage, tableName);
127
132
  if (!located) {
128
- throw new Error(`Model "${modelName}" references non-existent table "${tableName}"`);
133
+ throw new Error(`Model "${qualifiedName}" references non-existent table "${tableName}"`);
129
134
  }
130
135
 
131
136
  const { table } = located;
132
137
  const columnNames = new Set(Object.keys(table.columns));
133
138
  const storageFields = model.storage.fields;
134
139
  if (!storageFields || Object.keys(storageFields).length === 0) {
135
- throw new Error(`Model "${modelName}" is missing storage.fields`);
140
+ throw new Error(`Model "${qualifiedName}" is missing storage.fields`);
136
141
  }
137
142
 
138
143
  for (const [fieldName, field] of Object.entries(storageFields)) {
139
144
  if (!field.column) {
140
- throw new Error(`Model "${modelName}" field "${fieldName}" is missing column property`);
145
+ throw new Error(
146
+ `Model "${qualifiedName}" field "${fieldName}" is missing column property`,
147
+ );
141
148
  }
142
149
 
143
150
  if (!columnNames.has(field.column)) {
144
151
  throw new Error(
145
- `Model "${modelName}" field "${fieldName}" references non-existent column "${field.column}" in table "${tableName}"`,
152
+ `Model "${qualifiedName}" field "${fieldName}" references non-existent column "${field.column}" in table "${tableName}"`,
146
153
  );
147
154
  }
148
155
  }
149
156
 
150
157
  if (!model.relations || typeof model.relations !== 'object') {
151
158
  throw new Error(
152
- `Model "${modelName}" is missing required field "relations" (must be an object)`,
159
+ `Model "${qualifiedName}" is missing required field "relations" (must be an object)`,
153
160
  );
154
161
  }
155
162
  }
@@ -301,8 +308,7 @@ export const sqlEmission = {
301
308
  ).enum
302
309
  : undefined;
303
310
  const fromNamespace = nsEnums?.[column.typeRef];
304
- const fromDocument = storage.types?.[column.typeRef];
305
- const typeInstance = fromNamespace ?? fromDocument;
311
+ const typeInstance = fromNamespace ?? storage.types?.[column.typeRef];
306
312
  if (typeInstance === undefined) return undefined;
307
313
  if (isPostgresEnumStorageEntry(typeInstance)) {
308
314
  return { values: typeInstance.values };
@@ -351,7 +357,7 @@ export const sqlEmission = {
351
357
  `export type Contract = ContractWithTypeMaps<${contractBaseName}, ${typeMapsName}>;`,
352
358
  '',
353
359
  "export type Namespaces = Contract['storage']['namespaces'];",
354
- "export type Models = Contract['models'];",
360
+ 'export type Models = ContractModelsMap<Contract>;',
355
361
  ].join('\n');
356
362
  },
357
363
  } as const;
@@ -506,8 +512,8 @@ function generateTableLiteralType(table: StorageTable): string {
506
512
  const srcCols = fk.source.columns.map((c: string) => serializeValue(c)).join(', ');
507
513
  const tgtCols = fk.target.columns.map((c: string) => serializeValue(c)).join(', ');
508
514
  const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : '';
509
- const srcRef = `{ readonly namespaceId: ${serializeValue(fk.source.namespaceId)}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`;
510
- const tgtRef = `{ readonly namespaceId: ${serializeValue(fk.target.namespaceId)}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`;
515
+ const srcRef = `{ readonly namespaceId: ${serializeNamespaceId(String(fk.source.namespaceId))}; readonly tableName: ${serializeValue(fk.source.tableName)}; readonly columns: readonly [${srcCols}] }`;
516
+ const tgtRef = `{ readonly namespaceId: ${serializeNamespaceId(String(fk.target.namespaceId))}; readonly tableName: ${serializeValue(fk.target.tableName)}; readonly columns: readonly [${tgtCols}] }`;
511
517
  return `{ readonly source: ${srcRef}; readonly target: ${tgtRef}${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;
512
518
  })
513
519
  .join(', ');