@typed-sql/core 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 +25 -0
- package/README.md +106 -1
- package/dist/packages/core/src/diagnostics.d.ts +8 -0
- package/dist/packages/core/src/diagnostics.d.ts.map +1 -1
- package/dist/packages/core/src/diagnostics.js +2 -0
- package/dist/packages/core/src/diagnostics.js.map +1 -1
- package/dist/packages/core/src/index.d.ts +7 -5
- package/dist/packages/core/src/index.d.ts.map +1 -1
- package/dist/packages/core/src/index.js +3 -2
- package/dist/packages/core/src/index.js.map +1 -1
- package/dist/packages/core/src/query.d.ts +34 -11
- package/dist/packages/core/src/query.d.ts.map +1 -1
- package/dist/packages/core/src/query.js +100 -25
- package/dist/packages/core/src/query.js.map +1 -1
- package/dist/packages/core/src/resolver.d.ts +28 -0
- package/dist/packages/core/src/resolver.d.ts.map +1 -0
- package/dist/packages/core/src/resolver.js +130 -0
- package/dist/packages/core/src/resolver.js.map +1 -0
- package/dist/packages/core/src/types.d.ts +22 -1
- package/dist/packages/core/src/types.d.ts.map +1 -1
- package/dist/packages/core/src/types.js +42 -3
- package/dist/packages/core/src/types.js.map +1 -1
- package/package.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @typed-sql/core
|
|
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
|
+
- 9dd6bc4: Finalize dialect contract version 3 with explicit identifier quoting and grammar-owned capability
|
|
12
|
+
declarations. Accept third-party snapshot dialects, validate grammar versions, and document the
|
|
13
|
+
public grammar-authoring and conformance workflow.
|
|
14
|
+
- 3e2c75c: Infer ordered query parameter tuples and let TypeScript reject interpolation values that do not
|
|
15
|
+
match their SQL context. Dialect contract version 2 adds explicit parameter analysis; unresolved
|
|
16
|
+
positions remain `unknown`. Add typed nullable predicate composition through `sql.fragment()`,
|
|
17
|
+
`sql.and()`, `sql.or()`, `sql.where()`, and `sql.append()` while preserving row and parameter tuples.
|
|
18
|
+
Direct append fragments are grammar-analyzed cumulatively against their static base, so TypeScript
|
|
19
|
+
rejects fragment interpolation values that disagree with the referenced database columns.
|
|
20
|
+
Add `sql.empty` and SQL-template-native conditional structural fragments. The compiler analyzes
|
|
21
|
+
complete branch variants, preserves literal boolean-dependent result rows, and type-checks nested
|
|
22
|
+
fragment parameters without adding a query-builder DSL. Bound independent structural expansion at
|
|
23
|
+
64 variants by default, correlate repeated conditions, merge diagnostics and fragment expectations
|
|
24
|
+
across variants, and fail closed on incompatible contexts. Share indexed catalog and conservative
|
|
25
|
+
parameter-resolution primitives across grammars, harden cooked-template scanning, and add runtime,
|
|
26
|
+
resolver, scanner, and structural performance gates.
|
|
27
|
+
|
|
3
28
|
## 1.0.0-beta.1
|
|
4
29
|
|
|
5
30
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @typed-sql/core
|
|
2
2
|
|
|
3
3
|
The driver- and dialect-neutral foundation of [typed-sql](https://github.com/Lojhan/typed-sql).
|
|
4
|
-
It owns the `sql` tagged template, `Query<Row>`, safe query fragments, rendering contract, database
|
|
4
|
+
It owns the `sql` tagged template, `Query<Row, Parameters>`, safe query fragments, rendering contract, database
|
|
5
5
|
adapter contract, diagnostics, and the interface implemented by every SQL grammar.
|
|
6
6
|
|
|
7
7
|
Most applications install it alongside one dialect:
|
|
@@ -23,24 +23,129 @@ const query = sql`
|
|
|
23
23
|
`;
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
The compiler supplies the ordered parameter tuple from SQL context. For example, comparing an
|
|
27
|
+
interpolation with a `bigint` column produces `Query<Row, readonly [bigint]>`, so passing a `string`
|
|
28
|
+
is a normal TypeScript error. Positions that cannot be proven remain `unknown`.
|
|
29
|
+
|
|
30
|
+
For optional runtime filters, infer a static base query and compose predicates without concatenating
|
|
31
|
+
values into SQL:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { sql } from "@typed-sql/postgres";
|
|
35
|
+
import type { QueryRow } from "@typed-sql/core";
|
|
36
|
+
|
|
37
|
+
const base = sql`SELECT account.id, account.status FROM accounts AS account`;
|
|
38
|
+
type Account = QueryRow<typeof base>;
|
|
39
|
+
|
|
40
|
+
function filtered(status: Account["status"] | null, minimumId: Account["id"] | null) {
|
|
41
|
+
const predicates = [
|
|
42
|
+
status == null ? undefined : sql.fragment`account.status = ${status}`,
|
|
43
|
+
minimumId == null ? undefined : sql.fragment`account.id >= ${minimumId}`,
|
|
44
|
+
] as const;
|
|
45
|
+
return sql.where(base, sql.and(predicates));
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`sql.and()` and `sql.or()` accept nullable fragment tuples, preserve parameter order, parenthesize
|
|
50
|
+
each predicate, and render `TRUE` when every predicate is absent. `sql.where()` preserves the base
|
|
51
|
+
row and concatenates its parameter tuple with the fragment tuple. This is a safe parameterization
|
|
52
|
+
and type-composition boundary; arbitrary dynamic SQL strings are intentionally not analyzed.
|
|
53
|
+
|
|
54
|
+
`sql.append()` provides the type-safe equivalent of conditionally appending clauses:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
function filtered2(filters: { status?: Account["status"] | null; minimumId?: Account["id"] | null }) {
|
|
58
|
+
const query = sql`SELECT account.id, account.status FROM accounts AS account`;
|
|
59
|
+
return sql.append(
|
|
60
|
+
query,
|
|
61
|
+
sql.fragment` WHERE 1 = 1`,
|
|
62
|
+
filters.status == null ? undefined : sql.fragment` AND account.status = ${filters.status}`,
|
|
63
|
+
filters.minimumId == null ? undefined : sql.fragment` AND account.id >= ${filters.minimumId}`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
JavaScript does not support operator overloading, so `query += fragment` would stringify the values
|
|
69
|
+
and erase their type and parameter segments. `sql.append()` skips `undefined`, `null`, and `false`,
|
|
70
|
+
then concatenates only validated fragments. Variadic arguments retain exact parameter order;
|
|
71
|
+
mutable fragment arrays can be spread and retain their allowed parameter union, but have a
|
|
72
|
+
variable-length parameter array.
|
|
73
|
+
|
|
74
|
+
When direct variadic fragments are visible to the typed-sql compiler, it analyzes them cumulatively
|
|
75
|
+
with the static base. The grammar therefore supplies each interpolation's expected column type;
|
|
76
|
+
the core runtime alone only owns immutable composition and parameterization.
|
|
77
|
+
|
|
78
|
+
`sql.empty` enables SQL-template-native conditional structure:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
const query = sql`
|
|
82
|
+
SELECT account.id, account.email
|
|
83
|
+
${select.status ? sql.fragment`, account.status` : sql.empty}
|
|
84
|
+
FROM accounts AS account
|
|
85
|
+
`;
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The runtime only flattens fragment segments and values. The compiler analyzes every finite branch as
|
|
89
|
+
a complete statement and supplies the branch-dependent row type; no clause-builder abstraction is
|
|
90
|
+
introduced. Structural compilation defaults to at most 64 correlated variants and fails with
|
|
91
|
+
`TSQ003` before invoking a grammar if independent conditions exceed that bound.
|
|
92
|
+
|
|
93
|
+
`sql.join()` accepts only `SqlFragment` values. Its optional separator is also a trusted fragment,
|
|
94
|
+
so use `sql.raw(" UNION ALL ")` when a non-comma separator is intentional; an arbitrary runtime
|
|
95
|
+
string is never promoted to SQL implicitly.
|
|
96
|
+
|
|
26
97
|
`@typed-sql/core` is directly useful to grammar and adapter authors:
|
|
27
98
|
|
|
28
99
|
```ts
|
|
29
100
|
import {
|
|
30
101
|
DIALECT_CONTRACT_VERSION,
|
|
102
|
+
assertDialectPlugin,
|
|
31
103
|
createDatabase,
|
|
32
104
|
defineConfig,
|
|
105
|
+
closestName,
|
|
106
|
+
ParameterCollector,
|
|
33
107
|
renderQuery,
|
|
108
|
+
parameterTypeLiteral,
|
|
109
|
+
ResolverSchemaIndex,
|
|
34
110
|
rowTypeLiteral,
|
|
35
111
|
sql,
|
|
112
|
+
unionTypeLiterals,
|
|
36
113
|
type DialectPlugin,
|
|
114
|
+
type DialectCapabilities,
|
|
37
115
|
type Query,
|
|
116
|
+
type QueryParameters,
|
|
117
|
+
type QueryRow,
|
|
118
|
+
type SqlFragment,
|
|
38
119
|
type SchemaSnapshot,
|
|
39
120
|
} from "@typed-sql/core";
|
|
40
121
|
```
|
|
41
122
|
|
|
123
|
+
`ResolverSchemaIndex`, `ParameterCollector`, `unionTypeLiterals`, and `closestName` are reusable,
|
|
124
|
+
dialect-neutral resolver primitives. Future PostgreSQL, MySQL, MSSQL, SQLite, and third-party
|
|
125
|
+
grammars can share indexed catalog lookup and conservative parameter merging while keeping SQL
|
|
126
|
+
semantics, built-ins, quoting, type policy, and unsupported syntax inside their own package.
|
|
127
|
+
|
|
42
128
|
The package has no database, parser, grammar, driver, TypeScript compiler, or editor dependency.
|
|
43
129
|
See the [architecture contract](https://github.com/Lojhan/typed-sql/blob/main/docs/ARCHITECTURE.md)
|
|
130
|
+
and [grammar authoring guide](https://github.com/Lojhan/typed-sql/blob/main/docs/GRAMMAR_AUTHORING.md)
|
|
44
131
|
and [root documentation](https://github.com/Lojhan/typed-sql#readme).
|
|
45
132
|
|
|
133
|
+
## Diagnostics
|
|
134
|
+
|
|
135
|
+
Diagnostic meanings become stable at 1.0. Consumers should key automation on `code`, not English
|
|
136
|
+
message text. The machine-readable registry is exported as `diagnosticRegistry`.
|
|
137
|
+
|
|
138
|
+
| Range | Meaning |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `TSQ001` | SQL syntax error |
|
|
141
|
+
| `TSQ002` | Parser resource limit exceeded |
|
|
142
|
+
| `TSQ003` | Conditional SQL exceeded the configured structural variant bound |
|
|
143
|
+
| `TSQ007` | Dialect/snapshot contract mismatch |
|
|
144
|
+
| `TSQ100`–`TSQ108` | Catalog lookup, ambiguity, output naming, and cast errors |
|
|
145
|
+
| `TSQ202`–`TSQ204` | Unknown/ambiguous functions and unsafe operator inference |
|
|
146
|
+
| `TSQ205` | A shared fragment has incompatible parameter expectations across structural branches |
|
|
147
|
+
| `TSQ210`–`TSQ217` | CTE, DML arity, join, and subquery safety errors |
|
|
148
|
+
| `TSQ301` | Schema or type-policy drift |
|
|
149
|
+
| `TSQ401` | Deliberately unsupported dialect surface |
|
|
150
|
+
|
|
46
151
|
MIT © typed-sql contributors
|
|
@@ -7,6 +7,10 @@ export declare const diagnosticRegistry: Readonly<{
|
|
|
7
7
|
readonly category: "resource";
|
|
8
8
|
readonly summary: "SQL exceeded a parser resource limit.";
|
|
9
9
|
};
|
|
10
|
+
readonly TSQ003: {
|
|
11
|
+
readonly category: "resource";
|
|
12
|
+
readonly summary: "Conditional SQL exceeded the structural variant limit.";
|
|
13
|
+
};
|
|
10
14
|
readonly TSQ007: {
|
|
11
15
|
readonly category: "contract";
|
|
12
16
|
readonly summary: "The schema snapshot and dialect do not match.";
|
|
@@ -59,6 +63,10 @@ export declare const diagnosticRegistry: Readonly<{
|
|
|
59
63
|
readonly category: "type";
|
|
60
64
|
readonly summary: "A function overload is ambiguous.";
|
|
61
65
|
};
|
|
66
|
+
readonly TSQ205: {
|
|
67
|
+
readonly category: "type";
|
|
68
|
+
readonly summary: "A composed parameter has incompatible structural contexts.";
|
|
69
|
+
};
|
|
62
70
|
readonly TSQ210: {
|
|
63
71
|
readonly category: "support";
|
|
64
72
|
readonly summary: "Recursive CTE inference is not supported safely.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;iBACnB,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,iCAAiC;;;iBAC9D,QAAQ,EAAE,UAAU;iBAAE,OAAO,EAAE,uCAAuC;;;iBACtE,QAAQ,EAAE,UAAU;iBAAE,OAAO,EAAE,+CAA+C;;;iBAC9E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oCAAoC;;;iBACjE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,qCAAqC;;;iBAClE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kCAAkC;;;iBAC/D,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kDAAkD;;;iBAC/E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,sCAAsC;;;iBACjE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,yCAAyC;;;iBACtE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,iCAAiC;;;iBAC9D,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,wBAAwB;;;iBACnD,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,wCAAwC;;;iBACnE,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,mCAAmC;;;iBAC9D,QAAQ,EAAE,SAAS;iBAAE,OAAO,EAAE,kDAAkD;;;iBAChF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,2BAA2B;;;iBACxD,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,6BAA6B;;;iBAC1D,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,wCAAwC;;;iBACrE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,0CAA0C;;;iBACvE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kDAAkD;;;iBAC/E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,uDAAuD;;;iBACpF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,OAAO;iBAAE,OAAO,EAAE,qEAAqE;;;iBACjG,QAAQ,EAAE,SAAS;iBAAE,OAAO,EAAE,mDAAmD;;EAClF,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAErE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,sBAAsB,CAEvF"}
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;iBACnB,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,iCAAiC;;;iBAC9D,QAAQ,EAAE,UAAU;iBAAE,OAAO,EAAE,uCAAuC;;;iBACtE,QAAQ,EAAE,UAAU;iBAAE,OAAO,EAAE,wDAAwD;;;iBACvF,QAAQ,EAAE,UAAU;iBAAE,OAAO,EAAE,+CAA+C;;;iBAC9E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oCAAoC;;;iBACjE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,qCAAqC;;;iBAClE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kCAAkC;;;iBAC/D,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kDAAkD;;;iBAC/E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,sCAAsC;;;iBACjE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,yCAAyC;;;iBACtE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,iCAAiC;;;iBAC9D,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,wBAAwB;;;iBACnD,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,wCAAwC;;;iBACnE,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,mCAAmC;;;iBAC9D,QAAQ,EAAE,MAAM;iBAAE,OAAO,EAAE,4DAA4D;;;iBACvF,QAAQ,EAAE,SAAS;iBAAE,OAAO,EAAE,kDAAkD;;;iBAChF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,2BAA2B;;;iBACxD,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,6BAA6B;;;iBAC1D,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,wCAAwC;;;iBACrE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,0CAA0C;;;iBACvE,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,kDAAkD;;;iBAC/E,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,uDAAuD;;;iBACpF,QAAQ,EAAE,QAAQ;iBAAE,OAAO,EAAE,oDAAoD;;;iBACjF,QAAQ,EAAE,OAAO;iBAAE,OAAO,EAAE,qEAAqE;;;iBACjG,QAAQ,EAAE,SAAS;iBAAE,OAAO,EAAE,mDAAmD;;EAClF,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAErE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,sBAAsB,CAEvF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const diagnosticRegistry = Object.freeze({
|
|
2
2
|
TSQ001: { category: "syntax", summary: "SQL syntax could not be parsed." },
|
|
3
3
|
TSQ002: { category: "resource", summary: "SQL exceeded a parser resource limit." },
|
|
4
|
+
TSQ003: { category: "resource", summary: "Conditional SQL exceeded the structural variant limit." },
|
|
4
5
|
TSQ007: { category: "contract", summary: "The schema snapshot and dialect do not match." },
|
|
5
6
|
TSQ100: { category: "schema", summary: "A referenced table does not exist." },
|
|
6
7
|
TSQ101: { category: "schema", summary: "A referenced column does not exist." },
|
|
@@ -14,6 +15,7 @@ export const diagnosticRegistry = Object.freeze({
|
|
|
14
15
|
TSQ202: { category: "type", summary: "A function is unknown." },
|
|
15
16
|
TSQ203: { category: "type", summary: "An operator cannot be inferred safely." },
|
|
16
17
|
TSQ204: { category: "type", summary: "A function overload is ambiguous." },
|
|
18
|
+
TSQ205: { category: "type", summary: "A composed parameter has incompatible structural contexts." },
|
|
17
19
|
TSQ210: { category: "support", summary: "Recursive CTE inference is not supported safely." },
|
|
18
20
|
TSQ211: { category: "schema", summary: "A CTE name is duplicated." },
|
|
19
21
|
TSQ212: { category: "result", summary: "A CTE does not return rows." },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,uCAAuC,EAAE;IAClF,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,+CAA+C,EAAE;IAC1F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC7E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC9E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAkC,EAAE;IAC3E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC3F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sCAAsC,EAAE;IAC7E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,yCAAyC,EAAE;IAClF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC/D,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE;IAC/E,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC5F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,EAAE;IACpE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACtE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,wCAAwC,EAAE;IACjF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACnF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC3F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,uDAAuD,EAAE;IAChG,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,qEAAqE,EAAE;IAC7G,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,mDAAmD,EAAE;CACrF,CAAC,CAAC;AAIZ,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,uCAAuC,EAAE;IAClF,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,wDAAwD,EAAE;IACnG,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,+CAA+C,EAAE;IAC1F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC7E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,qCAAqC,EAAE;IAC9E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAkC,EAAE;IAC3E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC3F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sCAAsC,EAAE;IAC7E,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,yCAAyC,EAAE;IAClF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC/D,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE;IAC/E,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE;IAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,4DAA4D,EAAE;IACnG,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC5F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,EAAE;IACpE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACtE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,wCAAwC,EAAE;IACjF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACnF,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kDAAkD,EAAE;IAC3F,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,uDAAuD,EAAE;IAChG,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,oDAAoD,EAAE;IAC7F,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,qEAAqE,EAAE;IAC7G,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,mDAAmD,EAAE;CACrF,CAAC,CAAC;AAIZ,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export { createDatabase, renderQuery, sql } from "./query.js";
|
|
2
|
-
export { diagnosticRegistry, isTypedSqlDiagnosticCode } from "./diagnostics.js";
|
|
3
1
|
export type { TypedSqlDiagnosticCode } from "./diagnostics.js";
|
|
4
|
-
export {
|
|
5
|
-
export type
|
|
6
|
-
export
|
|
2
|
+
export { diagnosticRegistry, isTypedSqlDiagnosticCode } from "./diagnostics.js";
|
|
3
|
+
export type { Database, OptionalSqlFragment, Query, QueryExecutor, QueryParameters, QueryRow, RenderedQuery, SqlFragment, SqlRenderer, SqlSegment, SqlTag, TransactionRunner, } from "./query.js";
|
|
4
|
+
export { createDatabase, renderQuery, sql } from "./query.js";
|
|
5
|
+
export type { ResolverType } from "./resolver.js";
|
|
6
|
+
export { closestName, ParameterCollector, ResolverSchemaIndex, unionTypeLiterals } from "./resolver.js";
|
|
7
|
+
export type { ColumnSnapshot, DialectAnalysis, DialectCapabilities, DialectPlugin, DomainSnapshot, FunctionSnapshot, GeneratedSchemaMetadata, GeneratedSchemaSnapshot, ResolvedColumn, ResolvedParameter, SchemaProvider, SchemaSnapshot, SourceRange, SqlDiagnostic, TableSnapshot, TypedSqlConfig, } from "./types.js";
|
|
8
|
+
export { assertDialectPlugin, DIALECT_CONTRACT_VERSION, defineConfig, parameterTypeLiteral, rowTypeLiteral, } from "./types.js";
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACL,aAAa,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,MAAM,EACN,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxG,YAAY,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { createDatabase, renderQuery, sql } from "./query.js";
|
|
2
1
|
export { diagnosticRegistry, isTypedSqlDiagnosticCode } from "./diagnostics.js";
|
|
3
|
-
export {
|
|
2
|
+
export { createDatabase, renderQuery, sql } from "./query.js";
|
|
3
|
+
export { closestName, ParameterCollector, ResolverSchemaIndex, unionTypeLiterals } from "./resolver.js";
|
|
4
|
+
export { assertDialectPlugin, DIALECT_CONTRACT_VERSION, defineConfig, parameterTypeLiteral, rowTypeLiteral, } from "./types.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAehF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAmBxG,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -10,20 +10,43 @@ export type SqlSegment = {
|
|
|
10
10
|
readonly kind: "identifier";
|
|
11
11
|
readonly name: string;
|
|
12
12
|
};
|
|
13
|
-
export interface SqlFragment {
|
|
14
|
-
readonly [fragmentBrand]:
|
|
13
|
+
export interface SqlFragment<Params extends readonly unknown[] = readonly unknown[]> {
|
|
14
|
+
readonly [fragmentBrand]: () => Params;
|
|
15
15
|
readonly segments: readonly SqlSegment[];
|
|
16
16
|
}
|
|
17
|
-
export
|
|
18
|
-
|
|
17
|
+
export type QueryRow<Value> = Value extends Query<infer Row, infer _Params> ? Row : never;
|
|
18
|
+
export type QueryParameters<Value> = Value extends Query<infer _Row, infer Params> ? Params : never;
|
|
19
|
+
type SqlPartParameters<Part> = [Part] extends [SqlFragment<infer Params>] ? Params : readonly [Part];
|
|
20
|
+
export type SqlPartsParameters<Parts extends readonly unknown[], Accumulator extends readonly unknown[] = readonly []> = number extends Parts["length"] ? readonly unknown[] : Parts extends readonly [infer Head, ...infer Tail] ? SqlPartsParameters<Tail, readonly [...Accumulator, ...SqlPartParameters<Head>]> : Accumulator;
|
|
21
|
+
type CheckedSqlParts<Parts extends readonly unknown[], Expected extends readonly unknown[]> = Parts & ([SqlPartsParameters<Parts>] extends [Expected] ? unknown : never);
|
|
22
|
+
type PresentFragment<Part> = Exclude<Part, false | null | undefined>;
|
|
23
|
+
type OptionalFragmentParameters<Part> = [PresentFragment<Part>] extends [never] ? readonly [] : PresentFragment<Part> extends SqlFragment<infer Params> ? Params : readonly unknown[];
|
|
24
|
+
export type FragmentListParameters<Parts extends readonly unknown[], Accumulator extends readonly unknown[] = readonly []> = number extends Parts["length"] ? readonly OptionalFragmentParameters<Parts[number]>[number][] : Parts extends readonly [infer Head, ...infer Tail] ? FragmentListParameters<Tail, readonly [...Accumulator, ...OptionalFragmentParameters<Head>]> : Accumulator;
|
|
25
|
+
export type OptionalSqlFragment = SqlFragment | false | null | undefined;
|
|
26
|
+
export interface Query<Row, Params extends readonly unknown[] = readonly unknown[]> {
|
|
27
|
+
readonly [queryBrand]: {
|
|
28
|
+
readonly row: (value: Row) => Row;
|
|
29
|
+
readonly params: (value: Params) => Params;
|
|
30
|
+
};
|
|
19
31
|
readonly segments: readonly SqlSegment[];
|
|
20
32
|
}
|
|
21
33
|
export interface SqlTag {
|
|
22
|
-
<Row = unknown>(strings: TemplateStringsArray, ...parts:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
<Row = unknown, Parts extends readonly unknown[] = readonly unknown[]>(strings: TemplateStringsArray, ...parts: Parts): Query<Row, SqlPartsParameters<Parts>>;
|
|
35
|
+
/**
|
|
36
|
+
* @internal Reserved compiler-overlay protocol. Applications must use the `sql` tag directly;
|
|
37
|
+
* this member may change alongside matching core/compiler releases without application-level compatibility.
|
|
38
|
+
*/
|
|
39
|
+
readonly __typed: <Row, Params extends readonly unknown[]>() => <const Parts extends readonly unknown[]>(strings: TemplateStringsArray, ...parts: CheckedSqlParts<Parts, Params>) => Query<Row, Params>;
|
|
40
|
+
readonly fragment: <Parts extends readonly unknown[]>(strings: TemplateStringsArray, ...parts: Parts) => SqlFragment<SqlPartsParameters<Parts>>;
|
|
41
|
+
readonly empty: SqlFragment<readonly []>;
|
|
42
|
+
readonly ident: (name: string) => SqlFragment<readonly []>;
|
|
43
|
+
readonly value: <Value>(value: Value) => SqlFragment<readonly [Value]>;
|
|
44
|
+
readonly join: <const Parts extends readonly SqlFragment[]>(parts: Parts, separator?: SqlFragment<readonly []>) => SqlFragment<FragmentListParameters<Parts>>;
|
|
45
|
+
readonly and: <const Parts extends readonly OptionalSqlFragment[]>(parts: Parts) => SqlFragment<FragmentListParameters<Parts>>;
|
|
46
|
+
readonly or: <const Parts extends readonly OptionalSqlFragment[]>(parts: Parts) => SqlFragment<FragmentListParameters<Parts>>;
|
|
47
|
+
readonly where: <Row, QueryParams extends readonly unknown[], PredicateParams extends readonly unknown[]>(query: Query<Row, QueryParams>, predicate: SqlFragment<PredicateParams>) => Query<Row, readonly [...QueryParams, ...PredicateParams]>;
|
|
48
|
+
readonly append: <Row, QueryParams extends readonly unknown[], const Parts extends readonly OptionalSqlFragment[]>(query: Query<Row, QueryParams>, ...parts: Parts) => Query<Row, readonly [...QueryParams, ...FragmentListParameters<Parts>]>;
|
|
49
|
+
readonly raw: (text: string) => SqlFragment<readonly []>;
|
|
27
50
|
readonly dynamic: (text: string) => Query<unknown>;
|
|
28
51
|
}
|
|
29
52
|
export interface SqlRenderer {
|
|
@@ -38,12 +61,12 @@ export interface QueryExecutor {
|
|
|
38
61
|
execute(text: string, values: readonly unknown[]): Promise<readonly unknown[]>;
|
|
39
62
|
}
|
|
40
63
|
export interface Database {
|
|
41
|
-
execute<Row>(query: Query<Row>): Promise<readonly Row[]>;
|
|
64
|
+
execute<Row, Params extends readonly unknown[]>(query: Query<Row, Params>): Promise<readonly Row[]>;
|
|
42
65
|
transaction<T>(fn: (db: Database) => Promise<T>): Promise<T>;
|
|
43
66
|
}
|
|
44
67
|
export type TransactionRunner = <T>(fn: (executor: QueryExecutor) => Promise<T>) => Promise<T>;
|
|
45
68
|
export declare const sql: SqlTag;
|
|
46
|
-
export declare function renderQuery<Row>(queryValue: Query<Row>, renderer: SqlRenderer): RenderedQuery;
|
|
69
|
+
export declare function renderQuery<Row, Params extends readonly unknown[]>(queryValue: Query<Row, Params>, renderer: SqlRenderer): RenderedQuery;
|
|
47
70
|
export declare function createDatabase(executor: QueryExecutor, renderer: SqlRenderer, transactionRunner?: TransactionRunner): Database;
|
|
48
71
|
export {};
|
|
49
72
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/query.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,aAAa,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +1,138 @@
|
|
|
1
|
-
const fragmentBrand = Symbol("typed-sql.fragment");
|
|
2
|
-
const queryBrand = Symbol("typed-sql.query");
|
|
1
|
+
const fragmentBrand = Symbol.for("@typed-sql/core.fragment");
|
|
2
|
+
const queryBrand = Symbol.for("@typed-sql/core.query");
|
|
3
3
|
const text = (textValue) => ({ kind: "text", text: textValue });
|
|
4
4
|
const value = (valueItem) => ({ kind: "value", value: valueItem });
|
|
5
|
+
const fragmentTypeBrand = () => [];
|
|
6
|
+
const queryTypeBrand = Object.freeze({
|
|
7
|
+
row: (row) => row,
|
|
8
|
+
params: (params) => params,
|
|
9
|
+
});
|
|
5
10
|
function fragment(segments) {
|
|
6
|
-
return Object.freeze({
|
|
11
|
+
return Object.freeze({
|
|
12
|
+
[fragmentBrand]: fragmentTypeBrand,
|
|
13
|
+
segments: Object.freeze(segments),
|
|
14
|
+
});
|
|
7
15
|
}
|
|
8
16
|
function isFragment(part) {
|
|
9
|
-
return typeof part === "object" &&
|
|
17
|
+
return (typeof part === "object" &&
|
|
18
|
+
part !== null &&
|
|
19
|
+
fragmentBrand in part &&
|
|
20
|
+
Array.isArray(part.segments));
|
|
10
21
|
}
|
|
11
22
|
function query(segments) {
|
|
12
|
-
return Object.freeze({
|
|
23
|
+
return Object.freeze({
|
|
24
|
+
[queryBrand]: queryTypeBrand,
|
|
25
|
+
segments: Object.freeze(segments),
|
|
26
|
+
});
|
|
13
27
|
}
|
|
14
|
-
|
|
28
|
+
function templateSegments(strings, parts) {
|
|
15
29
|
const segments = [];
|
|
16
30
|
for (let index = 0; index < strings.length; index += 1) {
|
|
17
31
|
segments.push(text(strings[index] ?? ""));
|
|
18
|
-
if (index
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
if (index >= parts.length)
|
|
33
|
+
continue;
|
|
34
|
+
const part = parts[index];
|
|
35
|
+
if (isFragment(part))
|
|
36
|
+
segments.push(...part.segments);
|
|
37
|
+
else
|
|
38
|
+
segments.push(value(part));
|
|
25
39
|
}
|
|
26
|
-
return
|
|
40
|
+
return segments;
|
|
41
|
+
}
|
|
42
|
+
const tag = (strings, ...parts) => {
|
|
43
|
+
return query(templateSegments(strings, parts));
|
|
44
|
+
};
|
|
45
|
+
const fragmentTag = (strings, ...parts) => {
|
|
46
|
+
return fragment(templateSegments(strings, parts));
|
|
27
47
|
};
|
|
48
|
+
function booleanGroup(parts, operator) {
|
|
49
|
+
const segments = [];
|
|
50
|
+
for (const part of parts) {
|
|
51
|
+
if (part === undefined || part === null || part === false)
|
|
52
|
+
continue;
|
|
53
|
+
if (!isFragment(part))
|
|
54
|
+
throw new TypeError(`sql.${operator.toLowerCase()}() accepts SQL fragments or empty values`);
|
|
55
|
+
if (segments.length > 0)
|
|
56
|
+
segments.push(text(` ${operator} `));
|
|
57
|
+
segments.push(text("("), ...part.segments, text(")"));
|
|
58
|
+
}
|
|
59
|
+
if (segments.length === 0)
|
|
60
|
+
segments.push(text("TRUE"));
|
|
61
|
+
return fragment(segments);
|
|
62
|
+
}
|
|
63
|
+
const commaSeparator = fragment([text(", ")]);
|
|
28
64
|
export const sql = Object.assign(tag, {
|
|
65
|
+
__typed() {
|
|
66
|
+
return (strings, ...parts) => tag(strings, ...parts);
|
|
67
|
+
},
|
|
68
|
+
fragment: fragmentTag,
|
|
69
|
+
empty: fragment([]),
|
|
29
70
|
ident(name) {
|
|
30
71
|
if (name.length === 0 || name.includes("\0"))
|
|
31
72
|
throw new TypeError("SQL identifiers must be non-empty and cannot contain NUL");
|
|
32
73
|
return fragment([{ kind: "identifier", name }]);
|
|
33
74
|
},
|
|
34
|
-
value(valueItem) {
|
|
35
|
-
|
|
75
|
+
value(valueItem) {
|
|
76
|
+
return fragment([value(valueItem)]);
|
|
77
|
+
},
|
|
78
|
+
join(parts, separator = commaSeparator) {
|
|
79
|
+
if (!isFragment(separator))
|
|
80
|
+
throw new TypeError("sql.join() separator must be a trusted SQL fragment");
|
|
36
81
|
const segments = [];
|
|
37
82
|
parts.forEach((part, index) => {
|
|
83
|
+
if (!isFragment(part))
|
|
84
|
+
throw new TypeError("sql.join() accepts SQL fragments");
|
|
38
85
|
if (index > 0)
|
|
39
|
-
segments.push(
|
|
86
|
+
segments.push(...separator.segments);
|
|
40
87
|
segments.push(...part.segments);
|
|
41
88
|
});
|
|
42
89
|
return fragment(segments);
|
|
43
90
|
},
|
|
44
|
-
|
|
45
|
-
|
|
91
|
+
and(parts) {
|
|
92
|
+
return booleanGroup(parts, "AND");
|
|
93
|
+
},
|
|
94
|
+
or(parts) {
|
|
95
|
+
return booleanGroup(parts, "OR");
|
|
96
|
+
},
|
|
97
|
+
where(queryValue, predicate) {
|
|
98
|
+
return query([
|
|
99
|
+
...queryValue.segments,
|
|
100
|
+
text(" WHERE "),
|
|
101
|
+
...predicate.segments,
|
|
102
|
+
]);
|
|
103
|
+
},
|
|
104
|
+
append(queryValue, ...parts) {
|
|
105
|
+
const segments = [...queryValue.segments];
|
|
106
|
+
for (const part of parts) {
|
|
107
|
+
if (part === undefined || part === null || part === false)
|
|
108
|
+
continue;
|
|
109
|
+
if (!isFragment(part))
|
|
110
|
+
throw new TypeError("sql.append() accepts SQL fragments or empty values");
|
|
111
|
+
segments.push(...part.segments);
|
|
112
|
+
}
|
|
113
|
+
return query(segments);
|
|
114
|
+
},
|
|
115
|
+
raw(sqlText) {
|
|
116
|
+
return fragment([text(sqlText)]);
|
|
117
|
+
},
|
|
118
|
+
dynamic(sqlText) {
|
|
119
|
+
return query([text(sqlText)]);
|
|
120
|
+
},
|
|
46
121
|
});
|
|
47
122
|
export function renderQuery(queryValue, renderer) {
|
|
48
123
|
const values = [];
|
|
49
|
-
|
|
124
|
+
const chunks = [];
|
|
50
125
|
for (const segment of queryValue.segments) {
|
|
51
126
|
if (segment.kind === "text")
|
|
52
|
-
|
|
127
|
+
chunks.push(segment.text);
|
|
53
128
|
else if (segment.kind === "identifier")
|
|
54
|
-
|
|
129
|
+
chunks.push(renderer.quoteIdentifier(segment.name));
|
|
55
130
|
else {
|
|
56
131
|
values.push(segment.value);
|
|
57
|
-
|
|
132
|
+
chunks.push(renderer.placeholder(values.length));
|
|
58
133
|
}
|
|
59
134
|
}
|
|
60
|
-
return { text:
|
|
135
|
+
return { text: chunks.join(""), values: Object.freeze(values) };
|
|
61
136
|
}
|
|
62
137
|
class DatabaseImplementation {
|
|
63
138
|
#executor;
|
|
@@ -70,7 +145,7 @@ class DatabaseImplementation {
|
|
|
70
145
|
}
|
|
71
146
|
async execute(queryValue) {
|
|
72
147
|
const rendered = renderQuery(queryValue, this.#renderer);
|
|
73
|
-
return await this.#executor.execute(rendered.text, rendered.values);
|
|
148
|
+
return (await this.#executor.execute(rendered.text, rendered.values));
|
|
74
149
|
}
|
|
75
150
|
async transaction(fn) {
|
|
76
151
|
if (this.#transactionRunner === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../src/query.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAkB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ColumnSnapshot, FunctionSnapshot, ResolvedParameter, SchemaSnapshot, TableSnapshot } from "./types.js";
|
|
2
|
+
export interface ResolverType {
|
|
3
|
+
readonly tsType: string;
|
|
4
|
+
readonly nullable: boolean;
|
|
5
|
+
readonly databaseType?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Shared parameter inference state for grammar implementations. */
|
|
8
|
+
export declare class ParameterCollector {
|
|
9
|
+
#private;
|
|
10
|
+
record(index: number, expected?: ResolverType): ResolverType;
|
|
11
|
+
values(): readonly ResolvedParameter[];
|
|
12
|
+
}
|
|
13
|
+
export declare function unionTypeLiterals(types: readonly string[]): string;
|
|
14
|
+
export declare function closestName(name: string, candidates: readonly string[]): string | undefined;
|
|
15
|
+
interface IndexedTable {
|
|
16
|
+
readonly key: string;
|
|
17
|
+
readonly table: TableSnapshot;
|
|
18
|
+
}
|
|
19
|
+
/** Precomputed case-sensitive and folded schema lookups shared by SQL grammars. */
|
|
20
|
+
export declare class ResolverSchemaIndex {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(snapshot: SchemaSnapshot);
|
|
23
|
+
tables(name: string, schema?: string, caseSensitive?: boolean): readonly IndexedTable[];
|
|
24
|
+
column(table: TableSnapshot, name: string, caseSensitive?: boolean): ColumnSnapshot | undefined;
|
|
25
|
+
functions(name: string, arity: number, schema?: string): readonly FunctionSnapshot[];
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,oEAAoE;AACpE,qBAAa,kBAAkB;;IAI7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,CA2B3D;IAED,MAAM,IAAI,SAAS,iBAAiB,EAAE,CAErC;CACF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAGlE;AAoBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAW3F;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;CAC/B;AAQD,mFAAmF;AACnF,qBAAa,mBAAmB;;IAO9B,YAAY,QAAQ,EAAE,cAAc,EAanC;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,SAAS,YAAY,EAAE,CAQpF;IAED,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,cAAc,GAAG,SAAS,CAI5F;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,gBAAgB,EAAE,CAKnF;CAcF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/** Shared parameter inference state for grammar implementations. */
|
|
2
|
+
export class ParameterCollector {
|
|
3
|
+
#parameters = new Map();
|
|
4
|
+
#conflicts = new Map();
|
|
5
|
+
record(index, expected) {
|
|
6
|
+
const candidate = expected === undefined ? { index, tsType: "unknown", nullable: true } : { index, ...expected };
|
|
7
|
+
const current = this.#parameters.get(index);
|
|
8
|
+
const existingConflict = this.#conflicts.get(index);
|
|
9
|
+
if (existingConflict !== undefined)
|
|
10
|
+
return existingConflict;
|
|
11
|
+
if (current === undefined || (current.tsType === "unknown" && candidate.tsType !== "unknown")) {
|
|
12
|
+
this.#parameters.set(index, candidate);
|
|
13
|
+
return candidate;
|
|
14
|
+
}
|
|
15
|
+
if (candidate.tsType === "unknown")
|
|
16
|
+
return current;
|
|
17
|
+
if (current.tsType !== candidate.tsType) {
|
|
18
|
+
const conflict = { index, tsType: "unknown", nullable: true };
|
|
19
|
+
this.#parameters.set(index, conflict);
|
|
20
|
+
this.#conflicts.set(index, conflict);
|
|
21
|
+
return conflict;
|
|
22
|
+
}
|
|
23
|
+
const merged = {
|
|
24
|
+
index,
|
|
25
|
+
tsType: current.tsType,
|
|
26
|
+
nullable: current.nullable || candidate.nullable,
|
|
27
|
+
...(current.databaseType === candidate.databaseType && current.databaseType !== undefined
|
|
28
|
+
? { databaseType: current.databaseType }
|
|
29
|
+
: {}),
|
|
30
|
+
};
|
|
31
|
+
this.#parameters.set(index, merged);
|
|
32
|
+
return merged;
|
|
33
|
+
}
|
|
34
|
+
values() {
|
|
35
|
+
return [...this.#parameters.values()].sort((left, right) => left.index - right.index);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function unionTypeLiterals(types) {
|
|
39
|
+
const distinct = [...new Set(types)];
|
|
40
|
+
return distinct.includes("unknown") ? "unknown" : distinct.join(" | ") || "unknown";
|
|
41
|
+
}
|
|
42
|
+
function editDistance(left, right) {
|
|
43
|
+
const rows = Array.from({ length: left.length + 1 }, (_, index) => index);
|
|
44
|
+
for (let column = 1; column <= right.length; column += 1) {
|
|
45
|
+
let diagonal = rows[0];
|
|
46
|
+
rows[0] = column;
|
|
47
|
+
for (let row = 1; row <= left.length; row += 1) {
|
|
48
|
+
const above = rows[row];
|
|
49
|
+
rows[row] = Math.min(rows[row] + 1, rows[row - 1] + 1, diagonal + (left[row - 1] === right[column - 1] ? 0 : 1));
|
|
50
|
+
diagonal = above;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return rows[left.length];
|
|
54
|
+
}
|
|
55
|
+
export function closestName(name, candidates) {
|
|
56
|
+
let closest;
|
|
57
|
+
let closestDistance = Number.POSITIVE_INFINITY;
|
|
58
|
+
for (const candidate of candidates) {
|
|
59
|
+
const distance = editDistance(name, candidate);
|
|
60
|
+
if (distance < closestDistance) {
|
|
61
|
+
closest = candidate;
|
|
62
|
+
closestDistance = distance;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return closest !== undefined && closestDistance <= Math.max(2, Math.floor(name.length / 2)) ? closest : undefined;
|
|
66
|
+
}
|
|
67
|
+
function addToIndex(index, key, value) {
|
|
68
|
+
const values = index.get(key);
|
|
69
|
+
if (values === undefined)
|
|
70
|
+
index.set(key, [value]);
|
|
71
|
+
else if (!values.includes(value))
|
|
72
|
+
values.push(value);
|
|
73
|
+
}
|
|
74
|
+
/** Precomputed case-sensitive and folded schema lookups shared by SQL grammars. */
|
|
75
|
+
export class ResolverSchemaIndex {
|
|
76
|
+
#exactTables = new Map();
|
|
77
|
+
#foldedTables = new Map();
|
|
78
|
+
#exactColumns = new WeakMap();
|
|
79
|
+
#foldedColumns = new WeakMap();
|
|
80
|
+
#functions = new Map();
|
|
81
|
+
constructor(snapshot) {
|
|
82
|
+
for (const [key, table] of Object.entries(snapshot.tables)) {
|
|
83
|
+
const indexed = { key, table };
|
|
84
|
+
const unqualifiedKey = key.slice(key.lastIndexOf(".") + 1);
|
|
85
|
+
for (const candidate of new Set([key, unqualifiedKey, table.name])) {
|
|
86
|
+
addToIndex(this.#exactTables, candidate, indexed);
|
|
87
|
+
addToIndex(this.#foldedTables, candidate.toLowerCase(), indexed);
|
|
88
|
+
}
|
|
89
|
+
this.#indexColumns(table);
|
|
90
|
+
}
|
|
91
|
+
for (const value of Object.values(snapshot.functions ?? {})) {
|
|
92
|
+
addToIndex(this.#functions, `${value.name.toLowerCase()}/${value.argumentTypes.length}`, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
tables(name, schema, caseSensitive = false) {
|
|
96
|
+
const index = caseSensitive ? this.#exactTables : this.#foldedTables;
|
|
97
|
+
const matches = index.get(caseSensitive ? name : name.toLowerCase()) ?? [];
|
|
98
|
+
if (schema === undefined)
|
|
99
|
+
return matches;
|
|
100
|
+
return matches.filter(({ key, table }) => {
|
|
101
|
+
const tableSchema = table.schema ?? key.slice(0, Math.max(0, key.lastIndexOf(".")));
|
|
102
|
+
return caseSensitive ? tableSchema === schema : tableSchema.toLowerCase() === schema.toLowerCase();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
column(table, name, caseSensitive = false) {
|
|
106
|
+
if (!this.#exactColumns.has(table))
|
|
107
|
+
this.#indexColumns(table);
|
|
108
|
+
const index = caseSensitive ? this.#exactColumns : this.#foldedColumns;
|
|
109
|
+
return index.get(table)?.get(caseSensitive ? name : name.toLowerCase());
|
|
110
|
+
}
|
|
111
|
+
functions(name, arity, schema) {
|
|
112
|
+
const matches = this.#functions.get(`${name.toLowerCase()}/${arity}`) ?? [];
|
|
113
|
+
return schema === undefined
|
|
114
|
+
? matches
|
|
115
|
+
: matches.filter((candidate) => candidate.schema?.toLowerCase() === schema.toLowerCase());
|
|
116
|
+
}
|
|
117
|
+
#indexColumns(table) {
|
|
118
|
+
const exactColumns = new Map();
|
|
119
|
+
const foldedColumns = new Map();
|
|
120
|
+
for (const [columnKey, column] of Object.entries(table.columns)) {
|
|
121
|
+
exactColumns.set(columnKey, column);
|
|
122
|
+
exactColumns.set(column.name, column);
|
|
123
|
+
foldedColumns.set(columnKey.toLowerCase(), column);
|
|
124
|
+
foldedColumns.set(column.name.toLowerCase(), column);
|
|
125
|
+
}
|
|
126
|
+
this.#exactColumns.set(table, exactColumns);
|
|
127
|
+
this.#foldedColumns.set(table, foldedColumns);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../src/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const DIALECT_CONTRACT_VERSION:
|
|
1
|
+
export declare const DIALECT_CONTRACT_VERSION: 3;
|
|
2
2
|
export interface SourceRange {
|
|
3
3
|
readonly start: number;
|
|
4
4
|
readonly end: number;
|
|
@@ -65,11 +65,24 @@ export interface ResolvedColumn {
|
|
|
65
65
|
readonly databaseType?: string;
|
|
66
66
|
readonly range: SourceRange;
|
|
67
67
|
}
|
|
68
|
+
export interface ResolvedParameter {
|
|
69
|
+
/** One-based database placeholder index. */
|
|
70
|
+
readonly index: number;
|
|
71
|
+
readonly tsType: string;
|
|
72
|
+
readonly nullable: boolean;
|
|
73
|
+
readonly databaseType?: string;
|
|
74
|
+
}
|
|
68
75
|
export interface DialectAnalysis {
|
|
69
76
|
readonly columns: readonly ResolvedColumn[];
|
|
77
|
+
readonly parameters: readonly ResolvedParameter[];
|
|
70
78
|
readonly diagnostics: readonly SqlDiagnostic[];
|
|
71
79
|
readonly resultKind?: "rows" | "command";
|
|
72
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Grammar-owned feature declarations. Core intentionally does not assign meaning to the keys.
|
|
83
|
+
* Tooling and applications can expose them without teaching neutral packages dialect semantics.
|
|
84
|
+
*/
|
|
85
|
+
export type DialectCapabilities = Readonly<Record<string, boolean>>;
|
|
73
86
|
export interface DialectPlugin<Snapshot extends SchemaSnapshot = SchemaSnapshot, Policy = unknown> {
|
|
74
87
|
readonly contractVersion: typeof DIALECT_CONTRACT_VERSION;
|
|
75
88
|
readonly id: string;
|
|
@@ -77,8 +90,11 @@ export interface DialectPlugin<Snapshot extends SchemaSnapshot = SchemaSnapshot,
|
|
|
77
90
|
readonly grammarVersion: string;
|
|
78
91
|
/** Exact package entrypoint from which applications import the dialect's `sql` tag. */
|
|
79
92
|
readonly sqlModule: string;
|
|
93
|
+
/** Grammar-owned feature names and their support status. */
|
|
94
|
+
readonly capabilities: DialectCapabilities;
|
|
80
95
|
readonly defaultTypePolicy: Policy;
|
|
81
96
|
placeholder(index: number): string;
|
|
97
|
+
quoteIdentifier(identifier: string): string;
|
|
82
98
|
analyze(sql: string, snapshot: Snapshot, policy?: Policy): DialectAnalysis;
|
|
83
99
|
validateSnapshot(value: unknown): Snapshot;
|
|
84
100
|
}
|
|
@@ -94,7 +110,12 @@ export interface TypedSqlConfig<Snapshot extends SchemaSnapshot = SchemaSnapshot
|
|
|
94
110
|
readonly outDir: string;
|
|
95
111
|
readonly projects?: readonly string[];
|
|
96
112
|
readonly typePolicy?: Policy;
|
|
113
|
+
readonly compiler?: {
|
|
114
|
+
readonly maxStructuralVariants?: number;
|
|
115
|
+
};
|
|
97
116
|
}
|
|
117
|
+
export declare function assertDialectPlugin(value: unknown): asserts value is DialectPlugin;
|
|
98
118
|
export declare function defineConfig<Snapshot extends SchemaSnapshot, Policy>(config: TypedSqlConfig<Snapshot, Policy>): TypedSqlConfig<Snapshot, Policy>;
|
|
99
119
|
export declare function rowTypeLiteral(columns: readonly ResolvedColumn[]): string;
|
|
120
|
+
export declare function parameterTypeLiteral(parameterCount: number, parameters: readonly ResolvedParameter[]): string;
|
|
100
121
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,34 @@
|
|
|
1
|
-
export const DIALECT_CONTRACT_VERSION =
|
|
1
|
+
export const DIALECT_CONTRACT_VERSION = 3;
|
|
2
|
+
function record(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
export function assertDialectPlugin(value) {
|
|
6
|
+
if (!record(value))
|
|
7
|
+
throw new TypeError("typed-sql dialect must be an object");
|
|
8
|
+
if (value.contractVersion !== DIALECT_CONTRACT_VERSION) {
|
|
9
|
+
throw new TypeError(`Unsupported typed-sql dialect contract ${String(value.contractVersion)}`);
|
|
10
|
+
}
|
|
11
|
+
for (const property of ["id", "grammarVersion", "sqlModule"]) {
|
|
12
|
+
if (typeof value[property] !== "string" || value[property].length === 0) {
|
|
13
|
+
throw new TypeError(`typed-sql dialect.${property} must be a non-empty string`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (!("defaultTypePolicy" in value))
|
|
17
|
+
throw new TypeError("typed-sql dialect.defaultTypePolicy is required");
|
|
18
|
+
if (!record(value.capabilities) ||
|
|
19
|
+
Object.values(value.capabilities).some((supported) => typeof supported !== "boolean")) {
|
|
20
|
+
throw new TypeError("typed-sql dialect.capabilities must contain only boolean feature declarations");
|
|
21
|
+
}
|
|
22
|
+
for (const method of ["placeholder", "quoteIdentifier", "analyze", "validateSnapshot"]) {
|
|
23
|
+
if (typeof value[method] !== "function")
|
|
24
|
+
throw new TypeError(`typed-sql dialect.${method} must be a function`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
2
27
|
export function defineConfig(config) {
|
|
3
|
-
|
|
4
|
-
|
|
28
|
+
assertDialectPlugin(config.dialect);
|
|
29
|
+
const maximum = config.compiler?.maxStructuralVariants;
|
|
30
|
+
if (maximum !== undefined && (!Number.isSafeInteger(maximum) || maximum < 1)) {
|
|
31
|
+
throw new TypeError("compiler.maxStructuralVariants must be a positive safe integer");
|
|
5
32
|
}
|
|
6
33
|
return Object.freeze(config);
|
|
7
34
|
}
|
|
@@ -9,4 +36,16 @@ export function rowTypeLiteral(columns) {
|
|
|
9
36
|
const properties = columns.map((column) => `${JSON.stringify(column.name)}: ${column.tsType}${column.nullable ? " | null" : ""};`);
|
|
10
37
|
return `{ ${properties.join(" ")} }`;
|
|
11
38
|
}
|
|
39
|
+
export function parameterTypeLiteral(parameterCount, parameters) {
|
|
40
|
+
const byIndex = new Map(parameters.map((parameter) => [parameter.index, parameter]));
|
|
41
|
+
const elements = Array.from({ length: parameterCount }, (_, offset) => {
|
|
42
|
+
const parameter = byIndex.get(offset + 1);
|
|
43
|
+
if (!parameter)
|
|
44
|
+
return "unknown";
|
|
45
|
+
if (parameter.tsType === "unknown")
|
|
46
|
+
return "unknown";
|
|
47
|
+
return `${parameter.tsType}${parameter.nullable ? " | null" : ""}`;
|
|
48
|
+
});
|
|
49
|
+
return `readonly [${elements.join(", ")}]`;
|
|
50
|
+
}
|
|
12
51
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typed-sql/core",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"description": "Driver- and dialect-neutral typed SQL query contracts.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Lojhan",
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
"publishConfig": {
|
|
28
28
|
"access": "public"
|
|
29
29
|
},
|
|
30
|
+
"typedSql": {
|
|
31
|
+
"releaseTrack": "stable"
|
|
32
|
+
},
|
|
30
33
|
"sideEffects": false,
|
|
31
34
|
"type": "module",
|
|
32
35
|
"exports": {
|