@syncular/typegen 0.5.0 → 0.6.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 (47) hide show
  1. package/README.md +75 -33
  2. package/dist/cli.js +43 -17
  3. package/dist/emit-queries-dart.js +167 -55
  4. package/dist/emit-queries-kotlin.js +166 -55
  5. package/dist/emit-queries-swift.js +182 -57
  6. package/dist/emit-queries.js +289 -123
  7. package/dist/fmt.d.ts +2 -2
  8. package/dist/fmt.js +323 -316
  9. package/dist/generate.d.ts +1 -1
  10. package/dist/generate.js +28 -9
  11. package/dist/index.d.ts +3 -1
  12. package/dist/index.js +3 -1
  13. package/dist/lsp.d.ts +1 -3
  14. package/dist/lsp.js +359 -185
  15. package/dist/manifest.d.ts +1 -3
  16. package/dist/manifest.js +1 -1
  17. package/dist/query-ir.js +53 -42
  18. package/dist/query.d.ts +115 -63
  19. package/dist/query.js +60 -11
  20. package/dist/syql-lexer.d.ts +2 -0
  21. package/dist/syql-lexer.js +9 -2
  22. package/dist/syql-lowering.d.ts +22 -0
  23. package/dist/syql-lowering.js +411 -0
  24. package/dist/syql-semantics.d.ts +76 -0
  25. package/dist/syql-semantics.js +551 -0
  26. package/dist/syql-validator.d.ts +35 -0
  27. package/dist/syql-validator.js +966 -0
  28. package/package.json +3 -3
  29. package/src/cli.ts +51 -21
  30. package/src/emit-queries-dart.ts +195 -69
  31. package/src/emit-queries-kotlin.ts +197 -69
  32. package/src/emit-queries-swift.ts +224 -68
  33. package/src/emit-queries.ts +413 -165
  34. package/src/fmt.ts +377 -303
  35. package/src/generate.ts +43 -9
  36. package/src/index.ts +3 -1
  37. package/src/lsp.ts +425 -215
  38. package/src/manifest.ts +2 -4
  39. package/src/query-ir.ts +52 -42
  40. package/src/query.ts +199 -79
  41. package/src/syql-lexer.ts +12 -1
  42. package/src/syql-lowering.ts +638 -0
  43. package/src/syql-semantics.ts +859 -0
  44. package/src/syql-validator.ts +1492 -0
  45. package/dist/syql.d.ts +0 -102
  46. package/dist/syql.js +0 -1141
  47. package/src/syql.ts +0 -1470
@@ -37,7 +37,7 @@ export declare function makeQueryDb(ir: IrDocument): {
37
37
  close: () => void;
38
38
  };
39
39
  /** Analyze every query file against the IR (SELECT-only, typed, deps). */
40
- export declare function analyzeQueries(ir: IrDocument, queries: readonly QueryInput[], naming?: QueryNamingOptions): AnalyzedQuery[];
40
+ export declare function analyzeQueries(ir: IrDocument, queries: readonly QueryInput[], naming?: QueryNamingOptions, queriesRoot?: string): AnalyzedQuery[];
41
41
  /** One generated artifact: an absolute output path and its exact bytes. */
42
42
  export interface GeneratedOutput {
43
43
  readonly path: string;
package/dist/generate.js CHANGED
@@ -20,7 +20,10 @@ import { buildNamingMap } from './naming.js';
20
20
  import { analyzeQueryFile, synthesizeDdl, } from './query.js';
21
21
  import { serializeQueryIr } from './query-ir.js';
22
22
  import { applyMigrationSql } from './sql.js';
23
- import { analyzeSyqlFile } from './syql.js';
23
+ import { lowerSyqlQuery } from './syql-lowering.js';
24
+ import { buildSyqlModuleGraph } from './syql-modules.js';
25
+ import { analyzeSyqlSemantics } from './syql-semantics.js';
26
+ import { validateSyqlProgram } from './syql-validator.js';
24
27
  /** Same grammar the server compiles (§3.1): `prefix:{variable}`. */
25
28
  const PATTERN_RE = /^([^{}]+):\{([^{}:]+)\}$/;
26
29
  /** Whole-value placeholder: `{paramName}`. */
@@ -266,17 +269,33 @@ export function makeQueryDb(ir) {
266
269
  return { db, close: () => sqlite.close() };
267
270
  }
268
271
  /** Analyze every query file against the IR (SELECT-only, typed, deps). */
269
- export function analyzeQueries(ir, queries, naming) {
272
+ export function analyzeQueries(ir, queries, naming, queriesRoot = resolve('/__syncular_queries__')) {
270
273
  if (queries.length === 0)
271
274
  return [];
272
275
  const { db, close } = makeQueryDb(ir);
273
276
  try {
274
- // Each file may hold multiple statements; flatten in path order (stable).
275
- // Frontends dispatch on extension; both produce the same AnalyzedQuery
276
- // shape (§1 nothing downstream knows the frontend).
277
- const analyzed = queries.flatMap((q) => q.file.endsWith('.syql')
278
- ? analyzeSyqlFile(q.file, q.sql, ir, db, naming)
279
- : analyzeQueryFile(q.file, q.sql, ir, db, naming));
277
+ const plain = queries
278
+ .filter((query) => query.file.endsWith('.sql'))
279
+ .flatMap((query) => analyzeQueryFile(query.file, query.sql, ir, db, naming));
280
+ const syqlInputs = queries.filter((query) => query.file.endsWith('.syql'));
281
+ let syql = [];
282
+ if (syqlInputs.length > 0) {
283
+ const root = resolve(queriesRoot);
284
+ const sourceByFile = new Map(syqlInputs.map((query) => [resolve(root, query.file), query.sql]));
285
+ const displayByFile = new Map(syqlInputs.map((query) => [resolve(root, query.file), query.file]));
286
+ const graph = buildSyqlModuleGraph(root, syqlInputs.map((query) => query.file), (file) => sourceByFile.get(file));
287
+ const validated = validateSyqlProgram(analyzeSyqlSemantics(graph), ir, db, naming);
288
+ syql = validated.queries
289
+ .map((query) => {
290
+ const lowered = lowerSyqlQuery(query, ir, db, naming).analysis;
291
+ return {
292
+ ...lowered,
293
+ file: displayByFile.get(query.logical.module.file) ?? lowered.file,
294
+ };
295
+ })
296
+ .sort((left, right) => left.file.localeCompare(right.file));
297
+ }
298
+ const analyzed = [...plain, ...syql];
280
299
  // Names must be unique across the whole manifest — the filesystem no longer
281
300
  // guarantees uniqueness once `-- name:` overrides exist. Report BOTH source
282
301
  // locations (file + statement position) on a collision.
@@ -348,7 +367,7 @@ export function generate(manifestDir) {
348
367
  kotlin?.queriesPath !== undefined ||
349
368
  dart?.queriesPath !== undefined;
350
369
  const analyzedQueries = wantsQueries
351
- ? analyzeQueries(ir, loadQueries(resolve(manifestDir, manifest.queries)), naming)
370
+ ? analyzeQueries(ir, loadQueries(resolve(manifestDir, manifest.queries)), naming, resolve(manifestDir, manifest.queries))
352
371
  : [];
353
372
  if (wantsQueries && analyzedQueries.length === 0) {
354
373
  throw new TypegenError(resolve(manifestDir, manifest.queries), `an output requests named queries but no .sql files were found in ${manifest.queries} — add a query file or drop the queries output`);
package/dist/index.d.ts CHANGED
@@ -22,9 +22,11 @@ export * from './naming.js';
22
22
  export * from './query.js';
23
23
  export * from './query-ir.js';
24
24
  export * from './sql.js';
25
- export * from './syql.js';
26
25
  export * from './syql-ast.js';
27
26
  export * from './syql-lexer.js';
27
+ export * from './syql-lowering.js';
28
28
  export * from './syql-modules.js';
29
29
  export * from './syql-parser.js';
30
+ export * from './syql-semantics.js';
30
31
  export * from './syql-template-parser.js';
32
+ export * from './syql-validator.js';
package/dist/index.js CHANGED
@@ -22,9 +22,11 @@ export * from './naming.js';
22
22
  export * from './query.js';
23
23
  export * from './query-ir.js';
24
24
  export * from './sql.js';
25
- export * from './syql.js';
26
25
  export * from './syql-ast.js';
27
26
  export * from './syql-lexer.js';
27
+ export * from './syql-lowering.js';
28
28
  export * from './syql-modules.js';
29
29
  export * from './syql-parser.js';
30
+ export * from './syql-semantics.js';
30
31
  export * from './syql-template-parser.js';
32
+ export * from './syql-validator.js';
package/dist/lsp.d.ts CHANGED
@@ -11,10 +11,8 @@ export interface RpcMessage {
11
11
  }
12
12
  export declare class SyqlLanguageServer {
13
13
  #private;
14
- /** Handle one incoming message; returns the outgoing messages. */
15
14
  handle(message: RpcMessage): RpcMessage[];
16
- /** Reset cached manifest contexts (e.g. after schema edits). */
17
15
  invalidateProjects(): void;
18
16
  }
19
- /** Run the language server over stdio until `exit`. */
17
+ /** Run the LSP over Content-Length-framed JSON-RPC stdio. */
20
18
  export declare function runLspStdio(): Promise<void>;