@typesql/core 0.1.1 → 0.2.0

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 (172) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +10 -2
  3. package/dist/cache/discover.d.ts +41 -0
  4. package/dist/cache/discover.d.ts.map +1 -0
  5. package/dist/cache/discover.js +153 -0
  6. package/dist/cache/discover.js.map +1 -0
  7. package/dist/cache/format.d.ts +90 -0
  8. package/dist/cache/format.d.ts.map +1 -0
  9. package/dist/cache/format.js +94 -0
  10. package/dist/cache/format.js.map +1 -0
  11. package/dist/cache/job.d.ts +70 -0
  12. package/dist/cache/job.d.ts.map +1 -0
  13. package/dist/cache/job.js +707 -0
  14. package/dist/cache/job.js.map +1 -0
  15. package/dist/cache/mapper.d.ts +19 -0
  16. package/dist/cache/mapper.d.ts.map +1 -0
  17. package/dist/cache/mapper.js +120 -0
  18. package/dist/cache/mapper.js.map +1 -0
  19. package/dist/cache/print.d.ts +46 -0
  20. package/dist/cache/print.d.ts.map +1 -0
  21. package/dist/cache/print.js +156 -0
  22. package/dist/cache/print.js.map +1 -0
  23. package/dist/cache/rpc.d.ts +20 -0
  24. package/dist/cache/rpc.d.ts.map +1 -0
  25. package/dist/cache/rpc.js +77 -0
  26. package/dist/cache/rpc.js.map +1 -0
  27. package/dist/cache/scan.d.ts +15 -0
  28. package/dist/cache/scan.d.ts.map +1 -0
  29. package/dist/cache/scan.js +106 -0
  30. package/dist/cache/scan.js.map +1 -0
  31. package/dist/cache/store.d.ts +27 -0
  32. package/dist/cache/store.d.ts.map +1 -0
  33. package/dist/cache/store.js +135 -0
  34. package/dist/cache/store.js.map +1 -0
  35. package/dist/create-sql.d.ts +36 -4
  36. package/dist/create-sql.d.ts.map +1 -1
  37. package/dist/create-sql.js +2 -2
  38. package/dist/create-sql.js.map +1 -1
  39. package/dist/engine/ast.d.ts.map +1 -1
  40. package/dist/engine/ast.js.map +1 -1
  41. package/dist/engine/binder/clauses.d.ts.map +1 -1
  42. package/dist/engine/binder/clauses.js.map +1 -1
  43. package/dist/engine/binder/from.d.ts.map +1 -1
  44. package/dist/engine/binder/from.js.map +1 -1
  45. package/dist/engine/binder/narrow.d.ts.map +1 -1
  46. package/dist/engine/binder/narrow.js.map +1 -1
  47. package/dist/engine/binder/resolve.d.ts.map +1 -1
  48. package/dist/engine/binder/resolve.js.map +1 -1
  49. package/dist/engine/cache.d.ts +256 -0
  50. package/dist/engine/cache.d.ts.map +1 -0
  51. package/dist/engine/cache.js +2 -0
  52. package/dist/engine/cache.js.map +1 -0
  53. package/dist/engine/ddl/apply.d.ts +9 -0
  54. package/dist/engine/ddl/apply.d.ts.map +1 -1
  55. package/dist/engine/ddl/apply.js.map +1 -1
  56. package/dist/engine/errors.d.ts.map +1 -1
  57. package/dist/engine/errors.js.map +1 -1
  58. package/dist/engine/infer.d.ts +19 -8
  59. package/dist/engine/infer.d.ts.map +1 -1
  60. package/dist/engine/infer.js.map +1 -1
  61. package/dist/engine/inline.d.ts +12 -6
  62. package/dist/engine/inline.d.ts.map +1 -1
  63. package/dist/engine/inline.js.map +1 -1
  64. package/dist/engine/json.d.ts.map +1 -1
  65. package/dist/engine/json.js.map +1 -1
  66. package/dist/engine/lexer/chars.d.ts.map +1 -1
  67. package/dist/engine/lexer/chars.js.map +1 -1
  68. package/dist/engine/lexer/lex.d.ts.map +1 -1
  69. package/dist/engine/lexer/lex.js.map +1 -1
  70. package/dist/engine/lexer/next.d.ts.map +1 -1
  71. package/dist/engine/lexer/next.js.map +1 -1
  72. package/dist/engine/lexer/tokens.d.ts.map +1 -1
  73. package/dist/engine/lexer/tokens.js.map +1 -1
  74. package/dist/engine/named.d.ts +7 -2
  75. package/dist/engine/named.d.ts.map +1 -1
  76. package/dist/engine/named.js.map +1 -1
  77. package/dist/engine/parser/ddl.d.ts.map +1 -1
  78. package/dist/engine/parser/ddl.js.map +1 -1
  79. package/dist/engine/parser/dml.d.ts.map +1 -1
  80. package/dist/engine/parser/dml.js.map +1 -1
  81. package/dist/engine/parser/expr.d.ts.map +1 -1
  82. package/dist/engine/parser/expr.js.map +1 -1
  83. package/dist/engine/parser/keywords.d.ts.map +1 -1
  84. package/dist/engine/parser/keywords.js.map +1 -1
  85. package/dist/engine/parser/select.d.ts.map +1 -1
  86. package/dist/engine/parser/select.js.map +1 -1
  87. package/dist/engine/parser/stmt.d.ts.map +1 -1
  88. package/dist/engine/parser/stmt.js.map +1 -1
  89. package/dist/engine/parser/typename.d.ts.map +1 -1
  90. package/dist/engine/parser/typename.js.map +1 -1
  91. package/dist/engine/parser/util.d.ts.map +1 -1
  92. package/dist/engine/parser/util.js.map +1 -1
  93. package/dist/engine/project/dml.d.ts.map +1 -1
  94. package/dist/engine/project/dml.js.map +1 -1
  95. package/dist/engine/project/naming.d.ts.map +1 -1
  96. package/dist/engine/project/naming.js.map +1 -1
  97. package/dist/engine/project/select.d.ts.map +1 -1
  98. package/dist/engine/project/select.js.map +1 -1
  99. package/dist/engine/project/stmt.d.ts.map +1 -1
  100. package/dist/engine/project/stmt.js.map +1 -1
  101. package/dist/engine/shape.d.ts.map +1 -1
  102. package/dist/engine/shape.js.map +1 -1
  103. package/dist/engine/splice.d.ts.map +1 -1
  104. package/dist/engine/splice.js.map +1 -1
  105. package/dist/engine/suggest.d.ts +2 -2
  106. package/dist/engine/suggest.d.ts.map +1 -1
  107. package/dist/engine/suggest.js.map +1 -1
  108. package/dist/engine/typer/catalog.d.ts.map +1 -1
  109. package/dist/engine/typer/catalog.js.map +1 -1
  110. package/dist/engine/typer/operators.d.ts.map +1 -1
  111. package/dist/engine/typer/operators.js.map +1 -1
  112. package/dist/engine/typer/params.d.ts.map +1 -1
  113. package/dist/engine/typer/params.js.map +1 -1
  114. package/dist/engine/typer/pg-functions.d.ts.map +1 -1
  115. package/dist/engine/typer/pg-functions.js.map +1 -1
  116. package/dist/engine/typer/typeof.d.ts.map +1 -1
  117. package/dist/engine/typer/typeof.js.map +1 -1
  118. package/dist/engine/types.d.ts.map +1 -1
  119. package/dist/engine/types.js.map +1 -1
  120. package/dist/engine/write.d.ts.map +1 -1
  121. package/dist/engine/write.js.map +1 -1
  122. package/dist/index.d.ts +3 -2
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js.map +1 -1
  125. package/dist/migrations.d.ts.map +1 -1
  126. package/dist/migrations.js.map +1 -1
  127. package/dist/query.d.ts.map +1 -1
  128. package/dist/query.js.map +1 -1
  129. package/dist/row-keys.d.ts.map +1 -1
  130. package/dist/row-keys.js.map +1 -1
  131. package/dist/runtime/inline.d.ts.map +1 -1
  132. package/dist/runtime/inline.js.map +1 -1
  133. package/dist/runtime/json.d.ts.map +1 -1
  134. package/dist/runtime/json.js.map +1 -1
  135. package/dist/runtime/splice.d.ts +5 -0
  136. package/dist/runtime/splice.d.ts.map +1 -1
  137. package/dist/runtime/splice.js +42 -4
  138. package/dist/runtime/splice.js.map +1 -1
  139. package/dist/runtime/write.d.ts.map +1 -1
  140. package/dist/runtime/write.js.map +1 -1
  141. package/dist/schema/column.d.ts.map +1 -1
  142. package/dist/schema/column.js.map +1 -1
  143. package/dist/schema/index.d.ts.map +1 -1
  144. package/dist/schema/index.js.map +1 -1
  145. package/dist/schema/normalize.d.ts.map +1 -1
  146. package/dist/schema/normalize.js.map +1 -1
  147. package/dist/schema/pg-catalog.d.ts.map +1 -1
  148. package/dist/schema/pg-catalog.js.map +1 -1
  149. package/dist/schema/pg-types.d.ts.map +1 -1
  150. package/dist/schema/pg-types.js.map +1 -1
  151. package/dist/transaction.d.ts.map +1 -1
  152. package/dist/transaction.js.map +1 -1
  153. package/dist/type-map/index.d.ts.map +1 -1
  154. package/dist/type-map/index.js.map +1 -1
  155. package/package.json +31 -3
  156. package/src/cache/discover.ts +191 -0
  157. package/src/cache/format.ts +157 -0
  158. package/src/cache/job.ts +683 -0
  159. package/src/cache/mapper.ts +133 -0
  160. package/src/cache/print.ts +159 -0
  161. package/src/cache/rpc.ts +79 -0
  162. package/src/cache/scan.ts +100 -0
  163. package/src/cache/store.ts +130 -0
  164. package/src/create-sql.ts +42 -5
  165. package/src/engine/cache.ts +244 -0
  166. package/src/engine/ddl/apply.ts +6 -0
  167. package/src/engine/infer.ts +18 -8
  168. package/src/engine/inline.ts +24 -11
  169. package/src/engine/named.ts +18 -8
  170. package/src/engine/suggest.ts +2 -2
  171. package/src/index.ts +3 -2
  172. package/src/runtime/splice.ts +45 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @typesql/core
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - An optional type cache: with TypeScript 7.1, list `@typesql/core` under `contentMappers` in tsconfig and add a `.typesqlcache` file, and a background job keeps it filled with query, call and DDL results that the checker uses instead of computing them again, only while everything they were computed from is unchanged (500 queries: 2.6 s of check time without, 0.13 s with). See the "Type cache" guide.
8
+
9
+ - Requires TypeScript 7.1 or later (7.1.0-beta works), declared as a peer dependency.
10
+
11
+ ### Patch Changes
12
+
13
+ - Type-checking a query costs a little less: the scans for `$n`, `:name` and quoted text at the call site do less work.
14
+
15
+ - Building a query with `:name` parameters or `{slot}` fragments takes about half as long: the text rewrites are remembered per statement.
16
+
17
+ ## 0.1.2
18
+
19
+ ### Patch Changes
20
+
21
+ - npm package pages link to the documentation site and the issue tracker, and list keywords.
22
+
23
+ - READMEs link to an example in the TypeScript Playground.
24
+
3
25
  ## 0.1.1
4
26
 
5
27
  ### Patch Changes
package/README.md CHANGED
@@ -9,6 +9,8 @@ dependencies.
9
9
  pnpm add @typesql/core
10
10
  ```
11
11
 
12
+ [Open an example in the TypeScript Playground](https://www.typescriptlang.org/play/#code/PTAEBUE8AcFMGUCKAZAXKACgewM4BcBzAJ1h1CWQBpRoBDInWAE1ACNIIYEBjIgS2h4A5GTxdQOSPlgBbAHSgAokz55QeABaxyKULQB2LDVgBusIuq3quOVACgQoIlgDuZAyzpFaM2HnNkAGZYADYhrtQeoDJ8+LQA1qR6JKDcWDLQfCHa5s4MoFj6ltr4-PoEcnZ8GVhEagDeqSS0-vAAjiHUYnCgAMKhXeIA4rD65i3Mgz0AcgCuYbSs2VPaGPQ+OFBwK6AASq5b2gC+oIHOMqAARAAC3aQdwGkklwDcdlX6-kSBtNzaACIAIVA9TsoFAs0YDHQoPB4L4THQIzG3n8TAAPJc+J8ACyXAB8L1Ajg0tHcoCYsB+8zw6Cwgj4hVoIQKRQAktN4IpduAwXDZLQsuh+iFMf4AB54AlvOEU2LQEK0SAAfX0Plg6DmCyWsDFsEl0r54N4sAmTGVLSRo3GaLF1VIeB8ggAXobwUcZTRcHhbCCjaAEVaUWbMdi8AAON1w2izTS1ZWBvqhUO4qPgvCqbLC5OXCVSwn+1hYJiQTXzRU6vUGgvut5Hd5pfT4CQdUAAXiaptaHXRQPxAAoAJRvBxgZCKABi4FAACkAPIc6IJJKabT8AgaNQ4BHafTlxbZIkAEgAjOpl2RVKJxGd0hC5AjKo3m212y2Qv2AAZc8e9aezB8mGoACBSyahoDkDM8Gyf1ZTg8EJ12OcAFkIShMhZlAccp1nBdpi9fAyGgUA53wiCYzjIgExYDsAIRWD4NlAB1AAJblFHvBE31PT9qAAdmHOw7j2Vw332FxDnRO4sECUA2gLRxwQAPQAfiE8Q1m8GQyA7TSNkk6TZPkt5FNAVT3kcABBAhiFgAgJncQxUlCWYZCKNVfCCUJwhcTBvVs300lmT5+wAKkHANL0+cNIgkPAygICFDHMUB9GLWAAFpoH8kgcCfQpmziH03xwDovx-RQ-z0WNjCohFqCCkLwuoGRaHFfsoOyCLLPgUBFX8ZtEJQgjiqGJCAFUMFAQEAE1qso6jP0E4T4EdYqO3EgyuBkuKWhwBSwGUtTR1ANl9BCbFtBMZlZiSegSlGNQyVAI8ii8dUvkclhuC0bhEhYWh7OxZsXC0FJVw4e60OYfKmzUUCWQ7S5aCYWhrn1J1sjkNIZFeOxnzUE0zRKsrPw5LkeVO6ZwDnaH8n7BGIoANUs5BxsUXr+yPepSpCOR3pkBnWqyQcjgi3ZFHAcbdmmDkhgDIDOzNC08CWt5hN6Zo0TEg4uCk7bZKJtEDrhcyTuQ2JHUSdwUhxzJslAXJajIQpih0ZA4oShQJz4cVihkexefKxRf2nfRfFAIbUMhAI1eJMAnaIdA0hCVyikucPYEuCksCSNL4fFS27CDsnOW5acORpkayA6zNYGZ1n2c509B14q4WNgMIsEuYd48dog8nQCjauoyLQGmOdp2mcbkA9qJSTINKKSpGMQjwOwgA) <!-- playground:core --> to hover the types and edit the SQL, with nothing to install.
13
+
12
14
  Add the adapter for your driver to run queries: [`@typesql/pg`](https://www.npmjs.com/package/@typesql/pg)
13
15
  (node-postgres) or [`@typesql/postgres`](https://www.npmjs.com/package/@typesql/postgres)
14
16
  (postgres.js). Already describing your database for an ORM? `@typesql/kysely`,
@@ -100,11 +102,17 @@ opt-in slice: `createSql<DB & PgCatalog>()`.
100
102
 
101
103
  ## Requirements
102
104
 
103
- TypeScript 7 (the native compiler) and Node.js 26 or later. PostgreSQL semantics only.
105
+ TypeScript 7.1 or later (the native compiler; `7.1.0-beta` works) and Node.js 26 or later.
106
+ PostgreSQL semantics only.
107
+
108
+ Optionally, a [type cache](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/guide/caching.md)
109
+ file, which TypeScript 7.1's content mappers let this package serve and keep up to date, saves
110
+ recomputing query types on every `tsc` run and every edit.
104
111
 
105
112
  ## Documentation
106
113
 
107
114
  [Guide](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/guide/getting-started.md) ·
108
115
  [API reference](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/reference/api.md) ·
109
116
  [DDL support](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/reference/ddl.md) ·
110
- [Errors and limits](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/guide/errors-and-limits.md)
117
+ [Errors and limits](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/guide/errors-and-limits.md) ·
118
+ [Type cache](https://github.com/ismailkarsli/typesql/blob/main/packages/docs/guide/caching.md)
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Finds the statements of a program: `sql(…)` calls (the callee is core's `Sql` or
3
+ * `TransactionalSql`, whatever it is named locally) and `migrations().add(…)` steps. Only the
4
+ * callee, the receiver and the first arguments are typed, not the call: discovering 500
5
+ * queries takes milliseconds and analyses none of them.
6
+ */
7
+ import type { Checker, Program, Type } from "typescript/async";
8
+ /** SyntaxKind values (typescript/ast), passed in so this module loads nothing at runtime. */
9
+ export interface Kinds {
10
+ readonly CallExpression: number;
11
+ readonly PropertyAccessExpression: number;
12
+ readonly TypeReference: number;
13
+ readonly LiteralType: number;
14
+ readonly StringLiteral: number;
15
+ readonly TypeAliasDeclaration: number;
16
+ }
17
+ export interface SqlSite {
18
+ /** The query literal (with `:name` and `${sql.param()}` markers as written). */
19
+ readonly key: string;
20
+ readonly db: Type;
21
+ readonly tm: Type;
22
+ readonly keys: Type;
23
+ /** The slot object's type for `sql("… {slot} …", { slot })`, else null. */
24
+ readonly slots: Type | null;
25
+ }
26
+ /** A statement written as a type: `RowOf<DB, TM, "SELECT …">`, or a literal argument of the project's own alias. */
27
+ export interface TypeSite {
28
+ readonly key: string;
29
+ readonly db: Type;
30
+ }
31
+ export interface DdlSite {
32
+ readonly key: string;
33
+ /** The schema before the step (`Migrations<DB>`'s `DB`). */
34
+ readonly db: Type;
35
+ }
36
+ export declare function discover(program: Program, checker: Checker, kinds: Kinds, isCorePath: (path: string) => boolean, include: (fileName: string) => boolean): Promise<{
37
+ sql: SqlSite[];
38
+ types: TypeSite[];
39
+ ddl: DdlSite[];
40
+ }>;
41
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sources":["../../src/cache/discover.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAsB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGnF,6FAA6F;AAC7F,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,OAAO;IACtB,gFAAgF;IAChF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;CAC7B;AAED,oHAAoH;AACpH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB;AASD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EACrC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GACrC,OAAO,CAAC;IAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CA6EhE"}
@@ -0,0 +1,153 @@
1
+ const SLOT = /\{[A-Za-z_][A-Za-z0-9_]*\}/;
2
+ /** Core aliases taking `(DB, …, Q)`: the index of `Q`. */
3
+ const QUERY_ALIASES = { RowOf: 2, ParamsOf: 2, ArgsOf: 2, ParamsArgs: 2, Validate: 1, KindOf: 1, NamesOf: 1, Analysis: 1 };
4
+ const DDL_ALIASES = { ApplyDdl: 1, ValidateDdl: 1 };
5
+ const LOOKS_LIKE_QUERY = /^\s*(\(\s*)*(select|with|insert|update|delete|values|table)\b/i;
6
+ const LOOKS_LIKE_DDL = /^\s*(create|alter|drop|comment)\b/i;
7
+ export async function discover(program, checker, kinds, isCorePath, include) {
8
+ const sql = [];
9
+ const types = [];
10
+ const ddl = [];
11
+ const aliasMemo = new Map();
12
+ for (const fileName of await program.getSourceFileNames()) {
13
+ if (!include(fileName))
14
+ continue;
15
+ const sf = await program.getSourceFile(fileName);
16
+ if (!sf)
17
+ continue;
18
+ const { calls, refs } = nodesIn(sf, kinds);
19
+ if (!calls.length && !refs.length)
20
+ continue;
21
+ /** `DB` types this file uses, for literals passed to the project's own aliases. */
22
+ const fileDbs = new Map();
23
+ const loose = [];
24
+ // statements written as types
25
+ const syms = refs.length ? await checker.getSymbolAtLocation(refs.map((r) => r.typeName)) : [];
26
+ await Promise.all(refs.map(async (r, i) => {
27
+ let sym = syms[i];
28
+ if (sym && sym.flags & 2097152 /* SymbolFlags.Alias */)
29
+ sym = await checker.getAliasedSymbol(sym);
30
+ const args = r.typeArguments ?? [];
31
+ const isCore = !!sym && sym.declarations.some((d) => isCorePath(d.path));
32
+ const qAt = isCore ? (QUERY_ALIASES[sym.name] ?? DDL_ALIASES[sym.name]) : undefined;
33
+ if (qAt !== undefined && args[0] && args[qAt]) {
34
+ const db = await checker.getTypeFromTypeNode(args[0]);
35
+ fileDbs.set(db.id, db);
36
+ const key = literalOf(args[qAt], kinds);
37
+ if (key === null)
38
+ return;
39
+ (sym.name in DDL_ALIASES ? ddl : types).push({ key, db });
40
+ return;
41
+ }
42
+ // the project's own alias of a core one: `type Row<Q extends string> = RowOf<DB, TM, Q>`
43
+ const wrapped = sym && !isCore ? await wrappedCoreAlias(sym, program, checker, kinds, isCorePath, aliasMemo) : null;
44
+ if (wrapped) {
45
+ const key = args[wrapped.param] ? literalOf(args[wrapped.param], kinds) : null;
46
+ if (key !== null)
47
+ (wrapped.ddl ? ddl : types).push({ key, db: wrapped.db });
48
+ }
49
+ else if (!isCore) {
50
+ for (const a of args) {
51
+ const key = literalOf(a, kinds);
52
+ if (key !== null && (LOOKS_LIKE_QUERY.test(key) || LOOKS_LIKE_DDL.test(key)))
53
+ loose.push(key);
54
+ }
55
+ }
56
+ }));
57
+ // migration steps: the receiver is core's Migrations<DB>
58
+ const adds = calls.filter((c) => c.expression.kind === kinds.PropertyAccessExpression && c.expression.name.text === "add");
59
+ if (adds.length) {
60
+ const receivers = await checker.getTypeAtLocation(adds.map((c) => c.expression.expression));
61
+ const args = await checker.getTypeAtLocation(adds.map((c) => c.arguments[0]));
62
+ await Promise.all(adds.map(async (_, i) => {
63
+ const r = receivers[i];
64
+ const a = args[i];
65
+ if (!a.isStringLiteralType() || !(await isCoreRef(r, ["Migrations"], isCorePath)))
66
+ return;
67
+ const [db] = await checker.getTypeArguments(r);
68
+ if (db)
69
+ ddl.push({ key: a.value, db });
70
+ }));
71
+ }
72
+ // sql(…) calls: the callee is core's Sql or TransactionalSql
73
+ const others = calls.filter((c) => !adds.includes(c));
74
+ const callees = others.length ? await checker.getTypeAtLocation(others.map((c) => c.expression)) : [];
75
+ const hits = (await Promise.all(others.map((_, i) => isCoreRef(callees[i], ["Sql", "TransactionalSql"], isCorePath).then((ok) => (ok ? i : -1))))).filter((i) => i >= 0);
76
+ const firstArgs = hits.length ? await checker.getTypeAtLocation(hits.map((i) => others[i].arguments[0])) : [];
77
+ await Promise.all(hits.map(async (i, k) => {
78
+ const [db, tm, keys] = await checker.getTypeArguments(callees[i]);
79
+ if (!db || !tm || !keys)
80
+ return;
81
+ fileDbs.set(db.id, db);
82
+ const a = firstArgs[k];
83
+ if (!a.isStringLiteralType())
84
+ return;
85
+ const call = others[i];
86
+ const slots = SLOT.test(a.value) && call.arguments.length > 1 ? await checker.getTypeAtLocation(call.arguments[1]) : null;
87
+ sql.push({ key: a.value, db, tm, keys, slots });
88
+ }));
89
+ for (const key of loose)
90
+ for (const db of fileDbs.values())
91
+ (LOOKS_LIKE_DDL.test(key) ? ddl : types).push({ key, db });
92
+ }
93
+ return { sql, types, ddl };
94
+ }
95
+ /** For `type R<Q> = RowOf<DB, TM, Q>` (or `ApplyDdl<DB, Q>`, …): which parameter is the text, and the `DB`. */
96
+ function wrappedCoreAlias(sym, program, checker, kinds, isCorePath, memo) {
97
+ let found = memo.get(sym.id);
98
+ if (!found) {
99
+ found = (async () => {
100
+ const handle = sym.declarations[0];
101
+ if (!handle || handle.kind !== kinds.TypeAliasDeclaration)
102
+ return null;
103
+ const decl = (await handle.resolve(program.getProject()));
104
+ const body = decl?.type;
105
+ if (!decl || !body || body.kind !== kinds.TypeReference)
106
+ return null;
107
+ const ref = body;
108
+ let target = await checker.getSymbolAtLocation(ref.typeName);
109
+ if (target && target.flags & 2097152)
110
+ target = await checker.getAliasedSymbol(target);
111
+ if (!target || !target.declarations.some((d) => isCorePath(d.path)))
112
+ return null;
113
+ const qAt = QUERY_ALIASES[target.name] ?? DDL_ALIASES[target.name];
114
+ const qArg = qAt === undefined ? undefined : ref.typeArguments?.[qAt];
115
+ const dbArg = ref.typeArguments?.[0];
116
+ if (!qArg || !dbArg || qArg.kind !== kinds.TypeReference)
117
+ return null;
118
+ const qName = qArg.typeName.text;
119
+ const param = decl.typeParameters?.findIndex((tp) => tp.name.text === qName) ?? -1;
120
+ if (param < 0)
121
+ return null;
122
+ return { param, db: await checker.getTypeFromTypeNode(dbArg), ddl: target.name in DDL_ALIASES };
123
+ })();
124
+ memo.set(sym.id, found);
125
+ }
126
+ return found;
127
+ }
128
+ function literalOf(node, kinds) {
129
+ if (node.kind !== kinds.LiteralType)
130
+ return null;
131
+ const lit = node.literal;
132
+ return lit.kind === kinds.StringLiteral ? lit.text : null;
133
+ }
134
+ function nodesIn(sf, kinds) {
135
+ const calls = [];
136
+ const refs = [];
137
+ const walk = (n) => {
138
+ if (n.kind === kinds.CallExpression && n.arguments.length > 0)
139
+ calls.push(n);
140
+ else if (n.kind === kinds.TypeReference && n.typeArguments?.some((a) => literalOf(a, kinds) !== null))
141
+ refs.push(n);
142
+ n.forEachChild(walk);
143
+ };
144
+ walk(sf);
145
+ return { calls, refs };
146
+ }
147
+ async function isCoreRef(type, names, isCorePath) {
148
+ if (!type.isTypeReference())
149
+ return false;
150
+ const sym = await type.getSymbol();
151
+ return !!sym && names.includes(sym.name) && sym.declarations.some((d) => isCorePath(d.path));
152
+ }
153
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sources":["../../src/cache/discover.ts"],"names":[],"mappings":"AAyCA,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAC1C,0DAA0D;AAC1D,MAAM,aAAa,GAAwC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAChK,MAAM,WAAW,GAAwC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACzF,MAAM,gBAAgB,GAAG,gEAAgE,CAAC;AAC1F,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAgB,EAChB,OAAgB,EAChB,KAAY,EACZ,UAAqC,EACrC,OAAsC;IAEtC,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC7D,KAAK,MAAM,QAAQ,IAAI,MAAM,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QACjC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,SAAS;QAC5C,mFAAmF;QACnF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,8BAA8B;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,uBAAuB;gBAAE,GAAG,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAClG,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,GAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtF,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAE,EAAE,KAAK,CAAC,CAAC;gBACzC,IAAI,GAAG,KAAK,IAAI;oBAAE,OAAO;gBACzB,CAAC,GAAI,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,yFAAyF;YACzF,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpH,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChF,IAAI,GAAG,KAAK,IAAI;oBAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAChC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;QAEJ,yDAAyD;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,wBAAwB,IAAK,CAAC,CAAC,UAAuC,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QACzJ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,UAAuC,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1H,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gBACnB,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;oBAAE,OAAO;gBAC1F,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAU,CAAC,CAAC;gBACxD,IAAI,EAAE;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;QACN,CAAC;QAED,6DAA6D;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1K,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,CAAC;YAC5E,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;gBAAE,OAAO;YAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE;gBAAE,OAAO;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3H,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,GAAG,IAAI,KAAK;YAAE,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;gBAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACzH,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC;AASD,+GAA+G;AAC/G,SAAS,gBAAgB,CAAC,GAAa,EAAE,OAAgB,EAAE,OAAgB,EAAE,KAAY,EAAE,UAAqC,EAAE,IAA0C;IAC1K,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,oBAAoB;gBAAE,OAAO,IAAI,CAAC;YACvE,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAqC,CAAC;YAC9F,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa;gBAAE,OAAO,IAAI,CAAC;YACrE,MAAM,GAAG,GAAG,IAAyB,CAAC;YACtC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,GAAG,OAAO;gBAAE,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACtF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjF,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa;gBAAE,OAAO,IAAI,CAAC;YACtE,MAAM,KAAK,GAAK,IAA0B,CAAC,QAA8B,CAAC,IAAI,CAAC;YAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnF,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;QAClG,CAAC,CAAC,EAAE,CAAC;QACL,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,KAAY;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,GAAG,GAAI,IAAwB,CAAC,OAAO,CAAC;IAC9C,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC,CAAE,GAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,OAAO,CAAC,EAAc,EAAE,KAAY;IAC3C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,CAAO,EAAQ,EAAE;QAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,cAAc,IAAK,CAAoB,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAmB,CAAC,CAAC;aAC9G,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa,IAAK,CAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAsB,CAAC,CAAC;QAChK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,KAAwB,EAAE,UAAqC;IAClG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACnC,OAAO,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,90 @@
1
+ export declare const FORMAT = 1;
2
+ export interface CacheFile {
3
+ readonly typesqlcache: typeof FORMAT;
4
+ /** `CacheVersion` of the engine that computed the entries. */
5
+ readonly engine: string;
6
+ /** Query entries, grouped by the `DB` type they were computed for (key: hash of that type). */
7
+ readonly groups: {
8
+ readonly [group: string]: Group;
9
+ };
10
+ /** Type map snapshots of call entries (key: hash of the snapshot). */
11
+ readonly maps: {
12
+ readonly [map: string]: string;
13
+ };
14
+ /** DDL steps: script text → one entry per schema it was applied to. */
15
+ readonly ddl: {
16
+ readonly [key: string]: readonly DdlEntry[];
17
+ };
18
+ /**
19
+ * Which projects use each entry: `"<group>\0<key>"` or `"ddl\0<key>"` → tsconfig paths
20
+ * relative to the cache file. An entry no project uses any more is dropped.
21
+ */
22
+ readonly owners: {
23
+ readonly [entry: string]: readonly string[];
24
+ };
25
+ }
26
+ export interface Snapshot {
27
+ /** `DB["$types"]`, `{}` when absent. */
28
+ readonly t: string;
29
+ /** Per word: `[DB[w], DB.pg_catalog[w], DB.$functions[w], FunctionCatalog[w]]`. */
30
+ readonly w: {
31
+ readonly [word: string]: readonly [string, string, string, string];
32
+ };
33
+ /** Per pair `a.b`: `DB[a][b]`. */
34
+ readonly q: {
35
+ readonly [pair: string]: string;
36
+ };
37
+ }
38
+ export interface Group extends Snapshot {
39
+ /** `HintIndex<DB>`. */
40
+ readonly h: string;
41
+ readonly entries: {
42
+ readonly [key: string]: Entry;
43
+ };
44
+ }
45
+ export interface Entry {
46
+ /** Dependencies: words, pairs, `"*"`, `"!h"`. */
47
+ readonly r: readonly string[];
48
+ /** For a call whose literal is not its positional text (`:name`, `${sql.param()}`): the positional text, where its analysis is. */
49
+ readonly t?: string;
50
+ /** `CacheAnalysis<DB, key>`. */
51
+ readonly a?: string;
52
+ /** `CallTypes<DB, TM, Keys, key>`, one per type map and `rowKeys`. */
53
+ readonly c?: readonly CallEntry[];
54
+ }
55
+ export interface CallEntry {
56
+ /** Key in `CacheFile.maps`. */
57
+ readonly m: string;
58
+ /** `rowKeys` (`"preserve"` / `"camelCase"`). */
59
+ readonly k: string;
60
+ readonly g: string;
61
+ readonly p: string;
62
+ readonly q: string;
63
+ }
64
+ export interface DdlEntry {
65
+ readonly d: Snapshot & {
66
+ readonly all?: string;
67
+ };
68
+ readonly r: readonly string[];
69
+ /** Keys set and keys removed (`DdlEffect`), or `e`: the error. */
70
+ readonly s?: string;
71
+ readonly x?: string;
72
+ readonly e?: string;
73
+ }
74
+ export declare const emptyCache: (engine: string) => CacheFile;
75
+ /** The file's content, or `null` when it is not a cache file (`{}`, another format, invalid JSON). */
76
+ export declare function parseCache(text: string): CacheFile | null;
77
+ /** Stable JSON: two writes of the same content are byte-identical, so the editor sees no change. */
78
+ export declare const stringifyCache: (file: CacheFile) => string;
79
+ /** JSON with sorted keys, for comparing values built in different orders. */
80
+ export declare const canonical: (v: unknown) => string;
81
+ export declare const hash: (text: string, length?: number) => string;
82
+ /**
83
+ * The module augmentation the checker sees for a cache file. `id` keeps two cache files in one
84
+ * program apart (engine/cache.ts). Entries of another engine version are left out: they could
85
+ * never be used.
86
+ */
87
+ export declare function render(file: CacheFile | null, id: string, engine: string): string;
88
+ /** Id of a cache file in the augmentation: a hash of its path. */
89
+ export declare const fileId: (fileName: string) => string;
90
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sources":["../../src/cache/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * The `.typesqlcache` file: JSON written by the job (job.ts), turned by the content mapper
4
+ * (mapper.ts) into a module augmentation of `@typesql/core` (engine/cache.ts describes what the
5
+ * checker does with it). Type texts are TypeScript as printed relative to the cache file's
6
+ * directory; `__T` is `@typesql/core`.
7
+ */
8
+ import { createHash } from "node:crypto";
9
+ export const FORMAT = 1;
10
+ export const emptyCache = (engine) => ({ typesqlcache: FORMAT, engine, groups: {}, maps: {}, ddl: {}, owners: {} });
11
+ /** The file's content, or `null` when it is not a cache file (`{}`, another format, invalid JSON). */
12
+ export function parseCache(text) {
13
+ let data;
14
+ try {
15
+ data = JSON.parse(text);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ if (typeof data !== "object" || data === null)
21
+ return null;
22
+ const f = data;
23
+ if (f.typesqlcache !== FORMAT || typeof f.engine !== "string")
24
+ return null;
25
+ return { typesqlcache: FORMAT, engine: f.engine, groups: f.groups ?? {}, maps: f.maps ?? {}, ddl: f.ddl ?? {}, owners: f.owners ?? {} };
26
+ }
27
+ const sorted = (v) => {
28
+ if (Array.isArray(v))
29
+ return v.map(sorted);
30
+ if (v && typeof v === "object")
31
+ return Object.fromEntries(Object.keys(v).sort().map((k) => [k, sorted(v[k])]));
32
+ return v;
33
+ };
34
+ /** Stable JSON: two writes of the same content are byte-identical, so the editor sees no change. */
35
+ export const stringifyCache = (file) => JSON.stringify(sorted(file), null, 1) + "\n";
36
+ /** JSON with sorted keys, for comparing values built in different orders. */
37
+ export const canonical = (v) => JSON.stringify(sorted(v));
38
+ export const hash = (text, length = 12) => createHash("sha256").update(text).digest("hex").slice(0, length);
39
+ const lit = (s) => JSON.stringify(s);
40
+ const union = (xs) => (xs.length ? xs.map(lit).join(" | ") : "never");
41
+ const words = (w) => `{ ${Object.entries(w).map(([k, v]) => `${lit(k)}: readonly [${v.join(", ")}]`).join("; ")} }`;
42
+ const pairs = (q) => `{ ${Object.entries(q).map(([k, v]) => `${lit(k)}: ${v}`).join("; ")} }`;
43
+ /**
44
+ * The module augmentation the checker sees for a cache file. `id` keeps two cache files in one
45
+ * program apart (engine/cache.ts). Entries of another engine version are left out: they could
46
+ * never be used.
47
+ */
48
+ export function render(file, id, engine) {
49
+ const head = `// Generated from a TypeSQL type cache; see https://typesql.karsli.net/guide/caching\nimport type * as __T from "@typesql/core";\nexport {};\n`;
50
+ if (!file || file.engine !== engine)
51
+ return head;
52
+ const out = [head];
53
+ const keys = new Set();
54
+ const snapshots = [];
55
+ const groups = [];
56
+ for (const [g, group] of Object.entries(file.groups)) {
57
+ const entries = Object.entries(group.entries);
58
+ if (!entries.length)
59
+ continue;
60
+ out.push(`type D_${g} = { v: ${lit(file.engine)}; t: ${group.t}; w: ${words(group.w)}; q: ${pairs(group.q)}; h: ${group.h} };\n`);
61
+ snapshots.push(` ${lit(`${id}#${g}`)}: D_${g};`);
62
+ const body = entries.map(([key, e]) => {
63
+ keys.add(key);
64
+ const calls = e.c?.length ? `; c: ${e.c.map((c) => `{ m: M_${c.m}; k: ${c.k}; g: ${c.g}; p: ${c.p}; q: ${c.q} }`).join(" | ")}` : "";
65
+ return ` ${lit(key)}: { r: ${union(e.r)}${e.a ? `; a: ${e.a}` : ""}${calls} };`;
66
+ });
67
+ groups.push(` ${lit(`${id}#${g}`)}: {\n${body.join("\n")}\n };`);
68
+ }
69
+ for (const [m, text] of Object.entries(file.maps))
70
+ out.push(`type M_${m} = ${text};\n`);
71
+ const ddl = Object.entries(file.ddl).filter(([, es]) => es.length);
72
+ const ddlBody = ddl.map(([key, es]) => {
73
+ const variants = es.map((e) => {
74
+ const d = `{ v: ${lit(file.engine)}; t: ${e.d.t}; w: ${words(e.d.w)}; q: ${pairs(e.d.q)}${e.d.all ? `; all: ${e.d.all}` : ""} }`;
75
+ return `{ d: ${d}; r: ${union(e.r)}; ${e.e ? `e: ${e.e}` : `s: ${e.s}; x: ${e.x}`} }`;
76
+ });
77
+ return ` ${lit(key)}: ${variants.join(" | ")};`;
78
+ });
79
+ out.push(`declare module "@typesql/core" {\n`);
80
+ if (keys.size) {
81
+ out.push(` interface QueryCacheKeys {\n${[...keys].map((k) => ` ${lit(k)}: true;`).join("\n")}\n }\n`);
82
+ out.push(` interface CacheSnapshots {\n${snapshots.join("\n")}\n }\n`);
83
+ out.push(` interface QueryCache {\n${groups.join("\n")}\n }\n`);
84
+ }
85
+ if (ddl.length) {
86
+ out.push(` interface DdlCacheKeys {\n${ddl.map(([k]) => ` ${lit(k)}: true;`).join("\n")}\n }\n`);
87
+ out.push(` interface DdlCache {\n ${lit(id)}: {\n${ddlBody.join("\n")}\n };\n }\n`);
88
+ }
89
+ out.push(`}\n`);
90
+ return out.join("");
91
+ }
92
+ /** Id of a cache file in the augmentation: a hash of its path. */
93
+ export const fileId = (fileName) => hash(fileName, 8);
94
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sources":["../../src/cache/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export interface JobOptions {
2
+ /** Absolute tsconfig path. */
3
+ readonly configFile: string;
4
+ /** Absolute path of the cache file to write. */
5
+ readonly cacheFile: string;
6
+ /** `CacheVersion` of the `@typesql/core` this job belongs to. */
7
+ readonly engine: string;
8
+ /** Whether a declaration path belongs to `@typesql/core` (its src or dist). */
9
+ readonly isCorePath: (path: string) => boolean;
10
+ readonly log?: (message: string) => void;
11
+ }
12
+ export interface PassResult {
13
+ readonly statements: number;
14
+ readonly computed: number;
15
+ readonly reused: number;
16
+ readonly dropped: number;
17
+ readonly written: boolean;
18
+ readonly ms: number;
19
+ }
20
+ /** One TypeScript session on one project; `pass()` brings the cache file up to date. */
21
+ export declare class Session {
22
+ private readonly o;
23
+ private ts;
24
+ private api;
25
+ private snapshot;
26
+ private changed;
27
+ private disposed;
28
+ readonly probe: string;
29
+ constructor(o: JobOptions);
30
+ /** Files changed on disk since the last pass (the next pass tells TypeScript). */
31
+ markChanged(files: Iterable<string>): void;
32
+ /** Close the TypeScript session; the next pass opens a new one. */
33
+ close(): Promise<void>;
34
+ /** Close for good: a pass in progress fails at its next request instead of reopening. */
35
+ dispose(): Promise<void>;
36
+ private log;
37
+ /** A program snapshot with `probe` as the probe file's content. */
38
+ private withProbe;
39
+ pass(): Promise<PassResult>;
40
+ }
41
+ /** One pass on a fresh session (tests, the bench): open, pass, close. */
42
+ export declare function generate(options: JobOptions): Promise<PassResult>;
43
+ /**
44
+ * The long-lived job of one project in the content mapper: a pass now, then one after source
45
+ * files change (debounced), until stopped. The TypeScript session closes after `idleMs` without
46
+ * a pass and reopens on the next change.
47
+ */
48
+ export declare class Job {
49
+ private readonly o;
50
+ private readonly session;
51
+ private watcher;
52
+ private timer;
53
+ private idle;
54
+ private running;
55
+ private stopped;
56
+ constructor(o: JobOptions & {
57
+ readonly debounceMs?: number;
58
+ readonly idleMs?: number;
59
+ });
60
+ start(): void;
61
+ private schedule;
62
+ private run;
63
+ /**
64
+ * Stop now: a pass in progress is abandoned (its TypeScript session is closed under it, and it
65
+ * writes nothing, so the file keeps its previous content). `tsc` waits for `closeProject`, so
66
+ * this must not wait for the pass.
67
+ */
68
+ stop(): Promise<void>;
69
+ }
70
+ //# sourceMappingURL=job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.d.ts","sources":["../../src/cache/job.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAiCD,wFAAwF;AACxF,qBAAa,OAAO;IAQN,OAAO,CAAC,QAAQ,CAAC,CAAC;IAP9B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,YAA6B,CAAC,EAAE,UAAU,EAEzC;IAED,kFAAkF;IAClF,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAEzC;IAED,mEAAmE;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;IAED,yFAAyF;IACnF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7B;IAED,OAAO,CAAC,GAAG;IAIX,mEAAmE;YACrD,SAAS;IAsBjB,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAuUhC;CACF;AAaD,yEAAyE;AACzE,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAOvE;AAED;;;;GAIG;AACH,qBAAa,GAAG;IAQF,OAAO,CAAC,QAAQ,CAAC,CAAC;IAP9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,OAAO,CAAS;IAExB,YAA6B,CAAC,EAAE,UAAU,GAAG;QAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAEtG;IAED,KAAK,IAAI,IAAI,CAeZ;IAED,OAAO,CAAC,QAAQ;YAQF,GAAG;IAajB;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1B;CACF"}