@prisma-next/sql-lane 0.3.0-dev.3 → 0.3.0-dev.31

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.
Files changed (61) hide show
  1. package/README.md +2 -2
  2. package/dist/{chunk-WA646VY6.js → chunk-72PNERR5.js} +133 -161
  3. package/dist/chunk-72PNERR5.js.map +1 -0
  4. package/dist/exports/sql.d.ts +5 -5
  5. package/dist/exports/sql.d.ts.map +1 -0
  6. package/dist/exports/sql.js +1 -1
  7. package/dist/index.d.ts +5 -116
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +1 -1
  10. package/dist/raw.d.ts +11 -0
  11. package/dist/raw.d.ts.map +1 -0
  12. package/dist/sql/builder.d.ts +11 -0
  13. package/dist/sql/builder.d.ts.map +1 -0
  14. package/dist/sql/context.d.ts +5 -0
  15. package/dist/sql/context.d.ts.map +1 -0
  16. package/dist/sql/include-builder.d.ts +35 -0
  17. package/dist/sql/include-builder.d.ts.map +1 -0
  18. package/dist/sql/join-builder.d.ts +4 -0
  19. package/dist/sql/join-builder.d.ts.map +1 -0
  20. package/dist/sql/mutation-builder.d.ts +64 -0
  21. package/dist/sql/mutation-builder.d.ts.map +1 -0
  22. package/dist/sql/plan.d.ts +4 -0
  23. package/dist/sql/plan.d.ts.map +1 -0
  24. package/dist/sql/predicate-builder.d.ts +11 -0
  25. package/dist/sql/predicate-builder.d.ts.map +1 -0
  26. package/dist/sql/projection.d.ts +18 -0
  27. package/dist/sql/projection.d.ts.map +1 -0
  28. package/dist/sql/select-builder.d.ts +35 -0
  29. package/dist/sql/select-builder.d.ts.map +1 -0
  30. package/dist/types/internal.d.ts +35 -0
  31. package/dist/types/internal.d.ts.map +1 -0
  32. package/dist/types/public.d.ts +18 -0
  33. package/dist/types/public.d.ts.map +1 -0
  34. package/dist/utils/assertions.d.ts +28 -0
  35. package/dist/utils/assertions.d.ts.map +1 -0
  36. package/dist/utils/capabilities.d.ts +4 -0
  37. package/dist/utils/capabilities.d.ts.map +1 -0
  38. package/dist/utils/errors.d.ts +30 -0
  39. package/dist/utils/errors.d.ts.map +1 -0
  40. package/dist/utils/state.d.ts +30 -0
  41. package/dist/utils/state.d.ts.map +1 -0
  42. package/package.json +20 -20
  43. package/src/exports/sql.ts +12 -0
  44. package/src/index.ts +13 -0
  45. package/src/raw.ts +230 -0
  46. package/src/sql/builder.ts +66 -0
  47. package/src/sql/context.ts +10 -0
  48. package/src/sql/include-builder.ts +248 -0
  49. package/src/sql/join-builder.ts +18 -0
  50. package/src/sql/mutation-builder.ts +494 -0
  51. package/src/sql/plan.ts +290 -0
  52. package/src/sql/predicate-builder.ts +127 -0
  53. package/src/sql/projection.ts +117 -0
  54. package/src/sql/select-builder.ts +430 -0
  55. package/src/types/internal.ts +41 -0
  56. package/src/types/public.ts +36 -0
  57. package/src/utils/assertions.ts +34 -0
  58. package/src/utils/capabilities.ts +39 -0
  59. package/src/utils/errors.ts +168 -0
  60. package/src/utils/state.ts +38 -0
  61. package/dist/chunk-WA646VY6.js.map +0 -1
@@ -0,0 +1,4 @@
1
+ import type { PlanMeta } from '@prisma-next/contract/types';
2
+ import type { MetaBuildArgs } from '../types/internal';
3
+ export declare function buildMeta(args: MetaBuildArgs): PlanMeta;
4
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/sql/plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAU5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqDvD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAkOvD"}
@@ -0,0 +1,11 @@
1
+ import type { ParamDescriptor } from '@prisma-next/contract/types';
2
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
3
+ import type { BinaryExpr } from '@prisma-next/sql-relational-core/ast';
4
+ import type { BinaryBuilder } from '@prisma-next/sql-relational-core/types';
5
+ export interface BuildWhereExprResult {
6
+ expr: BinaryExpr;
7
+ codecId: string | undefined;
8
+ paramName: string;
9
+ }
10
+ export declare function buildWhereExpr(contract: SqlContract<SqlStorage>, where: BinaryBuilder, paramsMap: Record<string, unknown>, descriptors: ParamDescriptor[], values: unknown[]): BuildWhereExprResult;
11
+ //# sourceMappingURL=predicate-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-builder.d.ts","sourceRoot":"","sources":["../../src/sql/predicate-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAiB,MAAM,iCAAiC,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,sCAAsC,CAAC;AAE7F,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,wCAAwC,CAAC;AAa9F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,EACjC,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,WAAW,EAAE,eAAe,EAAE,EAC9B,MAAM,EAAE,OAAO,EAAE,GAChB,oBAAoB,CAiGtB"}
@@ -0,0 +1,18 @@
1
+ import type { TableRef } from '@prisma-next/sql-relational-core/ast';
2
+ import type { AnyExpressionSource, NestedProjection } from '@prisma-next/sql-relational-core/types';
3
+ import type { ProjectionInput } from '../types/internal';
4
+ import type { IncludeState, ProjectionState } from '../utils/state';
5
+ export declare function generateAlias(path: string[]): string;
6
+ export declare class AliasTracker {
7
+ private readonly aliases;
8
+ private readonly aliasToPath;
9
+ register(path: string[]): string;
10
+ getPath(alias: string): string[] | undefined;
11
+ has(alias: string): boolean;
12
+ }
13
+ export declare function flattenProjection(projection: NestedProjection, tracker: AliasTracker, currentPath?: string[]): {
14
+ aliases: string[];
15
+ columns: AnyExpressionSource[];
16
+ };
17
+ export declare function buildProjectionState(_table: TableRef, projection: ProjectionInput, includes?: ReadonlyArray<IncludeState>): ProjectionState;
18
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/sql/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAEpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASzD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAKpD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAE3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAWhC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAI5C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAG5B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,YAAY,EACrB,WAAW,GAAE,MAAM,EAAO,GACzB;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAqBvD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,eAAe,EAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,GACrC,eAAe,CAwCjB"}
@@ -0,0 +1,35 @@
1
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
2
+ import type { TableRef } from '@prisma-next/sql-relational-core/ast';
3
+ import type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';
4
+ import type { AnyBinaryBuilder, AnyOrderBuilder, BuildOptions, InferNestedProjectionRow, JoinOnBuilder, JoinOnPredicate, NestedProjection, SqlBuilderOptions } from '@prisma-next/sql-relational-core/types';
5
+ import type { ProjectionInput } from '../types/internal';
6
+ import type { BuilderState } from '../utils/state';
7
+ import { type IncludeChildBuilder } from './include-builder';
8
+ export declare class SelectBuilderImpl<TContract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>, Row = unknown, CodecTypes extends Record<string, {
9
+ readonly output: unknown;
10
+ }> = Record<string, never>, Includes extends Record<string, unknown> = Record<string, never>> {
11
+ private readonly contract;
12
+ private readonly codecTypes;
13
+ private readonly context;
14
+ private state;
15
+ constructor(options: SqlBuilderOptions<TContract>, state?: BuilderState);
16
+ from(table: TableRef): SelectBuilderImpl<TContract, unknown, CodecTypes, Record<string, never>>;
17
+ innerJoin(table: TableRef, on: (on: JoinOnBuilder) => JoinOnPredicate): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
18
+ leftJoin(table: TableRef, on: (on: JoinOnBuilder) => JoinOnPredicate): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
19
+ rightJoin(table: TableRef, on: (on: JoinOnBuilder) => JoinOnPredicate): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
20
+ fullJoin(table: TableRef, on: (on: JoinOnBuilder) => JoinOnPredicate): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
21
+ includeMany<ChildProjection extends NestedProjection, ChildRow = InferNestedProjectionRow<ChildProjection, CodecTypes>, AliasName extends string = string>(childTable: TableRef, on: (on: JoinOnBuilder) => JoinOnPredicate, childBuilder: (child: IncludeChildBuilder<TContract, CodecTypes, unknown>) => IncludeChildBuilder<TContract, CodecTypes, ChildRow>, options?: {
22
+ alias?: AliasName;
23
+ }): SelectBuilderImpl<TContract, Row, CodecTypes, Includes & {
24
+ [K in AliasName]: ChildRow;
25
+ }>;
26
+ private _addJoin;
27
+ where(expr: AnyBinaryBuilder): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
28
+ select<P extends ProjectionInput>(projection: P): SelectBuilderImpl<TContract, InferNestedProjectionRow<P, CodecTypes, Includes>, CodecTypes, Includes>;
29
+ orderBy(order: AnyOrderBuilder): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
30
+ limit(count: number): SelectBuilderImpl<TContract, Row, CodecTypes, Includes>;
31
+ build(options?: BuildOptions): SqlQueryPlan<Row>;
32
+ private ensureFrom;
33
+ private ensureProjection;
34
+ }
35
+ //# sourceMappingURL=select-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-builder.d.ts","sourceRoot":"","sources":["../../src/sql/select-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAiB,MAAM,iCAAiC,CAAC;AAC9F,OAAO,KAAK,EAQV,QAAQ,EACT,MAAM,sCAAsC,CAAC;AAO9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,gBAAgB,EAEhB,iBAAiB,EAClB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAYzD,OAAO,KAAK,EAAE,YAAY,EAA4C,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAM3B,qBAAa,iBAAiB,CAC5B,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,EACnE,GAAG,GAAG,OAAO,EACb,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACvF,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAEhE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,KAAK,CAAoB;gBAErB,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY;IASvE,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAS/F,SAAS,CACP,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,eAAe,GACzC,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAI1D,QAAQ,CACN,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,eAAe,GACzC,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAI1D,SAAS,CACP,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,eAAe,GACzC,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAI1D,QAAQ,CACN,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,eAAe,GACzC,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAI1D,WAAW,CACT,eAAe,SAAS,gBAAgB,EACxC,QAAQ,GAAG,wBAAwB,CAAC,eAAe,EAAE,UAAU,CAAC,EAChE,SAAS,SAAS,MAAM,GAAG,MAAM,EAEjC,UAAU,EAAE,QAAQ,EACpB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,eAAe,EAC1C,YAAY,EAAE,CACZ,KAAK,EAAE,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,KACvD,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,EACzD,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,GAC9B,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,GAAG;SAAG,CAAC,IAAI,SAAS,GAAG,QAAQ;KAAE,CAAC;IA8E3F,OAAO,CAAC,QAAQ;IAmChB,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAStF,MAAM,CAAC,CAAC,SAAS,eAAe,EAC9B,UAAU,EAAE,CAAC,GACZ,iBAAiB,CAClB,SAAS,EACT,wBAAwB,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EACjD,UAAU,EACV,QAAQ,CACT;IAiBD,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IASxF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;IAa7E,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC;IA0HhD,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -0,0 +1,35 @@
1
+ import type { ParamDescriptor } from '@prisma-next/contract/types';
2
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
3
+ import type { TableRef } from '@prisma-next/sql-relational-core/ast';
4
+ import type { AnyBinaryBuilder, AnyExpressionSource, AnyOrderBuilder, NestedProjection } from '@prisma-next/sql-relational-core/types';
5
+ import type { ProjectionState } from '../utils/state';
6
+ export type ProjectionInput = Record<string, AnyExpressionSource | boolean | NestedProjection>;
7
+ export interface MetaBuildArgs {
8
+ readonly contract: SqlContract<SqlStorage>;
9
+ readonly table: TableRef;
10
+ readonly projection: ProjectionState;
11
+ readonly joins?: ReadonlyArray<{
12
+ readonly joinType: 'inner' | 'left' | 'right' | 'full';
13
+ readonly table: TableRef;
14
+ readonly on: {
15
+ readonly left: unknown;
16
+ readonly right: unknown;
17
+ };
18
+ }>;
19
+ readonly includes?: ReadonlyArray<{
20
+ readonly alias: string;
21
+ readonly table: TableRef;
22
+ readonly on: {
23
+ readonly left: unknown;
24
+ readonly right: unknown;
25
+ };
26
+ readonly childProjection: ProjectionState;
27
+ readonly childWhere?: AnyBinaryBuilder;
28
+ readonly childOrderBy?: AnyOrderBuilder;
29
+ }>;
30
+ readonly where?: AnyBinaryBuilder;
31
+ readonly orderBy?: AnyOrderBuilder;
32
+ readonly paramDescriptors: ParamDescriptor[];
33
+ readonly paramCodecs?: Record<string, string>;
34
+ }
35
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,GAAG,gBAAgB,CAAC,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QACvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;QACzB,QAAQ,CAAC,EAAE,EAAE;YACX,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;SACzB,CAAC;KACH,CAAC,CAAC;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;QACzB,QAAQ,CAAC,EAAE,EAAE;YACX,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;SACzB,CAAC;QACF,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;QAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;QACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;KACzC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C"}
@@ -0,0 +1,18 @@
1
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
2
+ import type { TableRef } from '@prisma-next/sql-relational-core/ast';
3
+ import type { ParamPlaceholder, RawFactory } from '@prisma-next/sql-relational-core/types';
4
+ import type { DeleteBuilder, InsertBuilder, UpdateBuilder } from '../sql/mutation-builder';
5
+ import type { SelectBuilderImpl } from '../sql/select-builder';
6
+ export type { TableRef } from '@prisma-next/sql-relational-core/ast';
7
+ export type { AnyColumnBuilder, BuildOptions, InferReturningRow, ParamPlaceholder, RawFactory, SqlBuilderOptions, } from '@prisma-next/sql-relational-core/types';
8
+ export type SelectBuilder<TContract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>, Row = unknown, CodecTypes extends Record<string, {
9
+ readonly output: unknown;
10
+ }> = Record<string, never>, Includes extends Record<string, unknown> = Record<string, never>> = SelectBuilderImpl<TContract, Row, CodecTypes, Includes> & {
11
+ readonly raw: RawFactory;
12
+ insert(table: TableRef, values: Record<string, ParamPlaceholder>): InsertBuilder<TContract, CodecTypes>;
13
+ update(table: TableRef, set: Record<string, ParamPlaceholder>): UpdateBuilder<TContract, CodecTypes>;
14
+ delete(table: TableRef): DeleteBuilder<TContract, CodecTypes>;
15
+ };
16
+ export type { IncludeChildBuilder } from '../sql/include-builder';
17
+ export type { DeleteBuilder, InsertBuilder, UpdateBuilder } from '../sql/mutation-builder';
18
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,YAAY,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,aAAa,CACvB,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,EACnE,GAAG,GAAG,OAAO,EACb,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACvF,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAC9D,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG;IAC5D,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,MAAM,CACJ,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACvC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,CACJ,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACpC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;CAC/D,CAAC;AAEF,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AnyColumnBuilder } from '@prisma-next/sql-relational-core/types';
2
+ /**
3
+ * Asserts that a ColumnBuilder has table and column properties.
4
+ */
5
+ export declare function assertColumnBuilder(col: unknown, context: string): AnyColumnBuilder;
6
+ /**
7
+ * Asserts that a JoinOnPredicate has valid left and right columns.
8
+ */
9
+ export declare function assertJoinOnPredicate(on: {
10
+ left?: {
11
+ table?: string;
12
+ column?: string;
13
+ };
14
+ right?: {
15
+ table?: string;
16
+ column?: string;
17
+ };
18
+ }): asserts on is {
19
+ left: {
20
+ table: string;
21
+ column: string;
22
+ };
23
+ right: {
24
+ table: string;
25
+ column: string;
26
+ };
27
+ };
28
+ //# sourceMappingURL=assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/utils/assertions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE/E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAYnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE;IACxC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,GAAG,OAAO,CAAC,EAAE,IAAI;IAChB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAIA"}
@@ -0,0 +1,4 @@
1
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
2
+ export declare function checkIncludeCapabilities(contract: SqlContract<SqlStorage>): void;
3
+ export declare function checkReturningCapability(contract: SqlContract<SqlStorage>): void;
4
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/utils/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAQ/E,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAkBhF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAUhF"}
@@ -0,0 +1,30 @@
1
+ export declare function errorAliasPathEmpty(): never;
2
+ export declare function errorAliasCollision(path: string[], alias: string, existingPath?: string[]): never;
3
+ export declare function errorLimitMustBeNonNegativeInteger(): never;
4
+ export declare function errorChildProjectionMustBeSpecified(): never;
5
+ export declare function errorIncludeRequiresCapabilities(target?: string): never;
6
+ export declare function errorIncludeCapabilitiesNotTrue(target?: string, values?: {
7
+ lateral?: unknown;
8
+ jsonAgg?: unknown;
9
+ }): never;
10
+ export declare function errorUnknownTable(tableName: string): never;
11
+ export declare function errorSelfJoinNotSupported(): never;
12
+ export declare function errorChildProjectionEmpty(): never;
13
+ export declare function errorIncludeAliasCollision(alias: string, type: 'projection' | 'include'): never;
14
+ export declare function errorMissingColumnForAlias(alias: string, index: number): never;
15
+ export declare function errorMissingAlias(index: number): never;
16
+ export declare function errorInvalidColumnForAlias(alias: string, index: number): never;
17
+ export declare function errorFromMustBeCalled(): never;
18
+ export declare function errorSelectMustBeCalled(): never;
19
+ export declare function errorMissingParameter(paramName: string): never;
20
+ export declare function errorInvalidProjectionValue(path: string[]): never;
21
+ export declare function errorIncludeAliasNotFound(alias: string): never;
22
+ export declare function errorInvalidProjectionKey(key: string): never;
23
+ export declare function errorProjectionEmpty(): never;
24
+ export declare function errorReturningRequiresCapability(target?: string): never;
25
+ export declare function errorReturningCapabilityNotTrue(target?: string, value?: unknown): never;
26
+ export declare function errorUnknownColumn(columnName: string, tableName: string): never;
27
+ export declare function errorWhereMustBeCalledForUpdate(): never;
28
+ export declare function errorFailedToBuildWhereClause(): never;
29
+ export declare function errorWhereMustBeCalledForDelete(): never;
30
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,IAAI,KAAK,CAE3C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAIjG;AAED,wBAAgB,kCAAkC,IAAI,KAAK,CAE1D;AAED,wBAAgB,mCAAmC,IAAI,KAAK,CAE3D;AAED,wBAAgB,gCAAgC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAevE;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,KAAK,CAcP;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAE1D;AAED,wBAAgB,yBAAyB,IAAI,KAAK,CAEjD;AAED,wBAAgB,yBAAyB,IAAI,KAAK,CAEjD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,KAAK,CAI/F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEtD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAE9E;AAED,wBAAgB,qBAAqB,IAAI,KAAK,CAE7C;AAED,wBAAgB,uBAAuB,IAAI,KAAK,CAE/C;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAE9D;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAIjE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAI9D;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAI5D;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAED,wBAAgB,gCAAgC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAevE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAcvF;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAE/E;AAED,wBAAgB,+BAA+B,IAAI,KAAK,CAEvD;AAED,wBAAgB,6BAA6B,IAAI,KAAK,CAErD;AAED,wBAAgB,+BAA+B,IAAI,KAAK,CAEvD"}
@@ -0,0 +1,30 @@
1
+ import type { TableRef } from '@prisma-next/sql-relational-core/ast';
2
+ import type { AnyBinaryBuilder, AnyExpressionSource, AnyOrderBuilder, JoinOnPredicate } from '@prisma-next/sql-relational-core/types';
3
+ export interface ProjectionState {
4
+ readonly aliases: string[];
5
+ readonly columns: AnyExpressionSource[];
6
+ }
7
+ export interface JoinState {
8
+ readonly joinType: 'inner' | 'left' | 'right' | 'full';
9
+ readonly table: TableRef;
10
+ readonly on: JoinOnPredicate;
11
+ }
12
+ export interface IncludeState {
13
+ readonly alias: string;
14
+ readonly table: TableRef;
15
+ readonly on: JoinOnPredicate;
16
+ readonly childProjection: ProjectionState;
17
+ readonly childWhere?: AnyBinaryBuilder;
18
+ readonly childOrderBy?: AnyOrderBuilder;
19
+ readonly childLimit?: number;
20
+ }
21
+ export interface BuilderState {
22
+ from?: TableRef;
23
+ joins?: ReadonlyArray<JoinState>;
24
+ includes?: ReadonlyArray<IncludeState>;
25
+ projection?: ProjectionState;
26
+ where?: AnyBinaryBuilder;
27
+ orderBy?: AnyOrderBuilder;
28
+ limit?: number;
29
+ }
30
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,eAAe,EAChB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACvD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
package/package.json CHANGED
@@ -1,29 +1,29 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-lane",
3
- "version": "0.3.0-dev.3",
3
+ "version": "0.3.0-dev.31",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Relational DSL and raw SQL helpers for Prisma Next",
7
7
  "dependencies": {
8
- "@prisma-next/plan": "0.3.0-dev.3",
9
- "@prisma-next/contract": "0.3.0-dev.3",
10
- "@prisma-next/sql-contract": "0.3.0-dev.3",
11
- "@prisma-next/sql-relational-core": "0.3.0-dev.3"
8
+ "@prisma-next/contract": "0.3.0-dev.31",
9
+ "@prisma-next/plan": "0.3.0-dev.31",
10
+ "@prisma-next/sql-contract": "0.3.0-dev.31",
11
+ "@prisma-next/sql-relational-core": "0.3.0-dev.31"
12
12
  },
13
13
  "devDependencies": {
14
- "@types/pg": "^8.11.10",
15
- "@vitest/coverage-v8": "^4.0.0",
16
- "pg": "^8.11.5",
17
- "tsup": "^8.3.0",
18
- "typescript": "^5.9.3",
19
- "vite-tsconfig-paths": "^5.1.4",
20
- "vitest": "^4.0.16",
21
- "@prisma-next/sql-contract-ts": "0.3.0-dev.3",
22
- "@prisma-next/sql-runtime": "0.3.0-dev.3",
14
+ "@types/pg": "8.16.0",
15
+ "pg": "8.16.3",
16
+ "tsup": "8.5.1",
17
+ "typescript": "5.9.3",
18
+ "vitest": "4.0.16",
19
+ "@prisma-next/sql-contract-ts": "0.3.0-dev.31",
20
+ "@prisma-next/sql-runtime": "0.3.0-dev.31",
21
+ "@prisma-next/tsconfig": "0.0.0",
23
22
  "@prisma-next/test-utils": "0.0.1"
24
23
  },
25
24
  "files": [
26
- "dist"
25
+ "dist",
26
+ "src"
27
27
  ],
28
28
  "exports": {
29
29
  ".": {
@@ -36,13 +36,13 @@
36
36
  }
37
37
  },
38
38
  "scripts": {
39
- "build": "tsup --config tsup.config.ts",
39
+ "build": "tsup --config tsup.config.ts && tsc --project tsconfig.build.json",
40
40
  "test": "vitest run",
41
41
  "test:coverage": "vitest run --coverage",
42
42
  "typecheck": "tsc --project tsconfig.json --noEmit",
43
- "lint": "biome check . --config-path ../../../../biome.json --error-on-warnings",
44
- "lint:fix": "biome check --write . --config-path ../../../../biome.json",
45
- "lint:fix:unsafe": "biome check --write --unsafe . --config-path ../../../../biome.json",
46
- "clean": "node ../../../../scripts/clean.mjs"
43
+ "lint": "biome check . --error-on-warnings",
44
+ "lint:fix": "biome check --write .",
45
+ "lint:fix:unsafe": "biome check --write --unsafe .",
46
+ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output"
47
47
  }
48
48
  }
@@ -0,0 +1,12 @@
1
+ export type {
2
+ ColumnsOf,
3
+ RawFactory,
4
+ RawFunctionOptions,
5
+ RawTemplateOptions,
6
+ SqlBuilderOptions,
7
+ TableKey,
8
+ TablesOf,
9
+ } from '@prisma-next/sql-relational-core/types';
10
+ export { rawOptions } from '../raw';
11
+ export type { SelectBuilder } from '../sql/builder';
12
+ export { createJoinOnBuilder, sql } from '../sql/builder';
package/src/index.ts ADDED
@@ -0,0 +1,13 @@
1
+ export type {
2
+ ColumnsOf,
3
+ JoinOnBuilder,
4
+ RawFactory,
5
+ RawFunctionOptions,
6
+ RawTemplateOptions,
7
+ SqlBuilderOptions,
8
+ TableKey,
9
+ TablesOf,
10
+ } from '@prisma-next/sql-relational-core/types';
11
+ export { rawOptions } from './raw';
12
+ export type { IncludeChildBuilder, SelectBuilder } from './sql/builder';
13
+ export { createJoinOnBuilder, sql } from './sql/builder';
package/src/raw.ts ADDED
@@ -0,0 +1,230 @@
1
+ import type {
2
+ ExecutionPlan,
3
+ ParamDescriptor,
4
+ PlanMeta,
5
+ PlanRefs,
6
+ } from '@prisma-next/contract/types';
7
+ import { planInvalid } from '@prisma-next/plan';
8
+ import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
9
+ import type {
10
+ RawFactory,
11
+ RawFunctionOptions,
12
+ RawTemplateFactory,
13
+ RawTemplateOptions,
14
+ } from '@prisma-next/sql-relational-core/types';
15
+
16
+ const RAW_OPTIONS_SENTINEL = Symbol('rawOptions');
17
+
18
+ type TemplateInvocation = {
19
+ readonly sql: string;
20
+ readonly params: readonly unknown[];
21
+ readonly paramDescriptors: ReadonlyArray<ParamDescriptor>;
22
+ };
23
+
24
+ interface RawPlanBuildArgs {
25
+ readonly contract: SqlContract<SqlStorage>;
26
+ readonly sql: string;
27
+ readonly params: readonly unknown[];
28
+ readonly paramDescriptors: ReadonlyArray<ParamDescriptor>;
29
+ readonly options?: RawTemplateOptions;
30
+ }
31
+
32
+ export function createRawFactory(contract: SqlContract<SqlStorage>): RawFactory {
33
+ const factory = ((first: TemplateStringsArray | string, ...rest: unknown[]) => {
34
+ if (isTemplateInvocation(first)) {
35
+ const { values, options } = splitTemplateValues(rest);
36
+ const compiled = compileTemplateToPositional(first, values);
37
+ return buildRawPlan({
38
+ contract,
39
+ sql: compiled.sql,
40
+ params: compiled.params,
41
+ paramDescriptors: compiled.paramDescriptors,
42
+ ...(options ? { options } : {}),
43
+ });
44
+ }
45
+
46
+ const text = first;
47
+ const [options] = rest as [RawFunctionOptions | undefined];
48
+
49
+ if (!options) {
50
+ throw planInvalid('Function form requires params option');
51
+ }
52
+
53
+ if (!Array.isArray(options.params)) {
54
+ throw planInvalid('Function form params must be an array');
55
+ }
56
+
57
+ const paramDescriptors = buildSequentialDescriptors(options.params.length);
58
+
59
+ return buildRawPlan({
60
+ contract,
61
+ sql: text,
62
+ params: options.params,
63
+ paramDescriptors,
64
+ options,
65
+ });
66
+ }) as RawFactory;
67
+
68
+ factory.with = (options: RawTemplateOptions) => {
69
+ return ((strings: TemplateStringsArray, ...values: readonly unknown[]) => {
70
+ const compiled = compileTemplateToPositional(strings, values);
71
+ return buildRawPlan({
72
+ contract,
73
+ sql: compiled.sql,
74
+ params: compiled.params,
75
+ paramDescriptors: compiled.paramDescriptors,
76
+ options,
77
+ });
78
+ }) as RawTemplateFactory;
79
+ };
80
+
81
+ return factory;
82
+ }
83
+
84
+ function compileTemplateToPositional(
85
+ strings: TemplateStringsArray,
86
+ values: readonly unknown[],
87
+ ): TemplateInvocation {
88
+ let sql = '';
89
+ const params: unknown[] = [];
90
+ const paramDescriptors: ParamDescriptor[] = [];
91
+
92
+ strings.forEach((part, index) => {
93
+ sql += part;
94
+
95
+ if (index < values.length) {
96
+ const value = values[index];
97
+ const placeholderIndex = params.push(value);
98
+ sql += `$${placeholderIndex}`;
99
+ paramDescriptors.push({
100
+ index: placeholderIndex,
101
+ name: `p${placeholderIndex}`,
102
+ source: 'raw',
103
+ });
104
+ }
105
+ });
106
+
107
+ return {
108
+ sql,
109
+ params,
110
+ paramDescriptors,
111
+ };
112
+ }
113
+
114
+ function buildRawPlan(args: RawPlanBuildArgs): ExecutionPlan {
115
+ const params = Array.from(args.params);
116
+ const descriptors = args.paramDescriptors.map((descriptor) =>
117
+ Object.freeze({ ...descriptor, source: 'raw' as const }),
118
+ );
119
+
120
+ const meta = buildRawMeta({
121
+ contract: args.contract,
122
+ paramDescriptors: descriptors,
123
+ ...(args.options ? { options: args.options } : {}),
124
+ });
125
+
126
+ return Object.freeze({
127
+ sql: args.sql,
128
+ params: Object.freeze(params),
129
+ meta,
130
+ });
131
+ }
132
+
133
+ interface RawMetaBuildArgs {
134
+ readonly contract: SqlContract<SqlStorage>;
135
+ readonly paramDescriptors: ReadonlyArray<ParamDescriptor>;
136
+ readonly options?: RawTemplateOptions;
137
+ }
138
+
139
+ function buildRawMeta(args: RawMetaBuildArgs): PlanMeta {
140
+ const { contract, paramDescriptors, options } = args;
141
+
142
+ const meta: PlanMeta = {
143
+ target: contract.target,
144
+ targetFamily: contract.targetFamily,
145
+ coreHash: contract.coreHash,
146
+ ...(contract.profileHash !== undefined ? { profileHash: contract.profileHash } : {}),
147
+ lane: 'raw',
148
+ paramDescriptors: Object.freeze([...paramDescriptors]),
149
+ ...(options?.annotations ? { annotations: Object.freeze({ ...options.annotations }) } : {}),
150
+ ...(options?.refs ? { refs: freezeRefs(options.refs) } : {}),
151
+ ...(options?.projection ? { projection: Object.freeze([...options.projection]) } : {}),
152
+ };
153
+
154
+ return Object.freeze(meta);
155
+ }
156
+
157
+ function freezeRefs(refs: PlanRefs): PlanRefs {
158
+ return Object.freeze({
159
+ ...(refs.tables ? { tables: Object.freeze([...refs.tables]) } : {}),
160
+ ...(refs.columns
161
+ ? {
162
+ columns: Object.freeze(
163
+ refs.columns.map((col: { table: string; column: string }) => Object.freeze({ ...col })),
164
+ ),
165
+ }
166
+ : {}),
167
+ ...(refs.indexes
168
+ ? {
169
+ indexes: Object.freeze(
170
+ refs.indexes.map(
171
+ (index: { table: string; columns: ReadonlyArray<string>; name?: string }) =>
172
+ Object.freeze({
173
+ ...index,
174
+ columns: Object.freeze([...index.columns]),
175
+ }),
176
+ ),
177
+ ),
178
+ }
179
+ : {}),
180
+ });
181
+ }
182
+
183
+ function buildSequentialDescriptors(count: number): ReadonlyArray<ParamDescriptor> {
184
+ return Array.from({ length: count }, (_, idx) =>
185
+ Object.freeze({
186
+ index: idx + 1,
187
+ name: `p${idx + 1}`,
188
+ source: 'raw' as const,
189
+ }),
190
+ );
191
+ }
192
+
193
+ function isTemplateInvocation(value: unknown): value is TemplateStringsArray {
194
+ return Array.isArray(value) && Object.hasOwn(value, 'raw');
195
+ }
196
+
197
+ interface RawTemplateOptionsSentinel {
198
+ readonly [RAW_OPTIONS_SENTINEL]: true;
199
+ readonly value: RawTemplateOptions;
200
+ }
201
+
202
+ export function rawOptions(options: RawTemplateOptions): RawTemplateOptionsSentinel {
203
+ return Object.freeze({
204
+ [RAW_OPTIONS_SENTINEL]: true as const,
205
+ value: options,
206
+ });
207
+ }
208
+
209
+ function splitTemplateValues(values: readonly unknown[]): {
210
+ readonly values: readonly unknown[];
211
+ readonly options?: RawTemplateOptions;
212
+ } {
213
+ if (values.length === 0) {
214
+ return { values };
215
+ }
216
+
217
+ const last = values[values.length - 1];
218
+ if (!isOptionsSentinel(last)) {
219
+ return { values };
220
+ }
221
+
222
+ return {
223
+ values: values.slice(0, values.length - 1),
224
+ options: last.value,
225
+ };
226
+ }
227
+
228
+ function isOptionsSentinel(value: unknown): value is RawTemplateOptionsSentinel {
229
+ return typeof value === 'object' && value !== null && RAW_OPTIONS_SENTINEL in value;
230
+ }