firebase-contract 0.1.0-rc.12 → 0.1.0-rc.13

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 (37) hide show
  1. package/README.md +14 -5
  2. package/dist/lib/_internal/generators/support/split.d.ts +1 -1
  3. package/dist/lib/_internal/generators/support/split.js +1 -1
  4. package/dist/lib/_internal/generators/typescript/render.d.ts +15 -0
  5. package/dist/lib/_internal/generators/typescript/render.d.ts.map +1 -0
  6. package/dist/lib/_internal/generators/typescript/render.js +92 -0
  7. package/dist/lib/_internal/generators/typescript/typescript-generator.d.ts +2 -1
  8. package/dist/lib/_internal/generators/typescript/typescript-generator.d.ts.map +1 -1
  9. package/dist/lib/_internal/generators/typescript/typescript-generator.js +5 -75
  10. package/dist/lib/_internal/generators/typescript/typescript-split-generator.d.ts.map +1 -1
  11. package/dist/lib/_internal/generators/typescript/typescript-split-generator.js +2 -82
  12. package/dist/lib/_internal/generators/zod/render.d.ts +12 -0
  13. package/dist/lib/_internal/generators/zod/render.d.ts.map +1 -0
  14. package/dist/lib/_internal/generators/zod/render.js +59 -0
  15. package/dist/lib/_internal/generators/zod/zod-generator.d.ts +2 -1
  16. package/dist/lib/_internal/generators/zod/zod-generator.d.ts.map +1 -1
  17. package/dist/lib/_internal/generators/zod/zod-generator.js +5 -52
  18. package/dist/lib/_internal/generators/zod/zod-split-generator.d.ts.map +1 -1
  19. package/dist/lib/_internal/generators/zod/zod-split-generator.js +2 -54
  20. package/dist/lib/_internal/ir/build-ir.d.ts.map +1 -1
  21. package/dist/lib/_internal/ir/build-ir.js +0 -2
  22. package/dist/lib/_internal/ir/ir.d.ts +0 -1
  23. package/dist/lib/_internal/ir/ir.d.ts.map +1 -1
  24. package/dist/lib/_internal/parser/parse.d.ts +5 -3
  25. package/dist/lib/_internal/parser/parse.d.ts.map +1 -1
  26. package/dist/lib/_internal/parser/parse.js +69 -12
  27. package/dist/lib/_internal/parser/raw-document.d.ts +0 -1
  28. package/dist/lib/_internal/parser/raw-document.d.ts.map +1 -1
  29. package/dist/lib/_internal/resolver/import-resolver.js +1 -1
  30. package/dist/lib/cli/commands/generate.d.ts.map +1 -1
  31. package/dist/lib/cli/commands/generate.js +6 -4
  32. package/dist/lib/cli/commands/init.d.ts.map +1 -1
  33. package/dist/lib/cli/commands/init.js +2 -18
  34. package/dist/lib/cli/config.d.ts +3 -2
  35. package/dist/lib/cli/config.d.ts.map +1 -1
  36. package/dist/lib/cli/config.js +3 -0
  37. package/package.json +1 -1
package/README.md CHANGED
@@ -123,8 +123,9 @@ generators:
123
123
 
124
124
  `fbc generate contract.yml` materializes **all** declared outputs across the
125
125
  whole import graph in one run. Passing `-o`/`-g` switches to single-target mode
126
- (`fbc generate <entry> -o <dir> -g typescript,zod`), and
127
- `firebase-contract.json` (`entry`, `outDir`, `generators`) can hold defaults.
126
+ (`fbc generate <entry> -o <dir> -g typescript,zod`). `firebase-contract.json`
127
+ holds only a default `entry` — output routing lives in the yml `generators:`
128
+ declarations, so a config file can never silently override them.
128
129
 
129
130
 
130
131
  ### Generated-file headers
@@ -193,8 +194,13 @@ firestore module is checked under `fsName ?? name` alongside doc names. A bare
193
194
  type reference therefore always resolves to exactly one definition — use
194
195
  `fbc where <Name>` to find it.
195
196
 
197
+ **Unknown keys are errors.** Every key the parser does not consume is an
198
+ `UNKNOWN_KEY` error (all reported in one pass), never silently dropped — a
199
+ typo like `optionnal:` must not quietly turn into a required field. There is
200
+ no `version:` field: nothing consumes one, so accepting it would only fake a
201
+ compatibility mechanism that does not exist.
202
+
196
203
  ```yaml
197
- version: 1
198
204
  imports:
199
205
  - ./apps/shop/data-connect/schema.yml
200
206
  - some-shared-package/contract.yml
@@ -487,8 +493,11 @@ firestore:
487
493
  ```
488
494
 
489
495
  Emits Zod schemas + inferred types, mirroring a hand-written Firestore schema
490
- library. (The simpler `firestore-types` generator just re-types *every* model
491
- with the Firestore `Timestamp` and does not denormalize.)
496
+ library. (`firestore-types` is the zero-config entry point for projects that
497
+ have not written projections yet: it re-types *every* model with the Firestore
498
+ `Timestamp`, no `firestore:` section needed. Once you declare projections,
499
+ prefer the `firestore` generator — it is the one that understands
500
+ pick/omit/fsName/denormalized fields.)
492
501
 
493
502
  With `firestore` + `split: true`, fields whose Zod chain is **identical** to the Data
494
503
  Connect schema are reused via `.pick()` — only representation changes are
@@ -18,7 +18,7 @@ export declare const collectDeps: (ir: Ir, roots: IrModel[]) => HostedDeps;
18
18
  /**
19
19
  * Assign a unique module basename to every table. Two models may share a
20
20
  * physical table name across services (e.g. both declare
21
- * `reconciliation_operations`); the first keeps the table-derived name and
21
+ * `audit_logs`); the first keeps the table-derived name and
22
22
  * later ones fall back to their model name so files never overwrite each other.
23
23
  */
24
24
  export declare const assignModuleNames: (tables: IrModel[]) => Map<string, string>;
@@ -52,7 +52,7 @@ export const collectDeps = (ir, roots) => {
52
52
  /**
53
53
  * Assign a unique module basename to every table. Two models may share a
54
54
  * physical table name across services (e.g. both declare
55
- * `reconciliation_operations`); the first keeps the table-derived name and
55
+ * `audit_logs`); the first keeps the table-derived name and
56
56
  * later ones fall back to their model name so files never overwrite each other.
57
57
  */
58
58
  export const assignModuleNames = (tables) => {
@@ -0,0 +1,15 @@
1
+ import { Ir, IrEnum, IrField, IrModel, ScalarType } from '../../ir/ir.js';
2
+ /**
3
+ * Rendering shared by the bundled and split TypeScript layouts. Both layouts
4
+ * MUST go through these helpers so a contract setting (valueKeys, nullable,
5
+ * multi-line descriptions, …) means the same thing regardless of layout.
6
+ */
7
+ export declare const SCALAR_TS: Record<ScalarType, string>;
8
+ export declare const JSON_TYPE: string;
9
+ export declare const docLines: (description: string | undefined, indent: string) => string[];
10
+ export declare const renderField: (field: IrField, ir: Ir) => string;
11
+ export declare const renderEnumConst: (irEnum: IrEnum) => string;
12
+ export declare const renderEnumUnion: (irEnum: IrEnum) => string;
13
+ export declare const renderModel: (model: IrModel, ir: Ir) => string;
14
+ export declare const usesJson: (models: IrModel[]) => boolean;
15
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/typescript/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAa,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAIpF;;;;GAIG;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAUhD,CAAA;AAED,eAAO,MAAM,SAAS,QAQV,CAAA;AAcZ,eAAO,MAAM,QAAQ,GAAI,aAAa,MAAM,GAAG,SAAS,EAAE,QAAQ,MAAM,KAAG,MAAM,EAKhF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,IAAI,EAAE,KAAG,MAiBpD,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,MAchD,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,MAIhD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,IAAI,EAAE,KAAG,MAIpD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,EAAE,KAAG,OACiE,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { constantCase, singleQuote } from '../support/naming.js';
2
+ import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
3
+ /**
4
+ * Rendering shared by the bundled and split TypeScript layouts. Both layouts
5
+ * MUST go through these helpers so a contract setting (valueKeys, nullable,
6
+ * multi-line descriptions, …) means the same thing regardless of layout.
7
+ */
8
+ export const SCALAR_TS = {
9
+ string: 'string',
10
+ int: 'number',
11
+ int64: 'number',
12
+ float: 'number',
13
+ boolean: 'boolean',
14
+ timestamp: 'string',
15
+ date: 'string',
16
+ json: 'Json',
17
+ id: 'string',
18
+ };
19
+ export const JSON_TYPE = [
20
+ 'export type Json =',
21
+ ' | string',
22
+ ' | number',
23
+ ' | boolean',
24
+ ' | null',
25
+ ' | Json[]',
26
+ ' | { [key: string]: Json }',
27
+ ].join('\n');
28
+ const renderRef = (ref) => {
29
+ switch (ref.kind) {
30
+ case 'scalar':
31
+ return SCALAR_TS[ref.name];
32
+ case 'enum':
33
+ case 'model':
34
+ return ref.name;
35
+ default:
36
+ return 'unknown';
37
+ }
38
+ };
39
+ export const docLines = (description, indent) => {
40
+ if (!description)
41
+ return [];
42
+ const lines = description.split('\n');
43
+ if (lines.length === 1)
44
+ return [`${indent}/** ${lines[0]} */`];
45
+ return [`${indent}/**`, ...lines.map(line => `${indent} * ${line}`.trimEnd()), `${indent} */`];
46
+ };
47
+ export const renderField = (field, ir) => {
48
+ const optional = field.optional ? '?' : '';
49
+ const doc = docLines(field.description, ' ');
50
+ let entry;
51
+ if (field.literal !== undefined) {
52
+ const type = field.list ? `${singleQuote(field.literal)}[]` : singleQuote(field.literal);
53
+ entry = ` ${field.name}${optional}: ${type}`;
54
+ }
55
+ else if (isRelation(field)) {
56
+ const base = SCALAR_TS[relationFkType(ir, field)];
57
+ entry = ` ${relationFkName(field)}${optional}: ${field.list ? `${base}[]` : base}`;
58
+ }
59
+ else {
60
+ const base = renderRef(field.type);
61
+ const type = field.list ? `${base}[]` : base;
62
+ const nullable = field.nullable ? ' | null' : '';
63
+ entry = ` ${field.name}${optional}: ${type}${nullable}`;
64
+ }
65
+ return [...doc, entry].join('\n');
66
+ };
67
+ export const renderEnumConst = (irEnum) => {
68
+ const doc = docLines(irEnum.description, '');
69
+ const constName = constantCase(irEnum.name);
70
+ const entries = irEnum.values
71
+ .map(value => ` ${irEnum.valueKeys?.[value] ?? constantCase(value)}: ${singleQuote(value)},`)
72
+ .join('\n');
73
+ return [
74
+ ...doc,
75
+ `export const ${constName} = Object.freeze({`,
76
+ entries,
77
+ `} as const)`,
78
+ `export type ${irEnum.name}Key = keyof typeof ${constName}`,
79
+ `export type ${irEnum.name} = (typeof ${constName})[${irEnum.name}Key]`,
80
+ ].join('\n');
81
+ };
82
+ export const renderEnumUnion = (irEnum) => {
83
+ const doc = docLines(irEnum.description, '');
84
+ const union = irEnum.values.map(value => singleQuote(value)).join(' | ') || 'never';
85
+ return [...doc, `export type ${irEnum.name} = ${union}`].join('\n');
86
+ };
87
+ export const renderModel = (model, ir) => {
88
+ const doc = docLines(model.description, '');
89
+ const fields = model.fields.map(field => renderField(field, ir)).join('\n');
90
+ return [...doc, `export interface ${model.name} {`, fields, '}'].join('\n');
91
+ };
92
+ export const usesJson = (models) => models.some(model => model.fields.some(field => field.type.kind === 'scalar' && field.type.name === 'json'));
@@ -12,7 +12,8 @@ export interface TypeScriptGeneratorOptions {
12
12
  * Generates TypeScript types: an interface per model and, per enum, either a
13
13
  * frozen const object (default — runtime values + `Key`/value types) or a
14
14
  * plain string-literal union. This is the highest-priority
15
- * generator and the shape other TS-facing generators reference.
15
+ * generator and the shape other TS-facing generators reference. Rendering is
16
+ * shared with the split layout (./render.js) so both emit identical members.
16
17
  */
17
18
  export declare const createTypeScriptGenerator: (options?: TypeScriptGeneratorOptions) => Generator;
18
19
  //# sourceMappingURL=typescript-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/typescript/typescript-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAQ5E,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAC9B;AA+ED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,UAAS,0BAA+B,KAAG,SA4BpF,CAAA"}
1
+ {"version":3,"file":"typescript-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/typescript/typescript-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAO5E,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAC9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GAAI,UAAS,0BAA+B,KAAG,SA0BpF,CAAA"}
@@ -1,82 +1,14 @@
1
1
  import { headerBlocks } from '../support/header.js';
2
2
  import { withSplitVariant } from '../support/split-variant.js';
3
3
  import { createTypeScriptSplitLayout } from './typescript-split-generator.js';
4
- import { constantCase, singleQuote } from '../support/naming.js';
5
- import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
6
4
  import { outputFile } from '../support/templates.js';
7
- const SCALAR_TS = {
8
- string: 'string',
9
- int: 'number',
10
- int64: 'number',
11
- float: 'number',
12
- boolean: 'boolean',
13
- timestamp: 'string',
14
- date: 'string',
15
- json: 'Json',
16
- id: 'string',
17
- };
18
- const JSON_TYPE = [
19
- 'export type Json =',
20
- ' | string',
21
- ' | number',
22
- ' | boolean',
23
- ' | null',
24
- ' | Json[]',
25
- ' | { [key: string]: Json }',
26
- ].join('\n');
27
- const renderRef = (ref) => {
28
- switch (ref.kind) {
29
- case 'scalar':
30
- return SCALAR_TS[ref.name];
31
- case 'enum':
32
- case 'model':
33
- return ref.name;
34
- default:
35
- return 'unknown';
36
- }
37
- };
38
- const renderFieldType = (field) => {
39
- const base = renderRef(field.type);
40
- return field.list ? `${base}[]` : base;
41
- };
42
- const renderField = (field, ir) => {
43
- const optional = field.optional ? '?' : '';
44
- const doc = field.description ? ` /** ${field.description} */\n` : '';
45
- if (field.literal !== undefined) {
46
- const type = field.list ? `${singleQuote(field.literal)}[]` : singleQuote(field.literal);
47
- return `${doc} ${field.name}${optional}: ${type}`;
48
- }
49
- // Relation: expose the foreign-key id (matching the persisted/projected shape).
50
- if (isRelation(field)) {
51
- const base = SCALAR_TS[relationFkType(ir, field)];
52
- const type = field.list ? `${base}[]` : base;
53
- return `${doc} ${relationFkName(field)}${optional}: ${type}`;
54
- }
55
- return `${doc} ${field.name}${optional}: ${renderFieldType(field)}`;
56
- };
57
- const usesJson = (ir) => ir.models.some(model => model.fields.some(field => field.type.kind === 'scalar' && field.type.name === 'json'));
58
- const renderEnumUnion = (irEnum) => {
59
- const doc = irEnum.description ? `/** ${irEnum.description} */\n` : '';
60
- const union = irEnum.values.map(value => singleQuote(value)).join(' | ') || 'never';
61
- return `${doc}export type ${irEnum.name} = ${union}`;
62
- };
63
- const renderEnumConst = (irEnum) => {
64
- const doc = irEnum.description ? `/** ${irEnum.description} */\n` : '';
65
- const constName = constantCase(irEnum.name);
66
- const entries = irEnum.values.map(value => ` ${constantCase(value)}: ${singleQuote(value)},`).join('\n');
67
- return [
68
- `${doc}export const ${constName} = Object.freeze({`,
69
- entries,
70
- `} as const)`,
71
- `export type ${irEnum.name}Key = keyof typeof ${constName}`,
72
- `export type ${irEnum.name} = (typeof ${constName})[${irEnum.name}Key]`,
73
- ].join('\n');
74
- };
5
+ import { JSON_TYPE, renderEnumConst, renderEnumUnion, renderModel, usesJson } from './render.js';
75
6
  /**
76
7
  * Generates TypeScript types: an interface per model and, per enum, either a
77
8
  * frozen const object (default — runtime values + `Key`/value types) or a
78
9
  * plain string-literal union. This is the highest-priority
79
- * generator and the shape other TS-facing generators reference.
10
+ * generator and the shape other TS-facing generators reference. Rendering is
11
+ * shared with the split layout (./render.js) so both emit identical members.
80
12
  */
81
13
  export const createTypeScriptGenerator = (options = {}) => {
82
14
  const enumStyle = options.enumStyle ?? 'const';
@@ -85,16 +17,14 @@ export const createTypeScriptGenerator = (options = {}) => {
85
17
  description: 'TypeScript interfaces and enum const/union types',
86
18
  generate(ir, context) {
87
19
  const blocks = [...headerBlocks(context)];
88
- if (usesJson(ir)) {
20
+ if (usesJson(ir.models)) {
89
21
  blocks.push(JSON_TYPE);
90
22
  }
91
23
  for (const irEnum of ir.enums) {
92
24
  blocks.push(enumStyle === 'const' ? renderEnumConst(irEnum) : renderEnumUnion(irEnum));
93
25
  }
94
26
  for (const model of ir.models) {
95
- const doc = model.description ? `/** ${model.description} */\n` : '';
96
- const fields = model.fields.map(field => renderField(field, ir)).join('\n');
97
- blocks.push(`${doc}export interface ${model.name} {\n${fields}\n}`);
27
+ blocks.push(renderModel(model, ir));
98
28
  }
99
29
  return [{ path: outputFile(context, 'types.ts'), content: `${blocks.join('\n\n')}\n` }];
100
30
  },
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-split-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/typescript/typescript-split-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AA4F5E;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,QAAO,SA0E7C,CAAA"}
1
+ {"version":3,"file":"typescript-split-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/typescript/typescript-split-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAO5E;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,QAAO,SA0E7C,CAAA"}
@@ -1,89 +1,9 @@
1
1
  import { findEnum, findModel } from '../../ir/ir.js';
2
2
  import { headerBlocks } from '../support/header.js';
3
- import { constantCase, singleQuote } from '../support/naming.js';
4
- import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
3
+ import { isRelation } from '../support/relations.js';
5
4
  import { assignModuleNames, collectDeps, splitGroups } from '../support/split.js';
6
5
  import { outputFile } from '../support/templates.js';
7
- const SCALAR_TS = {
8
- string: 'string',
9
- int: 'number',
10
- int64: 'number',
11
- float: 'number',
12
- boolean: 'boolean',
13
- timestamp: 'string',
14
- date: 'string',
15
- json: 'Json',
16
- id: 'string',
17
- };
18
- const JSON_TYPE = [
19
- 'export type Json =',
20
- ' | string',
21
- ' | number',
22
- ' | boolean',
23
- ' | null',
24
- ' | Json[]',
25
- ' | { [key: string]: Json }',
26
- ].join('\n');
27
- const renderRef = (ref) => {
28
- switch (ref.kind) {
29
- case 'scalar':
30
- return SCALAR_TS[ref.name];
31
- case 'enum':
32
- case 'model':
33
- return ref.name;
34
- default:
35
- return 'unknown';
36
- }
37
- };
38
- const docLines = (description, indent) => {
39
- if (!description)
40
- return [];
41
- const lines = description.split('\n');
42
- if (lines.length === 1)
43
- return [`${indent}/** ${lines[0]} */`];
44
- return [`${indent}/**`, ...lines.map(line => `${indent} * ${line}`.trimEnd()), `${indent} */`];
45
- };
46
- const renderField = (field, ir) => {
47
- const optional = field.optional ? '?' : '';
48
- const doc = docLines(field.description, ' ');
49
- let entry;
50
- if (field.literal !== undefined) {
51
- const type = field.list ? `${singleQuote(field.literal)}[]` : singleQuote(field.literal);
52
- entry = ` ${field.name}${optional}: ${type}`;
53
- }
54
- else if (isRelation(field)) {
55
- const base = SCALAR_TS[relationFkType(ir, field)];
56
- entry = ` ${relationFkName(field)}${optional}: ${field.list ? `${base}[]` : base}`;
57
- }
58
- else {
59
- const base = renderRef(field.type);
60
- const type = field.list ? `${base}[]` : base;
61
- const nullable = field.nullable ? ' | null' : '';
62
- entry = ` ${field.name}${optional}: ${type}${nullable}`;
63
- }
64
- return [...doc, entry].join('\n');
65
- };
66
- const renderEnumConst = (irEnum) => {
67
- const doc = docLines(irEnum.description, '');
68
- const constName = constantCase(irEnum.name);
69
- const entries = irEnum.values
70
- .map(value => ` ${irEnum.valueKeys?.[value] ?? constantCase(value)}: ${singleQuote(value)},`)
71
- .join('\n');
72
- return [
73
- ...doc,
74
- `export const ${constName} = Object.freeze({`,
75
- entries,
76
- `} as const)`,
77
- `export type ${irEnum.name}Key = keyof typeof ${constName}`,
78
- `export type ${irEnum.name} = (typeof ${constName})[${irEnum.name}Key]`,
79
- ].join('\n');
80
- };
81
- const renderModel = (model, ir) => {
82
- const doc = docLines(model.description, '');
83
- const fields = model.fields.map(field => renderField(field, ir)).join('\n');
84
- return [...doc, `export interface ${model.name} {`, fields, '}'].join('\n');
85
- };
86
- const usesJson = (models) => models.some(model => model.fields.some(field => field.type.kind === 'scalar' && field.type.name === 'json'));
6
+ import { JSON_TYPE, renderEnumConst, renderModel, usesJson } from './render.js';
87
7
  /**
88
8
  * Split variant of the TypeScript generator: one file per table at
89
9
  * `types/<table-name>.ts` (kebab-case), with enums and embedded value objects
@@ -0,0 +1,12 @@
1
+ import { Ir, IrEnum, IrField, IrModel, ScalarType } from '../../ir/ir.js';
2
+ /**
3
+ * Rendering shared by the bundled and split Zod layouts. Both layouts MUST go
4
+ * through these helpers so a contract setting (nullable, constraints, …) means
5
+ * the same thing regardless of layout.
6
+ */
7
+ export declare const SCALAR_ZOD: Record<ScalarType, string>;
8
+ export declare const schemaName: (name: string) => string;
9
+ export declare const renderFieldSchema: (field: IrField, ir: Ir) => string;
10
+ export declare const renderEnum: (irEnum: IrEnum) => string;
11
+ export declare const renderModel: (model: IrModel, ir: Ir) => string;
12
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/zod/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAa,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKpF;;;;GAIG;AAEH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAUjD,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAyB,CAAA;AAgBnE,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,EAAE,IAAI,EAAE,KAAG,MAa1D,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,MAM3C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,IAAI,EAAE,KAAG,MAMpD,CAAA"}
@@ -0,0 +1,59 @@
1
+ import { zodConstraints } from '../support/constraints.js';
2
+ import { singleQuote } from '../support/naming.js';
3
+ import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
4
+ /**
5
+ * Rendering shared by the bundled and split Zod layouts. Both layouts MUST go
6
+ * through these helpers so a contract setting (nullable, constraints, …) means
7
+ * the same thing regardless of layout.
8
+ */
9
+ export const SCALAR_ZOD = {
10
+ string: 'z.string()',
11
+ int: 'z.number().int()',
12
+ int64: 'z.number().int()',
13
+ float: 'z.number()',
14
+ boolean: 'z.boolean()',
15
+ timestamp: 'z.string().datetime()',
16
+ date: 'z.string()',
17
+ json: 'z.unknown()',
18
+ id: 'z.string()',
19
+ };
20
+ export const schemaName = (name) => `${name}Schema`;
21
+ const renderRef = (ref) => {
22
+ switch (ref.kind) {
23
+ case 'scalar':
24
+ return SCALAR_ZOD[ref.name];
25
+ case 'enum':
26
+ return schemaName(ref.name);
27
+ case 'model':
28
+ // Wrapped in z.lazy so declaration order and (cross-file) cycles never matter.
29
+ return `z.lazy(() => ${schemaName(ref.name)})`;
30
+ default:
31
+ return 'z.unknown()';
32
+ }
33
+ };
34
+ export const renderFieldSchema = (field, ir) => {
35
+ const isRel = isRelation(field);
36
+ const name = isRel ? relationFkName(field) : field.name;
37
+ const base = field.literal !== undefined
38
+ ? `z.literal(${singleQuote(field.literal)})`
39
+ : isRel
40
+ ? SCALAR_ZOD[relationFkType(ir, field)]
41
+ : renderRef(field.type);
42
+ const cons = zodConstraints(field);
43
+ let schema = field.list ? `z.array(${base})${cons}` : `${base}${cons}`;
44
+ if (field.nullable)
45
+ schema = `${schema}.nullable()`;
46
+ if (field.optional)
47
+ schema = `${schema}.optional()`;
48
+ return ` ${name}: ${schema},`;
49
+ };
50
+ export const renderEnum = (irEnum) => {
51
+ const values = irEnum.values.map(singleQuote).join(', ');
52
+ return (`export const ${schemaName(irEnum.name)} = z.enum([${values}])\n` +
53
+ `export type ${irEnum.name} = z.infer<typeof ${schemaName(irEnum.name)}>`);
54
+ };
55
+ export const renderModel = (model, ir) => {
56
+ const fields = model.fields.map(field => renderFieldSchema(field, ir)).join('\n');
57
+ return (`export const ${schemaName(model.name)} = z.object({\n${fields}\n})\n` +
58
+ `export type ${model.name} = z.infer<typeof ${schemaName(model.name)}>`);
59
+ };
@@ -1,7 +1,8 @@
1
1
  import { Generator } from '../generator.js';
2
2
  /**
3
3
  * Generates Zod schemas and the types inferred from them. Model references use
4
- * `z.lazy` so the output is order- and cycle-independent.
4
+ * `z.lazy` so the output is order- and cycle-independent. Rendering is shared
5
+ * with the split layout (./render.js) so both emit identical members.
5
6
  */
6
7
  export declare const createZodGenerator: () => Generator;
7
8
  //# sourceMappingURL=zod-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/zod/zod-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAuD5E;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,SA4BnC,CAAA"}
1
+ {"version":3,"file":"zod-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/zod/zod-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAO5E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAO,SAoBnC,CAAA"}
@@ -1,55 +1,12 @@
1
1
  import { headerBlocks } from '../support/header.js';
2
2
  import { withSplitVariant } from '../support/split-variant.js';
3
3
  import { createZodSplitLayout } from './zod-split-generator.js';
4
- import { singleQuote } from '../support/naming.js';
5
- import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
6
- import { zodConstraints } from '../support/constraints.js';
7
4
  import { outputFile } from '../support/templates.js';
8
- const SCALAR_ZOD = {
9
- string: 'z.string()',
10
- int: 'z.number().int()',
11
- int64: 'z.number().int()',
12
- float: 'z.number()',
13
- boolean: 'z.boolean()',
14
- timestamp: 'z.string().datetime()',
15
- date: 'z.string()',
16
- json: 'z.unknown()',
17
- id: 'z.string()',
18
- };
19
- const schemaName = (name) => `${name}Schema`;
20
- const renderRef = (ref) => {
21
- switch (ref.kind) {
22
- case 'scalar':
23
- return SCALAR_ZOD[ref.name];
24
- case 'enum':
25
- // Enums are declared before models, so a direct reference is safe.
26
- return schemaName(ref.name);
27
- case 'model':
28
- // Model references are wrapped in z.lazy so declaration order and cycles
29
- // never matter.
30
- return `z.lazy(() => ${schemaName(ref.name)})`;
31
- default:
32
- return 'z.unknown()';
33
- }
34
- };
35
- const renderFieldSchema = (field, ir) => {
36
- const isRel = isRelation(field);
37
- const name = isRel ? relationFkName(field) : field.name;
38
- const base = field.literal !== undefined
39
- ? `z.literal(${singleQuote(field.literal)})`
40
- : isRel
41
- ? SCALAR_ZOD[relationFkType(ir, field)]
42
- : renderRef(field.type);
43
- const cons = zodConstraints(field);
44
- let schema = field.list ? `z.array(${base})${cons}` : `${base}${cons}`;
45
- if (field.optional) {
46
- schema = `${schema}.optional()`;
47
- }
48
- return ` ${name}: ${schema},`;
49
- };
5
+ import { renderEnum, renderModel } from './render.js';
50
6
  /**
51
7
  * Generates Zod schemas and the types inferred from them. Model references use
52
- * `z.lazy` so the output is order- and cycle-independent.
8
+ * `z.lazy` so the output is order- and cycle-independent. Rendering is shared
9
+ * with the split layout (./render.js) so both emit identical members.
53
10
  */
54
11
  export const createZodGenerator = () => withSplitVariant({
55
12
  name: 'zod',
@@ -57,14 +14,10 @@ export const createZodGenerator = () => withSplitVariant({
57
14
  generate(ir, context) {
58
15
  const blocks = [...headerBlocks(context), "import { z } from 'zod'"];
59
16
  for (const irEnum of ir.enums) {
60
- const values = irEnum.values.map(singleQuote).join(', ');
61
- blocks.push(`export const ${schemaName(irEnum.name)} = z.enum([${values}])\n` +
62
- `export type ${irEnum.name} = z.infer<typeof ${schemaName(irEnum.name)}>`);
17
+ blocks.push(renderEnum(irEnum));
63
18
  }
64
19
  for (const model of ir.models) {
65
- const fields = model.fields.map(field => renderFieldSchema(field, ir)).join('\n');
66
- blocks.push(`export const ${schemaName(model.name)} = z.object({\n${fields}\n})\n` +
67
- `export type ${model.name} = z.infer<typeof ${schemaName(model.name)}>`);
20
+ blocks.push(renderModel(model, ir));
68
21
  }
69
22
  return [{ path: outputFile(context, 'schemas.ts'), content: `${blocks.join('\n\n')}\n` }];
70
23
  },
@@ -1 +1 @@
1
- {"version":3,"file":"zod-split-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/zod/zod-split-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAmE5E;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAO,SAmEtC,CAAA"}
1
+ {"version":3,"file":"zod-split-generator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/_internal/generators/zod/zod-split-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAO5E;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAO,SAmEtC,CAAA"}
@@ -1,61 +1,9 @@
1
1
  import { findEnum, findModel } from '../../ir/ir.js';
2
- import { zodConstraints } from '../support/constraints.js';
3
2
  import { headerBlocks } from '../support/header.js';
4
- import { singleQuote } from '../support/naming.js';
5
- import { isRelation, relationFkName, relationFkType } from '../support/relations.js';
3
+ import { isRelation } from '../support/relations.js';
6
4
  import { assignModuleNames, collectDeps, splitGroups } from '../support/split.js';
7
5
  import { outputFile } from '../support/templates.js';
8
- const SCALAR_ZOD = {
9
- string: 'z.string()',
10
- int: 'z.number().int()',
11
- int64: 'z.number().int()',
12
- float: 'z.number()',
13
- boolean: 'z.boolean()',
14
- timestamp: 'z.string().datetime()',
15
- date: 'z.string()',
16
- json: 'z.unknown()',
17
- id: 'z.string()',
18
- };
19
- const schemaName = (name) => `${name}Schema`;
20
- const renderRef = (ref) => {
21
- switch (ref.kind) {
22
- case 'scalar':
23
- return SCALAR_ZOD[ref.name];
24
- case 'enum':
25
- return schemaName(ref.name);
26
- case 'model':
27
- // Wrapped in z.lazy so declaration order and (cross-file) cycles never matter.
28
- return `z.lazy(() => ${schemaName(ref.name)})`;
29
- default:
30
- return 'z.unknown()';
31
- }
32
- };
33
- const renderFieldSchema = (field, ir) => {
34
- const isRel = isRelation(field);
35
- const name = isRel ? relationFkName(field) : field.name;
36
- const base = field.literal !== undefined
37
- ? `z.literal(${singleQuote(field.literal)})`
38
- : isRel
39
- ? SCALAR_ZOD[relationFkType(ir, field)]
40
- : renderRef(field.type);
41
- const cons = zodConstraints(field);
42
- let schema = field.list ? `z.array(${base})${cons}` : `${base}${cons}`;
43
- if (field.nullable)
44
- schema = `${schema}.nullable()`;
45
- if (field.optional)
46
- schema = `${schema}.optional()`;
47
- return ` ${name}: ${schema},`;
48
- };
49
- const renderEnum = (irEnum) => {
50
- const values = irEnum.values.map(singleQuote).join(', ');
51
- return (`export const ${schemaName(irEnum.name)} = z.enum([${values}])\n` +
52
- `export type ${irEnum.name} = z.infer<typeof ${schemaName(irEnum.name)}>`);
53
- };
54
- const renderModel = (model, ir) => {
55
- const fields = model.fields.map(field => renderFieldSchema(field, ir)).join('\n');
56
- return (`export const ${schemaName(model.name)} = z.object({\n${fields}\n})\n` +
57
- `export type ${model.name} = z.infer<typeof ${schemaName(model.name)}>`);
58
- };
6
+ import { renderEnum, renderModel, schemaName } from './render.js';
59
7
  /**
60
8
  * Split variant of the Zod generator: one file per table at
61
9
  * `schemas/<table-name>.ts` (kebab-case) with enums and embedded value objects
@@ -1 +1 @@
1
- {"version":3,"file":"build-ir.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/ir/build-ir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAS,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAGL,WAAW,EAIZ,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAGL,EAAE,EAgBH,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,EAAE,CAAA;IACN,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAqLD;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,WAAW,WAAW,EAAE,KAAG,aAqQlD,CAAA"}
1
+ {"version":3,"file":"build-ir.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/ir/build-ir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAS,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAGL,WAAW,EAIZ,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAGL,EAAE,EAgBH,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,EAAE,CAAA;IACN,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAqLD;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,WAAW,WAAW,EAAE,KAAG,aAkQlD,CAAA"}
@@ -365,7 +365,6 @@ export const buildIr = (documents) => {
365
365
  for (const [name, doc] of firestoreSources) {
366
366
  firestore.push(buildFirestoreDoc(name, doc.firestore[name], doc.filePath, enumNames, modelNames));
367
367
  }
368
- const version = documents.length > 0 ? documents[documents.length - 1].version : 1;
369
368
  const envelopeSources = new Map();
370
369
  for (const doc of documents) {
371
370
  for (const name of Object.keys(doc.envelopes)) {
@@ -416,7 +415,6 @@ export const buildIr = (documents) => {
416
415
  }
417
416
  return {
418
417
  ir: {
419
- version,
420
418
  enums,
421
419
  models,
422
420
  operations,
@@ -376,7 +376,6 @@ export interface IrProject {
376
376
  };
377
377
  }
378
378
  export interface Ir {
379
- version: number;
380
379
  enums: IrEnum[];
381
380
  models: IrModel[];
382
381
  operations: IrOperation[];
@@ -1 +1 @@
1
- {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/ir/ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/ir/ir.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
+ import { Diagnostic } from '../diagnostics.js';
1
2
  import { RawContract } from './raw-document.js';
2
3
  /**
3
4
  * Parse a single YAML contract file into a {@link RawContract}. Shorthand forms
4
5
  * are normalized here so downstream code sees one canonical shape. Syntax and
5
- * structural problems throw a {@link ContractError}; semantic problems are left
6
- * for validation.
6
+ * structural problems throw a {@link ContractError}; unknown keys are collected
7
+ * into `diagnostics` as UNKNOWN_KEY errors (all of them in one pass); semantic
8
+ * problems are left for validation.
7
9
  */
8
- export declare const parseContract: (content: string, filePath: string) => RawContract;
10
+ export declare const parseContract: (content: string, filePath: string, diagnostics?: Diagnostic[]) => RawContract;
9
11
  //# sourceMappingURL=parse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/parser/parse.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,WAAW,EAaZ,MAAM,mBAAmB,CAAA;AA4jB1B;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,WAmNjE,CAAA"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/parser/parse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,UAAU,EAAS,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EAGL,WAAW,EAaZ,MAAM,mBAAmB,CAAA;AA+mB1B;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,EAAE,cAAc,UAAU,EAAE,KAAG,WAO7F,CAAA"}
@@ -4,6 +4,27 @@ const isObject = (value) => typeof value === 'object' && value !== null && !Arra
4
4
  const fail = (message, filePath, path) => {
5
5
  throw new ContractError(message, [error('PARSE_ERROR', message, { file: filePath, path })]);
6
6
  };
7
+ /**
8
+ * Sink for UNKNOWN_KEY diagnostics, set for the duration of one parseContract
9
+ * call (the parser is synchronous, so there is no reentrancy). Collected keys
10
+ * become errors instead of throws so a single pass reports every typo at once.
11
+ */
12
+ let unknownKeySink;
13
+ /**
14
+ * The contract is the single source of truth, so a key the parser would
15
+ * silently drop is either a typo about to change meaning (`optionnal:` making a
16
+ * field required) or dead weight lying about what the contract expresses.
17
+ * Either way it is an error, not a shrug.
18
+ */
19
+ const checkKeys = (raw, known, filePath, path) => {
20
+ if (!unknownKeySink)
21
+ return;
22
+ for (const key of Object.keys(raw)) {
23
+ if (!known.includes(key)) {
24
+ unknownKeySink.push(error('UNKNOWN_KEY', `Unknown key "${key}" in ${path} — remove it or fix the typo`, { file: filePath, path: `${path}.${key}` }));
25
+ }
26
+ }
27
+ };
7
28
  const normalizeField = (raw, filePath, path) => {
8
29
  // Shorthand: `title: string` — the value is the type name.
9
30
  if (typeof raw === 'string') {
@@ -15,6 +36,7 @@ const normalizeField = (raw, filePath, path) => {
15
36
  if (typeof raw.type !== 'string') {
16
37
  return fail(`Field "${path}" is missing a string "type"`, filePath, path);
17
38
  }
39
+ checkKeys(raw, ['type', 'optional', 'nullable', 'jsdoc', 'list', 'id', 'unique', 'relation', 'default', 'description', 'min', 'max', 'minLength', 'maxLength', 'pattern', 'nonempty', 'email', 'url', 'col', 'literal'], filePath, path);
18
40
  const field = { type: raw.type };
19
41
  if (raw.optional !== undefined)
20
42
  field.optional = Boolean(raw.optional);
@@ -64,6 +86,7 @@ const normalizeModel = (raw, filePath, name) => {
64
86
  if (!isObject(fieldsRaw)) {
65
87
  return fail(`Model "${name}" is missing a "fields" object`, filePath, `models.${name}.fields`);
66
88
  }
89
+ checkKeys(raw, ['fields', 'description', 'key', 'table', 'gqlName', 'directives', 'footer', 'fsName', 'indexes', 'sql'], filePath, `models.${name}`);
67
90
  const fields = {};
68
91
  for (const [fieldName, fieldRaw] of Object.entries(fieldsRaw)) {
69
92
  fields[fieldName] = normalizeField(fieldRaw, filePath, `models.${name}.fields.${fieldName}`);
@@ -91,6 +114,7 @@ const normalizeModel = (raw, filePath, name) => {
91
114
  if (!isObject(entry)) {
92
115
  return fail(`Model "${name}" index #${i} must be an object`, filePath, `models.${name}.indexes`);
93
116
  }
117
+ checkKeys(entry, ['fields', 'name', 'unique', 'expand'], filePath, `models.${name}.indexes[${i}]`);
94
118
  const index = {
95
119
  fields: asStringArray(entry.fields, filePath, `models.${name}.indexes[${i}].fields`),
96
120
  };
@@ -108,6 +132,7 @@ const normalizeModel = (raw, filePath, name) => {
108
132
  return fail(`Model "${name}" sql must be an object`, filePath, `models.${name}.sql`);
109
133
  }
110
134
  const sqlRaw = raw.sql;
135
+ checkKeys(sqlRaw, ['checks', 'foreignKeys', 'indexes'], filePath, `models.${name}.sql`);
111
136
  const sql = {};
112
137
  if (sqlRaw.checks !== undefined)
113
138
  sql.checks = asStringArray(sqlRaw.checks, filePath, `models.${name}.sql.checks`);
@@ -119,6 +144,7 @@ const normalizeModel = (raw, filePath, name) => {
119
144
  if (!isObject(entry) || typeof entry.references !== 'string') {
120
145
  return fail(`Model "${name}" sql.foreignKeys[${i}] needs columns + references`, filePath, `models.${name}.sql.foreignKeys`);
121
146
  }
147
+ checkKeys(entry, ['columns', 'references', 'name'], filePath, `models.${name}.sql.foreignKeys[${i}]`);
122
148
  const fk = {
123
149
  columns: asStringArray(entry.columns, filePath, `models.${name}.sql.foreignKeys[${i}].columns`),
124
150
  references: entry.references,
@@ -136,6 +162,7 @@ const normalizeModel = (raw, filePath, name) => {
136
162
  if (!isObject(entry)) {
137
163
  return fail(`Model "${name}" sql.indexes[${i}] must be an object`, filePath, `models.${name}.sql.indexes`);
138
164
  }
165
+ checkKeys(entry, ['columns', 'name', 'unique'], filePath, `models.${name}.sql.indexes[${i}]`);
139
166
  const idx = {
140
167
  columns: asStringArray(entry.columns, filePath, `models.${name}.sql.indexes[${i}].columns`),
141
168
  };
@@ -157,11 +184,13 @@ const normalizeEnum = (raw, filePath, name) => {
157
184
  if (!Array.isArray(raw.values)) {
158
185
  return fail(`Enum "${name}" is missing a "values" array`, filePath, `enums.${name}.values`);
159
186
  }
187
+ checkKeys(raw, ['values', 'gqlName', 'fsName', 'fsDescription', 'description'], filePath, `enums.${name}`);
160
188
  const values = [];
161
189
  const valueComments = {};
162
190
  const valueKeys = {};
163
191
  for (const entry of raw.values) {
164
192
  if (isObject(entry) && typeof entry.value === 'string') {
193
+ checkKeys(entry, ['value', 'description', 'key'], filePath, `enums.${name}.values`);
165
194
  values.push(entry.value);
166
195
  if (entry.description !== undefined)
167
196
  valueComments[entry.value] = String(entry.description);
@@ -205,6 +234,7 @@ const normalizeOperation = (raw, filePath, name) => {
205
234
  if (typeof raw.model !== 'string') {
206
235
  return fail(`Operation "${name}" is missing a string "model"`, filePath, `operations.${name}.model`);
207
236
  }
237
+ checkKeys(raw, ['type', 'model', 'action', 'auth', 'authReason', 'inputs', 'select', 'where', 'orderBy', 'limit', 'single', 'keyArg', 'entityDir', 'whereAnd', 'gqlName', 'footer', 'raw', 'style', 'keyVars', 'aggregate', 'exprs', 'inc', 'connectors', 'description'], filePath, `operations.${name}`);
208
238
  const op = { type: raw.type, model: raw.model };
209
239
  if (raw.action !== undefined)
210
240
  op.action = String(raw.action);
@@ -220,6 +250,7 @@ const normalizeOperation = (raw, filePath, name) => {
220
250
  if (typeof entry === 'string')
221
251
  return { field: entry };
222
252
  if (isObject(entry) && typeof entry.field === 'string') {
253
+ checkKeys(entry, ['field', 'required', 'description', 'var', 'flat', 'literal', 'quote', 'inc', 'asKey'], filePath, `operations.${name}.inputs`);
223
254
  return {
224
255
  field: entry.field,
225
256
  ...(entry.required !== undefined ? { required: Boolean(entry.required) } : {}),
@@ -244,6 +275,7 @@ const normalizeOperation = (raw, filePath, name) => {
244
275
  if (typeof entry === 'string')
245
276
  return { field: entry };
246
277
  if (isObject(entry) && typeof entry.field === 'string') {
278
+ checkKeys(entry, ['field', 'select', 'description', 'alias', 'args'], filePath, path);
247
279
  return {
248
280
  field: entry.field,
249
281
  ...(entry.select !== undefined ? { select: normalizeSelect(entry.select, `${path}.${entry.field}`) } : {}),
@@ -266,6 +298,7 @@ const normalizeOperation = (raw, filePath, name) => {
266
298
  if (typeof entry === 'string')
267
299
  return { field: entry, op: 'eq' };
268
300
  if (isObject(entry) && typeof entry.field === 'string') {
301
+ checkKeys(entry, ['field', 'op', 'required', 'description', 'var', 'literal', 'flat'], filePath, `operations.${name}.where`);
269
302
  return {
270
303
  field: entry.field,
271
304
  op: entry.op !== undefined ? String(entry.op) : 'eq',
@@ -288,11 +321,13 @@ const normalizeOperation = (raw, filePath, name) => {
288
321
  if (!isObject(entry) || typeof entry.field !== 'string') {
289
322
  return fail(`Operation "${name}" orderBy entry needs a field`, filePath, `operations.${name}.orderBy`);
290
323
  }
324
+ checkKeys(entry, ['field', 'dir'], filePath, `operations.${name}.orderBy`);
291
325
  return { field: entry.field, dir: entry.dir !== undefined ? String(entry.dir).toUpperCase() : 'ASC' };
292
326
  });
293
327
  }
294
328
  if (raw.limit !== undefined) {
295
329
  if (isObject(raw.limit) && typeof raw.limit.var === 'string') {
330
+ checkKeys(raw.limit, ['var', 'default', 'required'], filePath, `operations.${name}.limit`);
296
331
  op.limit = {
297
332
  var: raw.limit.var,
298
333
  ...(raw.limit.default !== undefined ? { default: Number(raw.limit.default) } : {}),
@@ -322,7 +357,9 @@ const normalizeOperation = (raw, filePath, name) => {
322
357
  return fail(`Operation "${name}" style must be a mapping`, filePath, `operations.${name}.style`);
323
358
  }
324
359
  const style = {};
325
- for (const k of ['signature', 'args', 'data', 'orderBy', 'auth', 'key', 'and', 'where']) {
360
+ const styleKeys = ['signature', 'args', 'data', 'orderBy', 'auth', 'key', 'and', 'where'];
361
+ checkKeys(raw.style, styleKeys, filePath, `operations.${name}.style`);
362
+ for (const k of styleKeys) {
326
363
  if (raw.style[k] !== undefined)
327
364
  style[k] = String(raw.style[k]);
328
365
  }
@@ -338,6 +375,7 @@ const normalizeOperation = (raw, filePath, name) => {
338
375
  if (!isObject(raw.aggregate)) {
339
376
  return fail(`Operation "${name}" aggregate must be an object`, filePath, `operations.${name}.aggregate`);
340
377
  }
378
+ checkKeys(raw.aggregate, ['count', 'sum'], filePath, `operations.${name}.aggregate`);
341
379
  op.aggregate = {
342
380
  count: raw.aggregate.count !== undefined ? Boolean(raw.aggregate.count) : false,
343
381
  sum: asStringArray(raw.aggregate.sum, filePath, `operations.${name}.aggregate.sum`),
@@ -357,16 +395,13 @@ const normalizeOperation = (raw, filePath, name) => {
357
395
  if (typeof entry === 'string')
358
396
  return { field: entry };
359
397
  if (isObject(entry) && typeof entry.field === 'string') {
398
+ checkKeys(entry, ['field', 'var'], filePath, `operations.${name}.inc`);
360
399
  return { field: entry.field, ...(entry.var !== undefined ? { var: String(entry.var) } : {}) };
361
400
  }
362
401
  return fail(`Operation "${name}" inc entry must be a field or { field, var }`, filePath, `operations.${name}.inc`);
363
402
  });
364
403
  }
365
- // `connector: app` (single) or `connectors: [app, api]` (multiple).
366
- if (raw.connector !== undefined) {
367
- op.connectors = [String(raw.connector)];
368
- }
369
- else if (raw.connectors !== undefined) {
404
+ if (raw.connectors !== undefined) {
370
405
  op.connectors = asStringArray(raw.connectors, filePath, `operations.${name}.connectors`);
371
406
  }
372
407
  if (raw.description !== undefined)
@@ -379,6 +414,7 @@ const normalizeApiPayload = (raw, filePath, path) => {
379
414
  if (!isObject(raw)) {
380
415
  return fail(`"${path}" must be an object`, filePath, path);
381
416
  }
417
+ checkKeys(raw, ['model', 'void', 'fields'], filePath, path);
382
418
  const payload = {};
383
419
  if (raw.model !== undefined)
384
420
  payload.model = String(raw.model);
@@ -412,6 +448,7 @@ const normalizeGeneratorUse = (raw, filePath, path) => {
412
448
  if (!isObject(raw) || typeof raw.generator !== 'string') {
413
449
  return fail(`"${path}" must be a generator name or { generator, out?, file?, split?, options?, header? }`, filePath, path);
414
450
  }
451
+ checkKeys(raw, ['generator', 'out', 'file', 'split', 'options', 'header'], filePath, path);
415
452
  const use = { generator: raw.generator };
416
453
  if (raw.out !== undefined)
417
454
  use.out = String(raw.out);
@@ -437,6 +474,7 @@ const normalizeSectionDefaults = (raw, filePath, section) => {
437
474
  if (!isObject(raw)) {
438
475
  return fail(`"${section}.${SECTION_DEFAULTS_KEY}" must be an object`, filePath, `${section}.${SECTION_DEFAULTS_KEY}`);
439
476
  }
477
+ checkKeys(raw, ['generators'], filePath, `${section}.${SECTION_DEFAULTS_KEY}`);
440
478
  if (raw.generators === undefined)
441
479
  return [];
442
480
  return normalizeGeneratorUses(raw.generators, filePath, `${section}.${SECTION_DEFAULTS_KEY}.generators`);
@@ -462,6 +500,7 @@ const normalizePathApi = (raw, filePath, pathKey) => {
462
500
  if (kind !== 'https' && kind !== 'callable') {
463
501
  return fail(`Api "${pathKey}" kind must be https|callable (tasks/events have their own sections)`, filePath, `apis.${pathKey}.kind`);
464
502
  }
503
+ checkKeys(raw, ['operationId', 'kind', 'method', 'description', 'request', 'response', 'generators'], filePath, `apis.${pathKey}`);
465
504
  const prefixed = METHOD_PREFIXED_KEY_RE.exec(pathKey);
466
505
  const keyMethod = prefixed?.[1];
467
506
  const routePath = prefixed?.[2] ?? pathKey;
@@ -489,6 +528,7 @@ const normalizeTask = (raw, filePath, name) => {
489
528
  if (!isObject(raw)) {
490
529
  return fail(`Task "${name}" must be an object`, filePath, `tasks.${name}`);
491
530
  }
531
+ checkKeys(raw, ['description', 'envelope', 'maxAttempts', 'timeoutSeconds', 'request', 'response', 'generators'], filePath, `tasks.${name}`);
492
532
  const api = { kind: 'task' };
493
533
  if (raw.description !== undefined)
494
534
  api.description = String(raw.description);
@@ -510,6 +550,7 @@ const normalizeEvent = (raw, filePath, name) => {
510
550
  if (!isObject(raw)) {
511
551
  return fail(`Event "${name}" must be an object`, filePath, `events.${name}`);
512
552
  }
553
+ checkKeys(raw, ['description', 'envelope', 'maxAttempts', 'timeoutSeconds', 'topic', 'request', 'response', 'generators'], filePath, `events.${name}`);
513
554
  const api = { kind: 'pubsub' };
514
555
  if (raw.description !== undefined)
515
556
  api.description = String(raw.description);
@@ -535,6 +576,7 @@ const normalizeEnvelope = (raw, filePath, name) => {
535
576
  if (!isObject(raw.fields)) {
536
577
  return fail(`Envelope "${name}" is missing a "fields" object`, filePath, `envelopes.${name}.fields`);
537
578
  }
579
+ checkKeys(raw, ['fields', 'description'], filePath, `envelopes.${name}`);
538
580
  const fields = {};
539
581
  for (const [fieldName, fieldRaw] of Object.entries(raw.fields)) {
540
582
  fields[fieldName] = normalizeField(fieldRaw, filePath, `envelopes.${name}.fields.${fieldName}`);
@@ -548,6 +590,7 @@ const normalizeFirestoreDoc = (raw, filePath, name) => {
548
590
  if (!isObject(raw)) {
549
591
  return fail(`Firestore doc "${name}" must be an object`, filePath, `firestore.${name}`);
550
592
  }
593
+ checkKeys(raw, ['from', 'collection', 'description', 'meta', 'helpers', 'include', 'pick', 'omit', 'fields'], filePath, `firestore.${name}`);
551
594
  const doc = {};
552
595
  if (raw.from !== undefined)
553
596
  doc.from = String(raw.from);
@@ -582,6 +625,7 @@ const normalizeUnion = (raw, filePath, name) => {
582
625
  if (typeof raw.discriminant !== 'string') {
583
626
  return fail(`Union "${name}" is missing a string "discriminant"`, filePath, `unions.${name}.discriminant`);
584
627
  }
628
+ checkKeys(raw, ['discriminant', 'variants', 'description'], filePath, `unions.${name}`);
585
629
  const union = {
586
630
  discriminant: raw.discriminant,
587
631
  variants: asStringArray(raw.variants, filePath, `unions.${name}.variants`),
@@ -594,6 +638,7 @@ const normalizeProject = (raw, filePath) => {
594
638
  if (!isObject(raw)) {
595
639
  return fail('"project" must be an object', filePath, 'project');
596
640
  }
641
+ checkKeys(raw, ['services', 'codebases', 'idCodec', 'aliases'], filePath, 'project');
597
642
  const project = {};
598
643
  if (raw.services !== undefined) {
599
644
  if (!Array.isArray(raw.services)) {
@@ -603,6 +648,7 @@ const normalizeProject = (raw, filePath) => {
603
648
  if (!isObject(entry) || typeof entry.name !== 'string') {
604
649
  return fail(`project.services[${i}] needs a name`, filePath, 'project.services');
605
650
  }
651
+ checkKeys(entry, ['name', 'database', 'location', 'connectors'], filePath, `project.services[${i}]`);
606
652
  const service = { name: entry.name };
607
653
  if (entry.database !== undefined)
608
654
  service.database = String(entry.database);
@@ -624,6 +670,7 @@ const normalizeProject = (raw, filePath) => {
624
670
  project.codebases = codebases;
625
671
  }
626
672
  if (isObject(raw.idCodec)) {
673
+ checkKeys(raw.idCodec, ['minLength', 'alphabet'], filePath, 'project.idCodec');
627
674
  const idCodec = {};
628
675
  if (raw.idCodec.minLength !== undefined)
629
676
  idCodec.minLength = Number(raw.idCodec.minLength);
@@ -646,10 +693,20 @@ const normalizeProject = (raw, filePath) => {
646
693
  /**
647
694
  * Parse a single YAML contract file into a {@link RawContract}. Shorthand forms
648
695
  * are normalized here so downstream code sees one canonical shape. Syntax and
649
- * structural problems throw a {@link ContractError}; semantic problems are left
650
- * for validation.
696
+ * structural problems throw a {@link ContractError}; unknown keys are collected
697
+ * into `diagnostics` as UNKNOWN_KEY errors (all of them in one pass); semantic
698
+ * problems are left for validation.
651
699
  */
652
- export const parseContract = (content, filePath) => {
700
+ export const parseContract = (content, filePath, diagnostics) => {
701
+ unknownKeySink = diagnostics;
702
+ try {
703
+ return parseContractInner(content, filePath);
704
+ }
705
+ finally {
706
+ unknownKeySink = undefined;
707
+ }
708
+ };
709
+ const parseContractInner = (content, filePath) => {
653
710
  let doc;
654
711
  try {
655
712
  doc = parseYamlText(content);
@@ -662,7 +719,6 @@ export const parseContract = (content, filePath) => {
662
719
  // An empty file is a valid, contribution-free contract.
663
720
  return {
664
721
  filePath,
665
- version: 1,
666
722
  imports: [],
667
723
  defaultConnectors: [],
668
724
  enums: {},
@@ -677,6 +733,7 @@ export const parseContract = (content, filePath) => {
677
733
  if (!isObject(doc)) {
678
734
  return fail('Contract root must be a mapping', filePath);
679
735
  }
736
+ checkKeys(doc, ['imports', 'defaults', 'header', 'project', 'generators', 'enums', 'models', 'operations', 'apis', 'tasks', 'events', 'firestore', 'unions', 'envelopes'], filePath, '(root)');
680
737
  const imports = [];
681
738
  if (doc.imports !== undefined) {
682
739
  if (!Array.isArray(doc.imports)) {
@@ -713,6 +770,7 @@ export const parseContract = (content, filePath) => {
713
770
  if (!isObject(doc.defaults)) {
714
771
  return fail('"defaults" must be a mapping', filePath, 'defaults');
715
772
  }
773
+ checkKeys(doc.defaults, ['connectors'], filePath, 'defaults');
716
774
  defaultConnectors = asStringArray(doc.defaults.connectors, filePath, 'defaults.connectors');
717
775
  }
718
776
  const operations = {};
@@ -808,10 +866,8 @@ export const parseContract = (content, filePath) => {
808
866
  envelopes[name] = normalizeEnvelope(raw, filePath, name);
809
867
  }
810
868
  }
811
- const version = typeof doc.version === 'number' ? doc.version : 1;
812
869
  const contract = {
813
870
  filePath,
814
- version,
815
871
  imports,
816
872
  defaultConnectors,
817
873
  enums,
@@ -839,6 +895,7 @@ export const parseContract = (content, filePath) => {
839
895
  if (typeof entry.out !== 'string') {
840
896
  return fail(`generators[${i}] needs a string "out"`, filePath, `generators[${i}].out`);
841
897
  }
898
+ checkKeys(entry, ['generator', 'out', 'file', 'split', 'options', 'header'], filePath, `generators[${i}]`);
842
899
  const decl = { generator: entry.generator, out: entry.out };
843
900
  if (entry.file !== undefined)
844
901
  decl.file = String(entry.file);
@@ -250,7 +250,6 @@ export interface RawContract {
250
250
  generatorDecls?: RawGeneratorDecl[];
251
251
  /** Section-level generator defaults (`apis:/tasks:/events:` → `defaults`). */
252
252
  sectionDefaults?: RawSectionDefaults;
253
- version: number;
254
253
  /** Raw header text prepended to generated files (`default` = built-in banner). */
255
254
  header?: string;
256
255
  project?: RawProject;
@@ -1 +1 @@
1
- {"version":3,"file":"raw-document.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/parser/raw-document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raw-document.d.ts","sourceRoot":"","sources":["../../../../src/lib/_internal/parser/raw-document.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,7 @@ export const resolveImports = (entryPath, loader) => {
46
46
  }
47
47
  let document;
48
48
  try {
49
- document = parseContract(content, id);
49
+ document = parseContract(content, id, diagnostics);
50
50
  }
51
51
  catch (thrown) {
52
52
  collectFrom(thrown);
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4BnC,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,IAgFnD,CAAA"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4BnC,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,IAiFnD,CAAA"}
@@ -27,14 +27,16 @@ export const registerGenerate = (program) => {
27
27
  .action((entryArg, flags) => {
28
28
  const config = loadConfig();
29
29
  const entry = entryArg ?? config.entry ?? 'contract.yml';
30
- const outDir = flags.outDir ?? config.outDir ?? 'generated';
31
- const generators = flags.generators?.split(',').map(name => name.trim()).filter(Boolean) ?? config.generators;
30
+ const outDir = flags.outDir ?? 'generated';
31
+ const generators = flags.generators?.split(',').map(name => name.trim()).filter(Boolean);
32
32
  const header = flags.header === true ? DEFAULT_HEADER : typeof flags.header === 'string' ? toHeaderComment(flags.header) : undefined;
33
33
  const registry = createDefaultRegistry();
34
34
  const context = header !== undefined ? { header } : undefined;
35
35
  // Without -o/-g, run every generator declared in the contract
36
- // graph — the one-command flow. Flags switch back to single-target mode.
37
- const explicit = flags.outDir !== undefined || flags.generators !== undefined || config.outDir !== undefined || config.generators !== undefined;
36
+ // graph — the one-command flow. Only explicit flags switch back to
37
+ // single-target mode; the config file cannot (it must never silently
38
+ // disable the contract's own generators: declarations).
39
+ const explicit = flags.outDir !== undefined || flags.generators !== undefined;
38
40
  if (!explicit) {
39
41
  const all = generateAll(entry, { registry, write: !flags.check, ...(context ? { context } : {}) });
40
42
  if (all.targets.length > 0 || !all.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqEnC,eAAO,MAAM,YAAY,GAAI,SAAS,OAAO,KAAG,IAgB/C,CAAA"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/lib/cli/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgDnC,eAAO,MAAM,YAAY,GAAI,SAAS,OAAO,KAAG,IAgB/C,CAAA"}
@@ -1,9 +1,7 @@
1
1
  import { existsSync, writeFileSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
3
  import { CONFIG_FILENAME } from '../config.js';
4
- const EXAMPLE_CONTRACT = `version: 1
5
-
6
- # Declare generators once (name + output template); entries opt in below.
4
+ const EXAMPLE_CONTRACT = `# Declare generators once (name + output template); entries opt in below.
7
5
  generators:
8
6
  - { generator: typescript, out: generated }
9
7
  - { generator: zod, out: generated }
@@ -36,21 +34,7 @@ models:
36
34
  metadata: { type: json, optional: true }
37
35
  createdAt: timestamp
38
36
  `;
39
- const EXAMPLE_CONFIG = JSON.stringify({
40
- entry: 'contract.yml',
41
- outDir: 'generated',
42
- generators: [
43
- 'typescript',
44
- 'zod',
45
- 'data-connect-graphql',
46
- 'data-connect-operations',
47
- 'data-connect-adapter',
48
- 'firestore-types',
49
- 'firestore',
50
- 'api-types',
51
- 'api-validation',
52
- ],
53
- }, null, 2) + '\n';
37
+ const EXAMPLE_CONFIG = JSON.stringify({ entry: 'contract.yml' }, null, 2) + '\n';
54
38
  const writeIfAbsent = (path, content, force) => {
55
39
  if (existsSync(path) && !force) {
56
40
  return false;
@@ -1,12 +1,13 @@
1
1
  export declare const CONFIG_FILENAME = "firebase-contract.json";
2
2
  export interface FbcConfig {
3
3
  entry?: string;
4
- outDir?: string;
5
- generators?: string[];
6
4
  }
7
5
  /**
8
6
  * Load `firebase-contract.json` from `cwd` if present. CLI flags override these
9
7
  * values; the config only supplies defaults so common invocations stay short.
8
+ * Deliberately only `entry`: a config-side outDir/generators used to flip
9
+ * `fbc generate` into single-target mode, silently ignoring every `generators:`
10
+ * declaration in the contract graph — output routing belongs in the yml.
10
11
  */
11
12
  export declare const loadConfig: (cwd?: string) => FbcConfig;
12
13
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,2BAA2B,CAAA;AAEvD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,MAAK,MAAsB,KAAG,SAWxD,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,2BAA2B,CAAA;AAEvD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,MAAK,MAAsB,KAAG,SAWxD,CAAA"}
@@ -4,6 +4,9 @@ export const CONFIG_FILENAME = 'firebase-contract.json';
4
4
  /**
5
5
  * Load `firebase-contract.json` from `cwd` if present. CLI flags override these
6
6
  * values; the config only supplies defaults so common invocations stay short.
7
+ * Deliberately only `entry`: a config-side outDir/generators used to flip
8
+ * `fbc generate` into single-target mode, silently ignoring every `generators:`
9
+ * declaration in the contract graph — output routing belongs in the yml.
7
10
  */
8
11
  export const loadConfig = (cwd = process.cwd()) => {
9
12
  const path = resolve(cwd, CONFIG_FILENAME);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firebase-contract",
3
- "version": "0.1.0-rc.12",
3
+ "version": "0.1.0-rc.13",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "firebase-contract": "./dist/lib/cli/index.js",