@prisma-next/sql-contract-emitter 0.5.0-dev.8 → 0.5.0-dev.80
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/index.d.mts +24 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +18 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -8
- package/src/index.ts +35 -13
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { Contract, ContractModel } from "@prisma-next/contract/types";
|
|
2
|
-
import { GenerateContractTypesOptions, ValidationContext } from "@prisma-next/framework-components/emission";
|
|
3
2
|
|
|
3
|
+
//#region ../../../1-framework/1-core/framework-components/dist/types-import-spec-BxI5cSQy.d.mts
|
|
4
|
+
//#region src/shared/types-import-spec.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Specifies how to import TypeScript types from a package.
|
|
7
|
+
* Used in extension pack manifests to declare codec and operation type imports.
|
|
8
|
+
*/
|
|
9
|
+
interface TypesImportSpec {
|
|
10
|
+
readonly package: string;
|
|
11
|
+
readonly named: string;
|
|
12
|
+
readonly alias: string;
|
|
13
|
+
} //#endregion
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region ../../../1-framework/1-core/framework-components/dist/emission-types-BKa4bR9m.d.mts
|
|
16
|
+
//#region src/control/emission-types.d.ts
|
|
17
|
+
interface GenerateContractTypesOptions {
|
|
18
|
+
readonly queryOperationTypeImports?: ReadonlyArray<TypesImportSpec>;
|
|
19
|
+
}
|
|
20
|
+
interface ValidationContext {
|
|
21
|
+
readonly codecTypeImports?: ReadonlyArray<TypesImportSpec>;
|
|
22
|
+
readonly operationTypeImports?: ReadonlyArray<TypesImportSpec>;
|
|
23
|
+
readonly extensionIds?: ReadonlyArray<string>;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
4
26
|
//#region src/index.d.ts
|
|
5
27
|
declare const sqlEmission: {
|
|
6
28
|
readonly id: "sql";
|
|
@@ -8,6 +30,7 @@ declare const sqlEmission: {
|
|
|
8
30
|
readonly validateStructure: (contract: Contract) => void;
|
|
9
31
|
readonly generateStorageType: (contract: Contract, storageHashTypeName: string) => string;
|
|
10
32
|
readonly generateModelStorageType: (_modelName: string, model: ContractModel) => string;
|
|
33
|
+
readonly resolveFieldTypeParams: (_modelName: string, fieldName: string, model: ContractModel, contract: Contract) => Record<string, unknown> | undefined;
|
|
11
34
|
readonly getFamilyImports: () => string[];
|
|
12
35
|
readonly getFamilyTypeAliases: (options?: GenerateContractTypesOptions) => string;
|
|
13
36
|
readonly getTypeMapsExpression: () => string;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["TypesImportSpec","package","named","alias","t","t","TypesImportSpec","Contract","ContractModel","GenerateContractTypesOptions","ReadonlyArray","queryOperationTypeImports","ValidationContext","codecTypeImports","operationTypeImports","extensionIds","EmissionSpi","Record","id","generateStorageType","contract","storageHashTypeName","generateModelStorageType","modelName","model","getFamilyImports","getFamilyTypeAliases","options","getTypeMapsExpression","getContractWrapper","contractBaseName","typeMapsName","resolveFieldTypeParams","fieldName","n","r"],"sources":["../../../../1-framework/1-core/framework-components/dist/types-import-spec-BxI5cSQy.d.mts","../../../../1-framework/1-core/framework-components/dist/emission-types-BKa4bR9m.d.mts","../src/index.ts"],"mappings":";;;;;;;;UAKUA,eAAAA;EAAAA,SACCC,OAAAA;EAAAA,SACAC,KAAAA;EAAAA,SACAC,KAAAA;AAAAA;;;;UCJDM,4BAAAA;EAAAA,SACCE,yBAAAA,GAA4BD,aAAAA,CAAcJ,eAAAA;AAAAA;AAAAA,UAE3CM,iBAAAA;EAAAA,SACCC,gBAAAA,GAAmBH,aAAAA,CAAcJ,eAAAA;EAAAA,SACjCQ,oBAAAA,GAAuBJ,aAAAA,CAAcJ,eAAAA;EAAAA,SACrCS,YAAAA,GAAeL,aAAAA;AAAAA;;;cCYb,WAAA;EAAA;qCAGa,QAAA,EAAQ,IAAA,EAAQ,iBAAA;EAAA,uCA2BZ,QAAA;EAAA,yCA8IE,QAAA,EAAQ,mBAAA;EAAA,wDA+EK,KAAA,EAAS,aAAA;EAAA,sDAoBhC,SAAA,UACD,KAAA,EACV,aAAA,EAAa,QAAA,EACV,QAAA,KACT,MAAA;EAAA;4CA+B4B,4BAAA;EAAA;0DAwBY,YAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { serializeObjectKey, serializeValue } from "@prisma-next/emitter/domain-type-generation";
|
|
2
2
|
import { assertDefined } from "@prisma-next/utils/assertions";
|
|
3
|
-
|
|
4
3
|
//#region src/index.ts
|
|
5
4
|
function serializeTypeParamsLiteral(params) {
|
|
6
5
|
if (!params || Object.keys(params).length === 0) return "Record<string, never>";
|
|
@@ -36,7 +35,6 @@ const sqlEmission = {
|
|
|
36
35
|
if (!tableNames.has(tableName)) throw new Error(`Model "${modelName}" references non-existent table "${tableName}"`);
|
|
37
36
|
const table = storage.tables[tableName];
|
|
38
37
|
assertDefined(table, `Model "${modelName}" references non-existent table "${tableName}"`);
|
|
39
|
-
if (!table.primaryKey) throw new Error(`Model "${modelName}" table "${tableName}" is missing a primary key`);
|
|
40
38
|
const columnNames = new Set(Object.keys(table.columns));
|
|
41
39
|
const storageFields = model.storage.fields;
|
|
42
40
|
if (!storageFields || Object.keys(storageFields).length === 0) throw new Error(`Model "${modelName}" is missing storage.fields`);
|
|
@@ -120,6 +118,20 @@ const sqlEmission = {
|
|
|
120
118
|
}
|
|
121
119
|
return `{ ${storageParts.join("; ")} }`;
|
|
122
120
|
},
|
|
121
|
+
resolveFieldTypeParams(_modelName, fieldName, model, contract) {
|
|
122
|
+
const sqlModel = model;
|
|
123
|
+
const storageField = sqlModel.storage?.fields?.[fieldName];
|
|
124
|
+
if (!storageField) return void 0;
|
|
125
|
+
const storage = contract.storage;
|
|
126
|
+
if (!storage) return void 0;
|
|
127
|
+
const tableName = sqlModel.storage.table;
|
|
128
|
+
const table = storage.tables[tableName];
|
|
129
|
+
if (!table) return void 0;
|
|
130
|
+
const column = table.columns[storageField.column];
|
|
131
|
+
if (!column) return void 0;
|
|
132
|
+
if (column.typeRef) return (storage.types?.[column.typeRef])?.typeParams;
|
|
133
|
+
return column.typeParams;
|
|
134
|
+
},
|
|
123
135
|
getFamilyImports() {
|
|
124
136
|
return [
|
|
125
137
|
"import type {",
|
|
@@ -129,9 +141,10 @@ const sqlEmission = {
|
|
|
129
141
|
];
|
|
130
142
|
},
|
|
131
143
|
getFamilyTypeAliases(options) {
|
|
144
|
+
const queryOperationAliases = (options?.queryOperationTypeImports ?? []).filter((imp) => imp.named === "QueryOperationTypes").map((imp) => `${imp.alias}<CodecTypes>`);
|
|
132
145
|
return [
|
|
133
146
|
"export type LaneCodecTypes = CodecTypes;",
|
|
134
|
-
`export type QueryOperationTypes = ${
|
|
147
|
+
`export type QueryOperationTypes = ${queryOperationAliases.length > 0 ? queryOperationAliases.join(" & ") : "Record<string, never>"};`,
|
|
135
148
|
"type DefaultLiteralValue<CodecId extends string, _Encoded> =",
|
|
136
149
|
" CodecId extends keyof CodecTypes",
|
|
137
150
|
" ? CodecTypes[CodecId]['output']",
|
|
@@ -161,7 +174,7 @@ function generateStorageTypesType(types) {
|
|
|
161
174
|
}
|
|
162
175
|
return `{ ${typeEntries.join("; ")} }`;
|
|
163
176
|
}
|
|
164
|
-
|
|
165
177
|
//#endregion
|
|
166
178
|
export { sqlEmission };
|
|
179
|
+
|
|
167
180
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["entries: string[]","table: StorageTable | undefined","referencedTable: StorageTable | undefined","tables: string[]","columns: string[]","tableParts: string[]","fieldParts: string[]","typeEntries: string[]"],"sources":["../src/index.ts"],"sourcesContent":["import type { Contract, ContractModel } from '@prisma-next/contract/types';\nimport {\n generateCodecTypeIntersection,\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 { SqlModelStorage, SqlStorage, StorageTable } from '@prisma-next/sql-contract/types';\nimport { assertDefined } from '@prisma-next/utils/assertions';\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\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 || !storage.tables) {\n return;\n }\n\n const typeIdRegex = /^([^/]+)\\/([^@]+)@(\\d+)$/;\n\n for (const [tableName, tableUnknown] of Object.entries(storage.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 || !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 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 || !storage.tables) {\n throw new Error('SQL contract must have storage.tables');\n }\n\n const models = contract.models as Record<string, ContractModel<SqlModelStorage>>;\n const tableNames = new Set(Object.keys(storage.tables));\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 if (!tableNames.has(tableName)) {\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n const table: StorageTable | undefined = storage.tables[tableName];\n assertDefined(table, `Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n\n if (!table.primaryKey) {\n throw new Error(`Model \"${modelName}\" table \"${tableName}\" is missing a primary key`);\n }\n\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 [tableName, tableUnknown] of Object.entries(storage.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.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n if (!tableNames.has(fk.references.table)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n\n const referencedTable: StorageTable | undefined = storage.tables[fk.references.table];\n assertDefined(\n referencedTable,\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n );\n }\n }\n }\n },\n\n generateStorageType(contract: Contract, storageHashTypeName: string): string {\n const storage = contract.storage as unknown as SqlStorage;\n const tables: string[] = [];\n for (const [tableName, table] of Object.entries(storage.tables).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\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 ? `; readonly name: ${serializeValue(i.name)}` : '';\n const using = i.using !== undefined ? `; readonly using: ${serializeValue(i.using)}` : '';\n const config =\n i.config !== undefined ? `; readonly config: ${serializeValue(i.config)}` : '';\n return `{ readonly columns: readonly [${cols}]${name}${using}${config} }`;\n })\n .join(', ');\n tableParts.push(`indexes: readonly [${indexes}]`);\n\n const fks = table.foreignKeys\n .map((fk) => {\n const cols = fk.columns.map((c: string) => serializeValue(c)).join(', ');\n const refCols = fk.references.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : '';\n return `{ readonly columns: readonly [${cols}]; readonly references: { readonly table: ${serializeValue(fk.references.table)}; readonly columns: readonly [${refCols}] }${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;\n })\n .join(', ');\n tableParts.push(`foreignKeys: readonly [${fks}]`);\n\n tables.push(`readonly ${tableName}: { ${tableParts.join('; ')} }`);\n }\n\n const typesType = generateStorageTypesType(storage.types);\n\n return `{ readonly tables: { ${tables.join('; ')} }; readonly types: ${typesType}; 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 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 queryOperationTypes = generateCodecTypeIntersection(\n queryOperationTypeImports,\n 'QueryOperationTypes',\n );\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, OperationTypes, 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 Tables = Contract['storage']['tables'];\",\n \"export type Models = Contract['models'];\",\n ].join('\\n');\n },\n} as const;\n\nfunction generateStorageTypesType(types: SqlStorage['types']): string {\n if (!types || 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 const codecId = serializeValue(typeInstance.codecId);\n const nativeType = serializeValue(typeInstance.nativeType);\n const typeParamsStr = serializeTypeParamsLiteral(typeInstance.typeParams);\n typeEntries.push(\n `readonly ${typeName}: { readonly codecId: ${codecId}; readonly nativeType: ${nativeType}; readonly typeParams: ${typeParamsStr} }`,\n );\n }\n\n return `{ ${typeEntries.join('; ')} }`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["col"],"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 { SqlModelStorage, SqlStorage, StorageTable } from '@prisma-next/sql-contract/types';\nimport { assertDefined } from '@prisma-next/utils/assertions';\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\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 || !storage.tables) {\n return;\n }\n\n const typeIdRegex = /^([^/]+)\\/([^@]+)@(\\d+)$/;\n\n for (const [tableName, tableUnknown] of Object.entries(storage.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 || !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 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 || !storage.tables) {\n throw new Error('SQL contract must have storage.tables');\n }\n\n const models = contract.models as Record<string, ContractModel<SqlModelStorage>>;\n const tableNames = new Set(Object.keys(storage.tables));\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 if (!tableNames.has(tableName)) {\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n const table: StorageTable | undefined = storage.tables[tableName];\n assertDefined(table, `Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n\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 [tableName, tableUnknown] of Object.entries(storage.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.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n if (!tableNames.has(fk.references.table)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n\n const referencedTable: StorageTable | undefined = storage.tables[fk.references.table];\n assertDefined(\n referencedTable,\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n );\n }\n }\n }\n },\n\n generateStorageType(contract: Contract, storageHashTypeName: string): string {\n const storage = contract.storage as unknown as SqlStorage;\n const tables: string[] = [];\n for (const [tableName, table] of Object.entries(storage.tables).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\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 ? `; readonly name: ${serializeValue(i.name)}` : '';\n const using = i.using !== undefined ? `; readonly using: ${serializeValue(i.using)}` : '';\n const config =\n i.config !== undefined ? `; readonly config: ${serializeValue(i.config)}` : '';\n return `{ readonly columns: readonly [${cols}]${name}${using}${config} }`;\n })\n .join(', ');\n tableParts.push(`indexes: readonly [${indexes}]`);\n\n const fks = table.foreignKeys\n .map((fk) => {\n const cols = fk.columns.map((c: string) => serializeValue(c)).join(', ');\n const refCols = fk.references.columns.map((c: string) => serializeValue(c)).join(', ');\n const name = fk.name ? `; readonly name: ${serializeValue(fk.name)}` : '';\n return `{ readonly columns: readonly [${cols}]; readonly references: { readonly table: ${serializeValue(fk.references.table)}; readonly columns: readonly [${refCols}] }${name}; readonly constraint: ${fk.constraint}; readonly index: ${fk.index} }`;\n })\n .join(', ');\n tableParts.push(`foreignKeys: readonly [${fks}]`);\n\n tables.push(`readonly ${tableName}: { ${tableParts.join('; ')} }`);\n }\n\n const typesType = generateStorageTypesType(storage.types);\n\n return `{ readonly tables: { ${tables.join('; ')} }; readonly types: ${typesType}; 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 table: StorageTable | undefined = storage.tables[tableName];\n if (!table) return undefined;\n\n const column = table.columns[storageField.column];\n if (!column) return undefined;\n\n if (column.typeRef) {\n const typeInstance = storage.types?.[column.typeRef];\n return typeInstance?.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, OperationTypes, 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 Tables = Contract['storage']['tables'];\",\n \"export type Models = Contract['models'];\",\n ].join('\\n');\n },\n} as const;\n\nfunction generateStorageTypesType(types: SqlStorage['types']): string {\n if (!types || 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 const codecId = serializeValue(typeInstance.codecId);\n const nativeType = serializeValue(typeInstance.nativeType);\n const typeParamsStr = serializeTypeParamsLiteral(typeInstance.typeParams);\n typeEntries.push(\n `readonly ${typeName}: { readonly codecId: ${codecId}; readonly nativeType: ${nativeType}; readonly typeParams: ${typeParamsStr} }`,\n );\n }\n\n return `{ ${typeEntries.join('; ')} }`;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-emitter",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.80",
|
|
4
|
+
"license": "Apache-2.0",
|
|
4
5
|
"type": "module",
|
|
5
6
|
"sideEffects": false,
|
|
6
7
|
"description": "SQL emitter hook for Prisma Next",
|
|
7
8
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.5.0-dev.
|
|
9
|
-
"@prisma-next/
|
|
10
|
-
"@prisma-next/sql-contract": "0.5.0-dev.
|
|
11
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/contract": "0.5.0-dev.80",
|
|
10
|
+
"@prisma-next/utils": "0.5.0-dev.80",
|
|
11
|
+
"@prisma-next/sql-contract": "0.5.0-dev.80",
|
|
12
|
+
"@prisma-next/emitter": "0.5.0-dev.80"
|
|
12
13
|
},
|
|
13
14
|
"devDependencies": {
|
|
14
|
-
"tsdown": "0.
|
|
15
|
+
"tsdown": "0.22.0",
|
|
15
16
|
"typescript": "5.9.3",
|
|
16
|
-
"vitest": "4.
|
|
17
|
-
"@prisma-next/framework-components": "0.5.0-dev.
|
|
17
|
+
"vitest": "4.1.5",
|
|
18
|
+
"@prisma-next/framework-components": "0.5.0-dev.80",
|
|
18
19
|
"@prisma-next/test-utils": "0.0.1",
|
|
19
20
|
"@prisma-next/tsconfig": "0.0.0",
|
|
20
21
|
"@prisma-next/tsdown": "0.0.0"
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { Contract, ContractModel } from '@prisma-next/contract/types';
|
|
2
|
-
import {
|
|
3
|
-
generateCodecTypeIntersection,
|
|
4
|
-
serializeObjectKey,
|
|
5
|
-
serializeValue,
|
|
6
|
-
} from '@prisma-next/emitter/domain-type-generation';
|
|
2
|
+
import { serializeObjectKey, serializeValue } from '@prisma-next/emitter/domain-type-generation';
|
|
7
3
|
import type {
|
|
8
4
|
GenerateContractTypesOptions,
|
|
9
5
|
ValidationContext,
|
|
@@ -81,10 +77,6 @@ export const sqlEmission = {
|
|
|
81
77
|
const table: StorageTable | undefined = storage.tables[tableName];
|
|
82
78
|
assertDefined(table, `Model "${modelName}" references non-existent table "${tableName}"`);
|
|
83
79
|
|
|
84
|
-
if (!table.primaryKey) {
|
|
85
|
-
throw new Error(`Model "${modelName}" table "${tableName}" is missing a primary key`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
80
|
const columnNames = new Set(Object.keys(table.columns));
|
|
89
81
|
const storageFields = model.storage.fields;
|
|
90
82
|
if (!storageFields || Object.keys(storageFields).length === 0) {
|
|
@@ -298,6 +290,33 @@ export const sqlEmission = {
|
|
|
298
290
|
return `{ ${storageParts.join('; ')} }`;
|
|
299
291
|
},
|
|
300
292
|
|
|
293
|
+
resolveFieldTypeParams(
|
|
294
|
+
_modelName: string,
|
|
295
|
+
fieldName: string,
|
|
296
|
+
model: ContractModel,
|
|
297
|
+
contract: Contract,
|
|
298
|
+
): Record<string, unknown> | undefined {
|
|
299
|
+
const sqlModel = model as ContractModel<SqlModelStorage>;
|
|
300
|
+
const storageField = sqlModel.storage?.fields?.[fieldName];
|
|
301
|
+
if (!storageField) return undefined;
|
|
302
|
+
|
|
303
|
+
const storage = contract.storage as unknown as SqlStorage | undefined;
|
|
304
|
+
if (!storage) return undefined;
|
|
305
|
+
|
|
306
|
+
const tableName = sqlModel.storage.table;
|
|
307
|
+
const table: StorageTable | undefined = storage.tables[tableName];
|
|
308
|
+
if (!table) return undefined;
|
|
309
|
+
|
|
310
|
+
const column = table.columns[storageField.column];
|
|
311
|
+
if (!column) return undefined;
|
|
312
|
+
|
|
313
|
+
if (column.typeRef) {
|
|
314
|
+
const typeInstance = storage.types?.[column.typeRef];
|
|
315
|
+
return typeInstance?.typeParams;
|
|
316
|
+
}
|
|
317
|
+
return column.typeParams;
|
|
318
|
+
},
|
|
319
|
+
|
|
301
320
|
getFamilyImports(): string[] {
|
|
302
321
|
return [
|
|
303
322
|
'import type {',
|
|
@@ -309,10 +328,13 @@ export const sqlEmission = {
|
|
|
309
328
|
|
|
310
329
|
getFamilyTypeAliases(options?: GenerateContractTypesOptions): string {
|
|
311
330
|
const queryOperationTypeImports = options?.queryOperationTypeImports ?? [];
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
331
|
+
const queryOperationAliases = queryOperationTypeImports
|
|
332
|
+
.filter((imp) => imp.named === 'QueryOperationTypes')
|
|
333
|
+
.map((imp) => `${imp.alias}<CodecTypes>`);
|
|
334
|
+
const queryOperationTypes =
|
|
335
|
+
queryOperationAliases.length > 0
|
|
336
|
+
? queryOperationAliases.join(' & ')
|
|
337
|
+
: 'Record<string, never>';
|
|
316
338
|
|
|
317
339
|
return [
|
|
318
340
|
'export type LaneCodecTypes = CodecTypes;',
|