@typed-sql/compiler 1.0.0-beta.1 → 1.0.0-beta.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @typed-sql/compiler
2
2
 
3
+ ## 1.0.0-beta.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 1563a7a: Declare and enforce the 1.0 package stability boundary. Core SQL, compiler, schema, config, AST,
8
+ PostgreSQL, MySQL, and CLI packages form the stable train; the TypeScript preview bridge and
9
+ language server remain explicitly experimental. Freeze public entrypoints and query type contracts,
10
+ and remove internal compiler/type helpers from stable package-root exports before 1.0.
11
+ - bd26d6e: Replace potentially expensive parser regular expressions with bounded scanners, tighten editor
12
+ completion matching, and prevent releases while high-severity CodeQL alerts remain open.
13
+ - 3e2c75c: Infer ordered query parameter tuples and let TypeScript reject interpolation values that do not
14
+ match their SQL context. Dialect contract version 2 adds explicit parameter analysis; unresolved
15
+ positions remain `unknown`. Add typed nullable predicate composition through `sql.fragment()`,
16
+ `sql.and()`, `sql.or()`, `sql.where()`, and `sql.append()` while preserving row and parameter tuples.
17
+ Direct append fragments are grammar-analyzed cumulatively against their static base, so TypeScript
18
+ rejects fragment interpolation values that disagree with the referenced database columns.
19
+ Add `sql.empty` and SQL-template-native conditional structural fragments. The compiler analyzes
20
+ complete branch variants, preserves literal boolean-dependent result rows, and type-checks nested
21
+ fragment parameters without adding a query-builder DSL. Bound independent structural expansion at
22
+ 64 variants by default, correlate repeated conditions, merge diagnostics and fragment expectations
23
+ across variants, and fail closed on incompatible contexts. Share indexed catalog and conservative
24
+ parameter-resolution primitives across grammars, harden cooked-template scanning, and add runtime,
25
+ resolver, scanner, and structural performance gates.
26
+ - Updated dependencies [1563a7a]
27
+ - Updated dependencies [9dd6bc4]
28
+ - Updated dependencies [3e2c75c]
29
+ - @typed-sql/core@1.0.0-beta.2
30
+
3
31
  ## 1.0.0-beta.1
4
32
 
5
33
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @typed-sql/compiler
2
2
 
3
3
  The dialect-neutral TypeScript source compiler behind [typed-sql](https://github.com/Lojhan/typed-sql).
4
- It finds static SQL templates, asks the configured grammar for a row shape, injects that shape into
4
+ It finds static SQL templates, asks the configured grammar for row and parameter shapes, injects them into
5
5
  an in-memory TypeScript program, and preserves source mappings for diagnostics and editor tooling.
6
6
 
7
7
  ```sh
@@ -21,7 +21,29 @@ const result = compileSource({
21
21
 
22
22
  `compileSource` does not branch on PostgreSQL, MySQL, package names, or database drivers. It only
23
23
  consumes the public `DialectPlugin` contract from `@typed-sql/core`. Unsupported, dynamic, invalid,
24
- or ambiguous SQL remains a diagnostic or `Query<unknown>`—never `any`.
24
+ or ambiguous SQL remains a diagnostic or an `unknown` position—never `any`. The resulting overlay
25
+ uses `Query<Row, readonly [Param1, Param2, ...]>`, which lets TypeScript report incorrect `${...}`
26
+ values at their original source locations.
27
+
28
+ Direct `sql.append(base, ...fragments)` expressions are analyzed cumulatively. The compiler resolves
29
+ the statically bound base query, adds each visible `sql.fragment` in source order, and injects the
30
+ grammar-derived parameter tuple into that fragment. Composed values are therefore checked against
31
+ their referenced columns even when a preceding fragment introduces structure such as
32
+ `WHERE 1 = 1`. Indirect function-returned fragments and arbitrary mutable collections remain at the
33
+ core runtime's parameter-safe boundary rather than being guessed.
34
+
35
+ Structural fragment interpolations inside a complete `sql` template are expanded as correlated,
36
+ finite branches. The compiler analyzes each resulting complete SQL statement, emits a conditional
37
+ row for generic boolean property selections, and injects expected parameter types into nested
38
+ fragments. `sql.empty` represents the absent branch without turning it into a driver parameter.
39
+ The expansion is a grammar-neutral intermediate representation: SQL parsing and resolution still
40
+ belong exclusively to `DialectPlugin.analyze()`.
41
+
42
+ `compileSource` accepts `maxStructuralVariants`, defaulting to 64. The compiler counts independent
43
+ conditions and returns `TSQ003` before invoking the grammar when the bound would be exceeded.
44
+ Repeated uses of the same condition are correlated and do not multiply the branch count. A shared
45
+ fragment that receives incompatible parameter expectations across valid branches fails closed with
46
+ `TSQ205`.
25
47
 
26
48
  Application projects normally use this through `typed-sql check` or the language server. It is
27
49
  public for grammar, editor, and build-tool integrations.
@@ -6,6 +6,8 @@ export interface CheckFileOptions<Snapshot extends SchemaSnapshot = SchemaSnapsh
6
6
  readonly typePolicy?: Policy;
7
7
  readonly project?: string;
8
8
  readonly runTypeScript?: boolean;
9
+ readonly maxStructuralVariants?: number;
10
+ readonly typeScriptTimeoutMs?: number;
9
11
  }
10
12
  export interface TypeScriptCheckResult {
11
13
  readonly exitCode: number;
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../../src/check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGpF,MAAM,WAAW,gBAAgB,CAAC,QAAQ,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,GAAG,OAAO;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAkCD,wBAAsB,SAAS,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CA8C9I"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../../src/check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGpF,MAAM,WAAW,gBAAgB,CAAC,QAAQ,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,GAAG,OAAO;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAuCD,wBAAsB,SAAS,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EACrE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC1C,OAAO,CAAC,eAAe,CAAC,CAiE1B"}
@@ -1,7 +1,8 @@
1
- import { access, readFile, unlink, writeFile } from "node:fs/promises";
2
- import { constants } from "node:fs";
3
- import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
1
  import { spawnSync } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { constants } from "node:fs";
4
+ import { access, readFile, unlink, writeFile } from "node:fs/promises";
5
+ import { dirname, join, relative, resolve, sep } from "node:path";
5
6
  import { compileSource } from "./compiler.js";
6
7
  async function exists(path) {
7
8
  try {
@@ -51,23 +52,26 @@ export async function checkFile(options) {
51
52
  source,
52
53
  dialect: options.dialect,
53
54
  schema,
55
+ ...(options.maxStructuralVariants === undefined ? {} : { maxStructuralVariants: options.maxStructuralVariants }),
54
56
  ...(options.typePolicy === undefined ? {} : { typePolicy: options.typePolicy }),
55
57
  });
56
58
  const hasSqlErrors = compilation.diagnostics.some((diagnostic) => diagnostic.severity === "error");
57
59
  if (hasSqlErrors || options.runTypeScript === false) {
58
- return { transformedSource: compilation.transformedSource, sqlDiagnostics: compilation.diagnostics, ok: !hasSqlErrors };
60
+ return {
61
+ transformedSource: compilation.transformedSource,
62
+ sqlDiagnostics: compilation.diagnostics,
63
+ ok: !hasSqlErrors,
64
+ };
59
65
  }
60
66
  const directory = dirname(file);
61
67
  const basename = file.slice(directory.length + 1);
62
68
  const extensionIndex = basename.lastIndexOf(".");
63
69
  const stem = extensionIndex === -1 ? basename : basename.slice(0, extensionIndex);
64
70
  const extension = extensionIndex === -1 ? ".ts" : basename.slice(extensionIndex);
65
- const nonce = `${process.pid}-${Date.now()}`;
71
+ const nonce = `${process.pid}-${randomUUID()}`;
66
72
  const overlay = join(directory, `.typed-sql-${stem}-${nonce}${extension}`);
67
73
  const tempConfig = join(directory, `.typed-sql-tsconfig-${nonce}.json`);
68
- const project = options.project === undefined
69
- ? await findUp("tsconfig.json", directory)
70
- : resolve(options.project);
74
+ const project = options.project === undefined ? await findUp("tsconfig.json", directory) : resolve(options.project);
71
75
  if (project === undefined)
72
76
  throw new Error(`Could not find tsconfig.json from ${directory}`);
73
77
  const config = {
@@ -80,10 +84,25 @@ export async function checkFile(options) {
80
84
  await writeFile(tempConfig, `${JSON.stringify(config, null, 2)}\n`, "utf8");
81
85
  try {
82
86
  const binary = await tscBinary(directory);
83
- const result = spawnSync(binary, ["--project", tempConfig, "--pretty", "false"], { cwd: directory, encoding: "utf8" });
84
- const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
87
+ const timeout = options.typeScriptTimeoutMs ?? 60_000;
88
+ if (!Number.isSafeInteger(timeout) || timeout < 1)
89
+ throw new TypeError("typeScriptTimeoutMs must be a positive safe integer");
90
+ const result = spawnSync(binary, ["--project", tempConfig, "--pretty", "false"], {
91
+ cwd: directory,
92
+ encoding: "utf8",
93
+ maxBuffer: 16 * 1024 * 1024,
94
+ timeout,
95
+ });
96
+ const output = `${result.stdout ?? ""}${result.stderr ?? ""}${result.error?.message ?? ""}`
97
+ .replaceAll(overlay.slice(directory.length + 1), basename)
98
+ .replaceAll(tempConfig.slice(directory.length + 1), configPath(directory, project));
85
99
  const typeScript = { exitCode: result.status ?? 1, output, command: `${binary} --project ${tempConfig}` };
86
- return { transformedSource: compilation.transformedSource, sqlDiagnostics: compilation.diagnostics, typeScript, ok: typeScript.exitCode === 0 };
100
+ return {
101
+ transformedSource: compilation.transformedSource,
102
+ sqlDiagnostics: compilation.diagnostics,
103
+ typeScript,
104
+ ok: typeScript.exitCode === 0,
105
+ };
87
106
  }
88
107
  finally {
89
108
  await Promise.allSettled([unlink(overlay), unlink(tempConfig)]);
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/check.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,20 @@
1
1
  import { type DialectPlugin, type SchemaSnapshot, type SqlDiagnostic } from "@typed-sql/core";
2
2
  import { type ExtractedQuery } from "./scanner.js";
3
+ export declare const DEFAULT_MAX_STRUCTURAL_VARIANTS = 64;
3
4
  export interface CompiledQuery {
4
5
  readonly query: ExtractedQuery;
5
6
  readonly rowType: string;
7
+ readonly parameterType: string;
8
+ readonly structural?: true;
9
+ }
10
+ export interface CompiledFragment {
11
+ readonly fragment: ExtractedQuery;
12
+ readonly parameterType: string;
6
13
  }
7
14
  export interface CompileSourceResult {
8
15
  readonly transformedSource: string;
9
16
  readonly queries: readonly CompiledQuery[];
17
+ readonly fragments: readonly CompiledFragment[];
10
18
  readonly diagnostics: readonly SqlDiagnostic[];
11
19
  }
12
20
  export interface CompileSourceOptions<Snapshot extends SchemaSnapshot, Policy> {
@@ -14,6 +22,7 @@ export interface CompileSourceOptions<Snapshot extends SchemaSnapshot, Policy> {
14
22
  readonly dialect: DialectPlugin<Snapshot, Policy>;
15
23
  readonly schema: Snapshot;
16
24
  readonly typePolicy?: Policy;
25
+ readonly maxStructuralVariants?: number;
17
26
  }
18
27
  export declare function compileSource<Snapshot extends SchemaSnapshot, Policy>(options: CompileSourceOptions<Snapshot, Policy>): CompileSourceResult;
19
28
  //# sourceMappingURL=compiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,wBAAgB,aAAa,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EACnE,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC9C,mBAAmB,CAoBrB"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAIlB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,cAAc,EAA6D,MAAM,cAAc,CAAC;AAG9G,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC;AAuBD,wBAAgB,aAAa,CAAC,QAAQ,SAAS,cAAc,EAAE,MAAM,EACnE,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC9C,mBAAmB,CAsKrB"}
@@ -1,27 +1,166 @@
1
- import { rowTypeLiteral, } from "@typed-sql/core";
2
- import { extractStaticQueries, mapSqlRange } from "./scanner.js";
1
+ import { parameterTypeLiteral, rowTypeLiteral, } from "@typed-sql/core";
2
+ import { extractAppendFragments, extractStaticQueries, mapSqlRange } from "./scanner.js";
3
+ import { expandStructuralQuery, structuralRowType } from "./structural.js";
4
+ export const DEFAULT_MAX_STRUCTURAL_VARIANTS = 64;
3
5
  function mapDiagnostic(source, query, diagnostic) {
4
6
  return { ...diagnostic, range: mapSqlRange(source, query, diagnostic.range) };
5
7
  }
8
+ function deduplicateDiagnostics(diagnostics) {
9
+ const seen = new Set();
10
+ return diagnostics.filter((diagnostic) => {
11
+ const key = [
12
+ diagnostic.code,
13
+ diagnostic.severity,
14
+ diagnostic.message,
15
+ diagnostic.range.start,
16
+ diagnostic.range.end,
17
+ diagnostic.suggestion ?? "",
18
+ ].join("\0");
19
+ if (seen.has(key))
20
+ return false;
21
+ seen.add(key);
22
+ return true;
23
+ });
24
+ }
6
25
  export function compileSource(options) {
7
26
  const { source, dialect, schema } = options;
8
27
  if (schema.dialect !== dialect.id) {
9
28
  throw new TypeError(`Dialect ${dialect.id} cannot compile a ${schema.dialect} schema snapshot`);
10
29
  }
30
+ const maximumVariants = options.maxStructuralVariants ?? DEFAULT_MAX_STRUCTURAL_VARIANTS;
31
+ if (!Number.isSafeInteger(maximumVariants) || maximumVariants < 1) {
32
+ throw new TypeError("maxStructuralVariants must be a positive safe integer");
33
+ }
11
34
  const extracted = extractStaticQueries(source, (index) => dialect.placeholder(index), [dialect.sqlModule]);
12
35
  const compiled = [];
36
+ const compiledFragments = [];
13
37
  const diagnostics = [];
14
38
  for (const query of extracted) {
39
+ const expansion = expandStructuralQuery(source, query, (index) => dialect.placeholder(index), maximumVariants);
40
+ if (expansion?.kind === "limit") {
41
+ diagnostics.push({
42
+ code: "TSQ003",
43
+ message: `Conditional SQL would produce more than ${maximumVariants} structural variants from ${expansion.conditionCount} independent conditions`,
44
+ range: query.range,
45
+ severity: "error",
46
+ suggestion: "Reduce independent template conditions or compose predicates with sql.and()/sql.or().",
47
+ });
48
+ continue;
49
+ }
50
+ if (expansion?.kind === "variants") {
51
+ const resolvedVariants = expansion.variants.map((variant) => ({
52
+ variant,
53
+ resolved: dialect.analyze(variant.query.sql, schema, options.typePolicy),
54
+ }));
55
+ for (const { variant, resolved } of resolvedVariants) {
56
+ diagnostics.push(...resolved.diagnostics.map((diagnostic) => mapDiagnostic(source, variant.query, diagnostic)));
57
+ }
58
+ if (!resolvedVariants.some(({ resolved }) => resolved.diagnostics.some((diagnostic) => diagnostic.severity === "error"))) {
59
+ const rows = resolvedVariants.map(({ variant, resolved }) => ({
60
+ row: resolved.resultKind === "command" ? "never" : rowTypeLiteral(resolved.columns),
61
+ choices: variant.choices,
62
+ }));
63
+ const parameterTypes = [
64
+ ...new Set(resolvedVariants.map(({ variant, resolved }) => parameterTypeLiteral(variant.query.parameterCount, resolved.parameters))),
65
+ ];
66
+ const byPosition = new Map();
67
+ for (const { variant, resolved } of resolvedVariants) {
68
+ for (const item of variant.fragments) {
69
+ const parameters = resolved.parameters
70
+ .filter((parameter) => parameter.index > item.parameterOffset &&
71
+ parameter.index <= item.parameterOffset + item.query.parameterCount)
72
+ .map((parameter) => ({ ...parameter, index: parameter.index - item.parameterOffset }));
73
+ const parameterType = parameterTypeLiteral(item.query.parameterCount, parameters);
74
+ const existing = byPosition.get(item.query.insertionPosition);
75
+ if (existing === undefined) {
76
+ byPosition.set(item.query.insertionPosition, {
77
+ fragment: item.query,
78
+ parameterTypes: new Set([parameterType]),
79
+ });
80
+ }
81
+ else
82
+ existing.parameterTypes.add(parameterType);
83
+ }
84
+ }
85
+ const conflicts = [...byPosition.values()].filter((item) => item.parameterTypes.size > 1);
86
+ if (conflicts.length > 0) {
87
+ diagnostics.push(...conflicts.map((item) => ({
88
+ code: "TSQ205",
89
+ message: `Fragment parameters have incompatible structural contexts: ${[...item.parameterTypes].join(" or ")}`,
90
+ range: item.fragment.range,
91
+ severity: "error",
92
+ suggestion: "Move the fragment into the conditional branch that determines its parameter context.",
93
+ })));
94
+ continue;
95
+ }
96
+ compiled.push({
97
+ query,
98
+ rowType: structuralRowType(source, query, rows),
99
+ parameterType: parameterTypes.join(" | "),
100
+ structural: true,
101
+ });
102
+ compiledFragments.push(...[...byPosition.values()].map((item) => ({
103
+ fragment: item.fragment,
104
+ parameterType: [...item.parameterTypes][0],
105
+ })));
106
+ }
107
+ continue;
108
+ }
15
109
  const resolved = dialect.analyze(query.sql, schema, options.typePolicy);
16
110
  diagnostics.push(...resolved.diagnostics.map((diagnostic) => mapDiagnostic(source, query, diagnostic)));
17
111
  if (!resolved.diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
18
- compiled.push({ query, rowType: resolved.resultKind === "command" ? "never" : rowTypeLiteral(resolved.columns) });
112
+ compiled.push({
113
+ query,
114
+ rowType: resolved.resultKind === "command" ? "never" : rowTypeLiteral(resolved.columns),
115
+ parameterType: parameterTypeLiteral(query.parameterCount, resolved.parameters),
116
+ });
117
+ }
118
+ }
119
+ const appendFragments = extractAppendFragments(source, (index) => dialect.placeholder(index), [dialect.sqlModule], extracted);
120
+ for (const { base, prefix, fragment, parameterOffset } of appendFragments) {
121
+ const contextualSql = [base, ...prefix, fragment];
122
+ const combined = {
123
+ ...base,
124
+ sql: contextualSql.map((item) => item.sql).join(""),
125
+ parameterCount: parameterOffset + fragment.parameterCount,
126
+ range: { ...base.range, end: fragment.range.end },
127
+ sqlOffsetMap: contextualSql.flatMap((item) => item.sqlOffsetMap),
128
+ };
129
+ const resolved = dialect.analyze(combined.sql, schema, options.typePolicy);
130
+ const fragmentStart = combined.sql.length - fragment.sql.length;
131
+ const fragmentDiagnostics = resolved.diagnostics.filter((diagnostic) => diagnostic.range.start >= fragmentStart);
132
+ diagnostics.push(...fragmentDiagnostics.map((diagnostic) => mapDiagnostic(source, combined, diagnostic)));
133
+ if (!resolved.diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
134
+ const parameters = resolved.parameters
135
+ .filter((parameter) => parameter.index > parameterOffset)
136
+ .map((parameter) => ({ ...parameter, index: parameter.index - parameterOffset }));
137
+ compiledFragments.push({
138
+ fragment,
139
+ parameterType: parameterTypeLiteral(fragment.parameterCount, parameters),
140
+ });
19
141
  }
20
142
  }
21
143
  let transformedSource = source;
22
- for (const item of [...compiled].sort((a, b) => b.query.insertionPosition - a.query.insertionPosition)) {
23
- transformedSource = `${transformedSource.slice(0, item.query.insertionPosition)}<${item.rowType}>${transformedSource.slice(item.query.insertionPosition)}`;
144
+ const insertions = [
145
+ ...compiled.map((item) => ({
146
+ position: item.query.insertionPosition,
147
+ text: item.structural
148
+ ? `.__typed<${item.rowType}, ${item.parameterType}>()`
149
+ : `<${item.rowType}, ${item.parameterType}>`,
150
+ })),
151
+ ...compiledFragments.map((item) => ({
152
+ position: item.fragment.insertionPosition,
153
+ text: `<${item.parameterType}>`,
154
+ })),
155
+ ];
156
+ for (const insertion of insertions.sort((left, right) => right.position - left.position)) {
157
+ transformedSource = `${transformedSource.slice(0, insertion.position)}${insertion.text}${transformedSource.slice(insertion.position)}`;
24
158
  }
25
- return { transformedSource, queries: compiled, diagnostics };
159
+ return {
160
+ transformedSource,
161
+ queries: compiled,
162
+ fragments: compiledFragments,
163
+ diagnostics: deduplicateDiagnostics(diagnostics),
164
+ };
26
165
  }
27
166
  //# sourceMappingURL=compiler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAuB,MAAM,cAAc,CAAC;AAoBtF,SAAS,aAAa,CAAC,MAAc,EAAE,KAAqB,EAAE,UAAyB;IACrF,OAAO,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAA+C;IAE/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC5C,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,WAAW,OAAO,CAAC,EAAE,qBAAqB,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3G,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACxE,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,GAAG,MAAM,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvG,iBAAiB,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC7J,CAAC;IACD,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../../src/compiler.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ export type { CheckFileOptions, CheckFileResult, TypeScriptCheckResult } from "./check.js";
1
2
  export { checkFile } from "./check.js";
3
+ export type { CompiledFragment, CompiledQuery, CompileSourceOptions, CompileSourceResult } from "./compiler.js";
2
4
  export { compileSource } from "./compiler.js";
5
+ export type { ExtractedInterpolation, ExtractedQuery } from "./scanner.js";
3
6
  export { extractStaticQueries, mapSqlRange } from "./scanner.js";
4
- export type * from "./check.js";
5
- export type * from "./compiler.js";
6
- export type * from "./scanner.js";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjE,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,eAAe,CAAC;AACnC,mBAAmB,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -6,7 +6,37 @@ export interface ExtractedQuery {
6
6
  readonly insertionPosition: number;
7
7
  readonly range: SourceRange;
8
8
  readonly sqlOffsetMap: readonly number[];
9
+ readonly interpolations: readonly ExtractedInterpolation[];
9
10
  }
11
+ export interface ExtractedInterpolation {
12
+ readonly index: number;
13
+ readonly sourceStart: number;
14
+ readonly expressionStart: number;
15
+ readonly expressionEnd: number;
16
+ readonly sourceEnd: number;
17
+ readonly sqlStart: number;
18
+ readonly sqlEnd: number;
19
+ }
20
+ export interface ExtractedAppendFragment {
21
+ readonly base: ExtractedQuery;
22
+ readonly prefix: readonly ExtractedQuery[];
23
+ readonly fragment: ExtractedQuery;
24
+ readonly parameterOffset: number;
25
+ }
26
+ export interface StructuralOperand {
27
+ readonly kind: "empty" | "fragment";
28
+ readonly start: number;
29
+ readonly end: number;
30
+ readonly backtick?: number;
31
+ }
32
+ export interface StructuralInterpolation {
33
+ readonly condition?: string;
34
+ readonly truthy: StructuralOperand;
35
+ readonly falsy?: StructuralOperand;
36
+ }
37
+ export declare function parseStructuralInterpolation(source: string, interpolation: ExtractedInterpolation, tagName: string): StructuralInterpolation | undefined;
38
+ export declare function extractStructuralOperand(source: string, operand: StructuralOperand, tagName: string, placeholderFor: (index: number) => string, parameterOffset: number): ExtractedQuery | undefined;
10
39
  export declare function extractStaticQueries(source: string, placeholderFor: (index: number) => string, sqlModules?: readonly string[]): readonly ExtractedQuery[];
40
+ export declare function extractAppendFragments(source: string, placeholderFor: (index: number) => string, sqlModules?: readonly string[], queries?: readonly ExtractedQuery[]): readonly ExtractedAppendFragment[];
11
41
  export declare function mapSqlRange(source: string, query: ExtractedQuery, range: SourceRange): SourceRange;
12
42
  //# sourceMappingURL=scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAiHD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACzC,UAAU,GAAE,SAAS,MAAM,EAAwB,GAClD,SAAS,cAAc,EAAE,CA8B3B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAIlG"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAiXD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,sBAAsB,EACrC,OAAO,EAAE,MAAM,GACd,uBAAuB,GAAG,SAAS,CA2DrC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACzC,eAAe,EAAE,MAAM,GACtB,cAAc,GAAG,SAAS,CAU5B;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACzC,UAAU,GAAE,SAAS,MAAM,EAAwB,GAClD,SAAS,cAAc,EAAE,CA0C3B;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACzC,UAAU,GAAE,SAAS,MAAM,EAAwB,EACnD,OAAO,GAAE,SAAS,cAAc,EAA6D,GAC5F,SAAS,uBAAuB,EAAE,CA2GpC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAIlG"}