@prisma-next/sql-relational-core 0.3.0-pr.98.1 → 0.3.0-pr.99.1

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.
@@ -141,7 +141,8 @@ function schema(context) {
141
141
  proxiedTable
142
142
  );
143
143
  }
144
- return Object.freeze({ tables });
144
+ const types = context.types ?? {};
145
+ return Object.freeze({ tables, types });
145
146
  }
146
147
 
147
148
  export {
@@ -149,4 +150,4 @@ export {
149
150
  TableBuilderImpl,
150
151
  schema
151
152
  };
152
- //# sourceMappingURL=chunk-U7IAFPVU.js.map
153
+ //# sourceMappingURL=chunk-ILJ6T6YP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import type { OperationRegistry } from '@prisma-next/operations';\nimport { planInvalid } from '@prisma-next/plan';\nimport type {\n ExtractCodecTypes,\n ExtractOperationTypes,\n SqlContract,\n SqlStorage,\n StorageColumn,\n} from '@prisma-next/sql-contract/types';\nimport type { BinaryOp, TableRef } from './ast/types';\nimport { attachOperationsToColumnBuilder } from './operations-registry';\nimport type { QueryLaneContext } from './query-lane-context';\nimport type {\n AnyColumnBuilderBase,\n BinaryBuilder,\n CodecTypes as CodecTypesType,\n ColumnBuilder,\n ComputeColumnJsType,\n OperationTypeSignature,\n OperationTypes,\n OrderBuilder,\n ParamPlaceholder,\n} from './types';\nimport { isColumnBuilder } from './types';\n\ntype TableColumns<Table extends { columns: Record<string, StorageColumn> }> = Table['columns'];\n\ntype ColumnBuilders<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n};\n\nexport class ColumnBuilderImpl<\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n JsType = unknown,\n> {\n readonly kind = 'column' as const;\n\n constructor(\n readonly table: string,\n readonly column: ColumnName,\n private readonly storageColumn: ColumnMeta,\n ) {}\n\n get columnMeta(): ColumnMeta {\n return this.storageColumn;\n }\n\n // Type-level helper property (not used at runtime)\n get __jsType(): JsType {\n return undefined as unknown as JsType;\n }\n\n private createBinaryBuilder(\n op: BinaryOp,\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n if (value == null) {\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n if (value.kind === 'param-placeholder' || isColumnBuilder(value)) {\n return Object.freeze({\n kind: 'binary' as const,\n op,\n left: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n right: value,\n }) as BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n }\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n\n eq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('eq', value);\n }\n\n neq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('neq', value);\n }\n\n gt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gt', value);\n }\n\n lt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lt', value);\n }\n\n gte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gte', value);\n }\n\n lte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lte', value);\n }\n\n asc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'asc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n\n desc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'desc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n}\n\nexport class TableBuilderImpl<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> implements TableRef\n{\n readonly kind = 'table' as const;\n readonly columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n private readonly _name: TableName;\n\n constructor(\n name: TableName,\n columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>,\n ) {\n this._name = name;\n this.columns = columns;\n }\n\n get name(): string {\n return this._name;\n }\n}\n\nfunction buildColumns<\n Contract extends SqlContract<SqlStorage>,\n TableName extends keyof Contract['storage']['tables'] & string,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n tableName: TableName,\n storage: SqlStorage,\n _contract: Contract,\n operationRegistry?: OperationRegistry,\n contractCapabilities?: Record<string, Record<string, boolean>>,\n): ColumnBuilders<\n Contract,\n TableName,\n Contract['storage']['tables'][TableName]['columns'],\n CodecTypes,\n Operations\n> {\n const table = storage.tables[tableName];\n\n if (!table) {\n throw planInvalid(`Unknown table ${tableName}`);\n }\n\n type Columns = Contract['storage']['tables'][TableName]['columns'];\n const tableColumns = table.columns as Columns;\n\n const result = {} as {\n [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n };\n\n const assignColumn = <ColumnKey extends keyof Columns & string>(\n columnName: ColumnKey,\n columnDef: Columns[ColumnKey],\n ) => {\n type JsType = ComputeColumnJsType<\n Contract,\n TableName,\n ColumnKey,\n Columns[ColumnKey],\n CodecTypes\n >;\n\n const columnBuilder = new ColumnBuilderImpl<ColumnKey, Columns[ColumnKey], JsType>(\n tableName,\n columnName,\n columnDef,\n );\n\n const builderWithOps = attachOperationsToColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Operations\n >(\n columnBuilder as unknown as ColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Record<string, never>\n >,\n columnDef,\n operationRegistry,\n contractCapabilities,\n );\n\n (result as Record<string, unknown>)[columnName] = builderWithOps;\n };\n\n for (const columnName of Object.keys(tableColumns) as Array<keyof Columns & string>) {\n const columnDef = tableColumns[columnName];\n if (!columnDef) continue;\n assignColumn(columnName, columnDef);\n }\n\n return result as ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n}\n\n/**\n * Creates a Proxy that enables accessing table columns directly on the table object,\n * in addition to the standard `table.columns.columnName` syntax.\n *\n * This allows both access patterns:\n * - `tables.user.columns.id` (standard access)\n * - `tables.user.id` (convenience access via proxy)\n *\n * The proxy intercepts property access and routes column name lookups to\n * `table.columns[prop]`, while preserving direct access to table properties\n * like `name`, `kind`, and `columns`.\n */\nfunction createTableProxy<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n table: TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations>,\n): TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations> {\n return new Proxy(table, {\n get(target, prop) {\n if (prop === 'name' || prop === 'kind' || prop === 'columns') {\n return Reflect.get(target, prop);\n }\n if (typeof prop === 'string' && prop in target.columns) {\n return target.columns[prop as keyof typeof target.columns];\n }\n return undefined;\n },\n });\n}\n\ntype ExtractSchemaTables<\n Contract extends SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [TableName in keyof Contract['storage']['tables']]: TableBuilderImpl<\n Contract,\n TableName & string,\n TableColumns<Contract['storage']['tables'][TableName]>,\n CodecTypes,\n Operations\n > &\n TableRef;\n};\n\nexport type SchemaHandle<\n Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType = CodecTypesType,\n Operations extends OperationTypes = Record<string, never>,\n> = {\n readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;\n};\n\ntype SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<\n Contract,\n ExtractCodecTypes<Contract>,\n ToOperationTypes<ExtractOperationTypes<Contract>>\n>;\n\ntype NormalizeOperationTypes<T> = {\n [TypeId in keyof T]: {\n [Method in keyof T[TypeId]]: T[TypeId][Method] extends OperationTypeSignature\n ? T[TypeId][Method]\n : OperationTypeSignature;\n };\n};\n\ntype ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationTypes<T>;\n\n/**\n * Creates a schema handle for building SQL queries.\n *\n * @param context - Query lane context containing contract, codec and operation registries\n * @returns A schema handle with typed table builders\n *\n * @example\n * ```typescript\n * const schemaHandle = schema<Contract>(context);\n * const userTable = schemaHandle.tables.user;\n * ```\n */\nexport function schema<Contract extends SqlContract<SqlStorage>>(\n context: QueryLaneContext<Contract>,\n): SchemaReturnType<Contract> {\n const contract = context.contract;\n const storage = contract.storage;\n type CodecTypes = ExtractCodecTypes<Contract>;\n type Operations = ToOperationTypes<ExtractOperationTypes<Contract>>;\n const tables = {} as ExtractSchemaTables<Contract, CodecTypes, Operations>;\n const contractCapabilities = contract.capabilities;\n\n const operationRegistry = context.operations;\n\n for (const tableName of Object.keys(storage.tables) as Array<\n keyof Contract['storage']['tables'] & string\n >) {\n const columns = buildColumns<Contract, typeof tableName, CodecTypes, Operations>(\n tableName,\n storage,\n contract,\n operationRegistry,\n contractCapabilities,\n );\n const table = new TableBuilderImpl<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(tableName, columns);\n const proxiedTable = createTableProxy<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(table);\n (tables as Record<string, unknown>)[tableName] = Object.freeze(\n proxiedTable,\n ) as ExtractSchemaTables<Contract, CodecTypes, Operations>[typeof tableName];\n }\n\n return Object.freeze({ tables }) as SchemaReturnType<Contract>;\n}\n\nexport type { ColumnBuilderImpl as Column, TableBuilderImpl as Table };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import type { OperationRegistry } from '@prisma-next/operations';\nimport { planInvalid } from '@prisma-next/plan';\nimport type {\n ExtractCodecTypes,\n ExtractOperationTypes,\n SqlContract,\n SqlStorage,\n StorageColumn,\n} from '@prisma-next/sql-contract/types';\nimport type { BinaryOp, TableRef } from './ast/types';\nimport { attachOperationsToColumnBuilder } from './operations-registry';\nimport type { QueryLaneContext } from './query-lane-context';\nimport type {\n AnyColumnBuilderBase,\n BinaryBuilder,\n CodecTypes as CodecTypesType,\n ColumnBuilder,\n ComputeColumnJsType,\n OperationTypeSignature,\n OperationTypes,\n OrderBuilder,\n ParamPlaceholder,\n} from './types';\nimport { isColumnBuilder } from './types';\n\ntype TableColumns<Table extends { columns: Record<string, StorageColumn> }> = Table['columns'];\n\ntype ColumnBuilders<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n};\n\nexport class ColumnBuilderImpl<\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n JsType = unknown,\n> {\n readonly kind = 'column' as const;\n\n constructor(\n readonly table: string,\n readonly column: ColumnName,\n private readonly storageColumn: ColumnMeta,\n ) {}\n\n get columnMeta(): ColumnMeta {\n return this.storageColumn;\n }\n\n // Type-level helper property (not used at runtime)\n get __jsType(): JsType {\n return undefined as unknown as JsType;\n }\n\n private createBinaryBuilder(\n op: BinaryOp,\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n if (value == null) {\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n if (value.kind === 'param-placeholder' || isColumnBuilder(value)) {\n return Object.freeze({\n kind: 'binary' as const,\n op,\n left: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n right: value,\n }) as BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n }\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n\n eq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('eq', value);\n }\n\n neq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('neq', value);\n }\n\n gt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gt', value);\n }\n\n lt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lt', value);\n }\n\n gte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gte', value);\n }\n\n lte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lte', value);\n }\n\n asc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'asc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n\n desc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'desc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n}\n\nexport class TableBuilderImpl<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> implements TableRef\n{\n readonly kind = 'table' as const;\n readonly columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n private readonly _name: TableName;\n\n constructor(\n name: TableName,\n columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>,\n ) {\n this._name = name;\n this.columns = columns;\n }\n\n get name(): string {\n return this._name;\n }\n}\n\nfunction buildColumns<\n Contract extends SqlContract<SqlStorage>,\n TableName extends keyof Contract['storage']['tables'] & string,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n tableName: TableName,\n storage: SqlStorage,\n _contract: Contract,\n operationRegistry?: OperationRegistry,\n contractCapabilities?: Record<string, Record<string, boolean>>,\n): ColumnBuilders<\n Contract,\n TableName,\n Contract['storage']['tables'][TableName]['columns'],\n CodecTypes,\n Operations\n> {\n const table = storage.tables[tableName];\n\n if (!table) {\n throw planInvalid(`Unknown table ${tableName}`);\n }\n\n type Columns = Contract['storage']['tables'][TableName]['columns'];\n const tableColumns = table.columns as Columns;\n\n const result = {} as {\n [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n };\n\n const assignColumn = <ColumnKey extends keyof Columns & string>(\n columnName: ColumnKey,\n columnDef: Columns[ColumnKey],\n ) => {\n type JsType = ComputeColumnJsType<\n Contract,\n TableName,\n ColumnKey,\n Columns[ColumnKey],\n CodecTypes\n >;\n\n const columnBuilder = new ColumnBuilderImpl<ColumnKey, Columns[ColumnKey], JsType>(\n tableName,\n columnName,\n columnDef,\n );\n\n const builderWithOps = attachOperationsToColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Operations\n >(\n columnBuilder as unknown as ColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Record<string, never>\n >,\n columnDef,\n operationRegistry,\n contractCapabilities,\n );\n\n (result as Record<string, unknown>)[columnName] = builderWithOps;\n };\n\n for (const columnName of Object.keys(tableColumns) as Array<keyof Columns & string>) {\n const columnDef = tableColumns[columnName];\n if (!columnDef) continue;\n assignColumn(columnName, columnDef);\n }\n\n return result as ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n}\n\n/**\n * Creates a Proxy that enables accessing table columns directly on the table object,\n * in addition to the standard `table.columns.columnName` syntax.\n *\n * This allows both access patterns:\n * - `tables.user.columns.id` (standard access)\n * - `tables.user.id` (convenience access via proxy)\n *\n * The proxy intercepts property access and routes column name lookups to\n * `table.columns[prop]`, while preserving direct access to table properties\n * like `name`, `kind`, and `columns`.\n */\nfunction createTableProxy<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n table: TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations>,\n): TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations> {\n return new Proxy(table, {\n get(target, prop) {\n if (prop === 'name' || prop === 'kind' || prop === 'columns') {\n return Reflect.get(target, prop);\n }\n if (typeof prop === 'string' && prop in target.columns) {\n return target.columns[prop as keyof typeof target.columns];\n }\n return undefined;\n },\n });\n}\n\ntype ExtractSchemaTables<\n Contract extends SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [TableName in keyof Contract['storage']['tables']]: TableBuilderImpl<\n Contract,\n TableName & string,\n TableColumns<Contract['storage']['tables'][TableName]>,\n CodecTypes,\n Operations\n > &\n TableRef;\n};\n\n/**\n * Extracts the types registry shape from a contract.\n * Each key is a type name from storage.types, and the value preserves the\n * literal type from the contract (including codecId, nativeType, and typeParams).\n * Returns an empty object type {} when storage.types is undefined.\n */\ntype ExtractSchemaTypes<Contract extends SqlContract<SqlStorage>> =\n Contract['storage']['types'] extends infer Types\n ? Types extends Record<string, unknown>\n ? { readonly [TypeName in keyof Types]: Types[TypeName] }\n : Record<string, never>\n : Record<string, never>;\n\nexport type SchemaHandle<\n Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType = CodecTypesType,\n Operations extends OperationTypes = Record<string, never>,\n> = {\n readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;\n /**\n * Initialized type helpers from storage.types.\n * Each entry corresponds to a named type instance in the contract's storage.types.\n */\n readonly types: ExtractSchemaTypes<Contract>;\n};\n\ntype SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<\n Contract,\n ExtractCodecTypes<Contract>,\n ToOperationTypes<ExtractOperationTypes<Contract>>\n>;\n\ntype NormalizeOperationTypes<T> = {\n [TypeId in keyof T]: {\n [Method in keyof T[TypeId]]: T[TypeId][Method] extends OperationTypeSignature\n ? T[TypeId][Method]\n : OperationTypeSignature;\n };\n};\n\ntype ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationTypes<T>;\n\n/**\n * Creates a schema handle for building SQL queries.\n *\n * @param context - Query lane context containing contract, codec and operation registries\n * @returns A schema handle with typed table builders and type helpers\n *\n * @example\n * ```typescript\n * const schemaHandle = schema<Contract>(context);\n * const userTable = schemaHandle.tables.user;\n * const vectorType = schemaHandle.types.Vector1536;\n * ```\n */\nexport function schema<Contract extends SqlContract<SqlStorage>>(\n context: QueryLaneContext<Contract>,\n): SchemaReturnType<Contract> {\n const contract = context.contract;\n const storage = contract.storage;\n type CodecTypes = ExtractCodecTypes<Contract>;\n type Operations = ToOperationTypes<ExtractOperationTypes<Contract>>;\n const tables = {} as ExtractSchemaTables<Contract, CodecTypes, Operations>;\n const contractCapabilities = contract.capabilities;\n\n const operationRegistry = context.operations;\n\n for (const tableName of Object.keys(storage.tables) as Array<\n keyof Contract['storage']['tables'] & string\n >) {\n const columns = buildColumns<Contract, typeof tableName, CodecTypes, Operations>(\n tableName,\n storage,\n contract,\n operationRegistry,\n contractCapabilities,\n );\n const table = new TableBuilderImpl<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(tableName, columns);\n const proxiedTable = createTableProxy<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(table);\n (tables as Record<string, unknown>)[tableName] = Object.freeze(\n proxiedTable,\n ) as ExtractSchemaTables<Contract, CodecTypes, Operations>[typeof tableName];\n }\n\n // Get type helpers from context (populated by createRuntimeContext)\n const types = (context.types ?? {}) as ExtractSchemaTypes<Contract>;\n\n return Object.freeze({ tables, types }) as SchemaReturnType<Contract>;\n}\n\nexport type { ColumnBuilderImpl as Column, TableBuilderImpl as Table };\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  ColumnBuilderImpl,
3
3
  TableBuilderImpl,
4
4
  schema
5
- } from "../chunk-U7IAFPVU.js";
5
+ } from "../chunk-ILJ6T6YP.js";
6
6
  import "../chunk-M23L3JHG.js";
7
7
  import "../chunk-5N34PNVZ.js";
8
8
  import "../chunk-D4JLPIWO.js";
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  ColumnBuilderImpl,
4
4
  TableBuilderImpl,
5
5
  schema
6
- } from "./chunk-U7IAFPVU.js";
6
+ } from "./chunk-ILJ6T6YP.js";
7
7
  import {
8
8
  param
9
9
  } from "./chunk-7I3EMQID.js";
@@ -1,6 +1,12 @@
1
1
  import type { OperationRegistry } from '@prisma-next/operations';
2
2
  import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
3
3
  import type { CodecRegistry } from './ast/codec-types';
4
+ /**
5
+ * Registry of initialized type helpers from storage.types.
6
+ * Each key is a type name from storage.types, and the value is the initialized helper
7
+ * (or validated typeParams if no init hook was provided).
8
+ */
9
+ export type TypeHelperRegistry = Record<string, unknown>;
4
10
  /**
5
11
  * Minimal context interface for SQL query lanes.
6
12
  *
@@ -12,5 +18,10 @@ export interface QueryLaneContext<TContract extends SqlContract<SqlStorage> = Sq
12
18
  readonly contract: TContract;
13
19
  readonly operations: OperationRegistry;
14
20
  readonly codecs: CodecRegistry;
21
+ /**
22
+ * Optional type helper registry for parameterized types.
23
+ * When present, schema() will expose these helpers via schema.types.
24
+ */
25
+ readonly types?: TypeHelperRegistry;
15
26
  }
16
27
  //# sourceMappingURL=query-lane-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-lane-context.d.ts","sourceRoot":"","sources":["../src/query-lane-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAC/B,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC;IAEnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC"}
1
+ {"version":3,"file":"query-lane-context.d.ts","sourceRoot":"","sources":["../src/query-lane-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAC/B,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC;IAEnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CACrC"}
package/dist/schema.d.ts CHANGED
@@ -36,8 +36,22 @@ export declare class TableBuilderImpl<Contract extends SqlContract<SqlStorage>,
36
36
  type ExtractSchemaTables<Contract extends SqlContract<SqlStorage>, CodecTypes extends CodecTypesType, Operations extends OperationTypes> = {
37
37
  readonly [TableName in keyof Contract['storage']['tables']]: TableBuilderImpl<Contract, TableName & string, TableColumns<Contract['storage']['tables'][TableName]>, CodecTypes, Operations> & TableRef;
38
38
  };
39
+ /**
40
+ * Extracts the types registry shape from a contract.
41
+ * Each key is a type name from storage.types, and the value preserves the
42
+ * literal type from the contract (including codecId, nativeType, and typeParams).
43
+ * Returns an empty object type {} when storage.types is undefined.
44
+ */
45
+ type ExtractSchemaTypes<Contract extends SqlContract<SqlStorage>> = Contract['storage']['types'] extends infer Types ? Types extends Record<string, unknown> ? {
46
+ readonly [TypeName in keyof Types]: Types[TypeName];
47
+ } : Record<string, never> : Record<string, never>;
39
48
  export type SchemaHandle<Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>, CodecTypes extends CodecTypesType = CodecTypesType, Operations extends OperationTypes = Record<string, never>> = {
40
49
  readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;
50
+ /**
51
+ * Initialized type helpers from storage.types.
52
+ * Each entry corresponds to a named type instance in the contract's storage.types.
53
+ */
54
+ readonly types: ExtractSchemaTypes<Contract>;
41
55
  };
42
56
  type SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<Contract, ExtractCodecTypes<Contract>, ToOperationTypes<ExtractOperationTypes<Contract>>>;
43
57
  type NormalizeOperationTypes<T> = {
@@ -50,12 +64,13 @@ type ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationType
50
64
  * Creates a schema handle for building SQL queries.
51
65
  *
52
66
  * @param context - Query lane context containing contract, codec and operation registries
53
- * @returns A schema handle with typed table builders
67
+ * @returns A schema handle with typed table builders and type helpers
54
68
  *
55
69
  * @example
56
70
  * ```typescript
57
71
  * const schemaHandle = schema<Contract>(context);
58
72
  * const userTable = schemaHandle.tables.user;
73
+ * const vectorType = schemaHandle.types.Vector1536;
59
74
  * ```
60
75
  */
61
76
  export declare function schema<Contract extends SqlContract<SqlStorage>>(context: QueryLaneContext<Contract>): SchemaReturnType<Contract>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-relational-core",
3
- "version": "0.3.0-pr.98.1",
3
+ "version": "0.3.0-pr.99.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Schema and column builders, operation attachment, and AST types for Prisma Next",
7
7
  "dependencies": {
8
8
  "ts-toolbelt": "^9.6.0",
9
- "@prisma-next/contract": "0.3.0-pr.98.1",
10
- "@prisma-next/operations": "0.3.0-pr.98.1",
11
- "@prisma-next/plan": "0.3.0-pr.98.1",
12
- "@prisma-next/sql-contract": "0.3.0-pr.98.1",
13
- "@prisma-next/sql-operations": "0.3.0-pr.98.1"
9
+ "@prisma-next/contract": "0.3.0-pr.99.1",
10
+ "@prisma-next/operations": "0.3.0-pr.99.1",
11
+ "@prisma-next/plan": "0.3.0-pr.99.1",
12
+ "@prisma-next/sql-contract": "0.3.0-pr.99.1",
13
+ "@prisma-next/sql-operations": "0.3.0-pr.99.1"
14
14
  },
15
15
  "devDependencies": {
16
16
  "tsup": "8.5.1",
17
17
  "typescript": "5.9.3",
18
18
  "vitest": "4.0.16",
19
- "@prisma-next/sql-contract-ts": "0.3.0-pr.98.1",
19
+ "@prisma-next/sql-contract-ts": "0.3.0-pr.99.1",
20
20
  "@prisma-next/test-utils": "0.0.1",
21
21
  "@prisma-next/tsconfig": "0.0.0"
22
22
  },
@@ -2,6 +2,13 @@ import type { OperationRegistry } from '@prisma-next/operations';
2
2
  import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
3
3
  import type { CodecRegistry } from './ast/codec-types';
4
4
 
5
+ /**
6
+ * Registry of initialized type helpers from storage.types.
7
+ * Each key is a type name from storage.types, and the value is the initialized helper
8
+ * (or validated typeParams if no init hook was provided).
9
+ */
10
+ export type TypeHelperRegistry = Record<string, unknown>;
11
+
5
12
  /**
6
13
  * Minimal context interface for SQL query lanes.
7
14
  *
@@ -15,4 +22,9 @@ export interface QueryLaneContext<
15
22
  readonly contract: TContract;
16
23
  readonly operations: OperationRegistry;
17
24
  readonly codecs: CodecRegistry;
25
+ /**
26
+ * Optional type helper registry for parameterized types.
27
+ * When present, schema() will expose these helpers via schema.types.
28
+ */
29
+ readonly types?: TypeHelperRegistry;
18
30
  }
package/src/schema.ts CHANGED
@@ -290,12 +290,30 @@ type ExtractSchemaTables<
290
290
  TableRef;
291
291
  };
292
292
 
293
+ /**
294
+ * Extracts the types registry shape from a contract.
295
+ * Each key is a type name from storage.types, and the value preserves the
296
+ * literal type from the contract (including codecId, nativeType, and typeParams).
297
+ * Returns an empty object type {} when storage.types is undefined.
298
+ */
299
+ type ExtractSchemaTypes<Contract extends SqlContract<SqlStorage>> =
300
+ Contract['storage']['types'] extends infer Types
301
+ ? Types extends Record<string, unknown>
302
+ ? { readonly [TypeName in keyof Types]: Types[TypeName] }
303
+ : Record<string, never>
304
+ : Record<string, never>;
305
+
293
306
  export type SchemaHandle<
294
307
  Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,
295
308
  CodecTypes extends CodecTypesType = CodecTypesType,
296
309
  Operations extends OperationTypes = Record<string, never>,
297
310
  > = {
298
311
  readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;
312
+ /**
313
+ * Initialized type helpers from storage.types.
314
+ * Each entry corresponds to a named type instance in the contract's storage.types.
315
+ */
316
+ readonly types: ExtractSchemaTypes<Contract>;
299
317
  };
300
318
 
301
319
  type SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<
@@ -318,12 +336,13 @@ type ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationType
318
336
  * Creates a schema handle for building SQL queries.
319
337
  *
320
338
  * @param context - Query lane context containing contract, codec and operation registries
321
- * @returns A schema handle with typed table builders
339
+ * @returns A schema handle with typed table builders and type helpers
322
340
  *
323
341
  * @example
324
342
  * ```typescript
325
343
  * const schemaHandle = schema<Contract>(context);
326
344
  * const userTable = schemaHandle.tables.user;
345
+ * const vectorType = schemaHandle.types.Vector1536;
327
346
  * ```
328
347
  */
329
348
  export function schema<Contract extends SqlContract<SqlStorage>>(
@@ -367,7 +386,10 @@ export function schema<Contract extends SqlContract<SqlStorage>>(
367
386
  ) as ExtractSchemaTables<Contract, CodecTypes, Operations>[typeof tableName];
368
387
  }
369
388
 
370
- return Object.freeze({ tables }) as SchemaReturnType<Contract>;
389
+ // Get type helpers from context (populated by createRuntimeContext)
390
+ const types = (context.types ?? {}) as ExtractSchemaTypes<Contract>;
391
+
392
+ return Object.freeze({ tables, types }) as SchemaReturnType<Contract>;
371
393
  }
372
394
 
373
395
  export type { ColumnBuilderImpl as Column, TableBuilderImpl as Table };