langium-zod 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,6 +16,46 @@ import { generateZodSchemas } from 'langium-zod';
16
16
  const source = generateZodSchemas({ grammar, services });
17
17
  ```
18
18
 
19
+ ### Programmatic options
20
+
21
+ ```ts
22
+ generateZodSchemas({
23
+ grammar,
24
+ outputPath: 'src/generated/zod-schemas.ts',
25
+ include: ['Greeting', 'Tag'],
26
+ exclude: ['InternalNode'],
27
+ stripInternals: true,
28
+ projection: {
29
+ defaults: { strip: ['$container', '$document'] },
30
+ types: {
31
+ Greeting: { fields: ['name', 'tags'] }
32
+ }
33
+ },
34
+ conformance: {
35
+ astTypesPath: 'src/generated/ast.ts'
36
+ },
37
+ crossRefValidation: true
38
+ });
39
+ ```
40
+
41
+ ### CLI options
42
+
43
+ ```sh
44
+ langium-zod generate \
45
+ --config langium-config.json \
46
+ --out src/generated/zod-schemas.ts \
47
+ --include Greeting,Tag \
48
+ --exclude InternalNode \
49
+ --projection projection.json \
50
+ --strip-internals \
51
+ --conformance \
52
+ --ast-types src/generated/ast.ts \
53
+ --conformance-out src/generated/zod-schemas.conformance.ts \
54
+ --cross-ref-validation
55
+ ```
56
+
57
+ `zRef` is exported from the package for manual schema customization in runtime-aware validation flows.
58
+
19
59
  Generated output uses Zod 4 and exports named schemas like `<TypeName>Schema`.
20
60
 
21
61
  ## Requirements
@@ -23,3 +63,4 @@ Generated output uses Zod 4 and exports named schemas like `<TypeName>Schema`.
23
63
  - Node.js >= 20
24
64
  - Langium 4.x
25
65
  - Zod 4.x
66
+
package/dist/api.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import type { ZodGeneratorConfig } from './config.js';
2
+ export type PublicZodGeneratorConfig = ZodGeneratorConfig;
2
3
  export declare function generateZodSchemas(config: ZodGeneratorConfig): string;
3
4
  //# sourceMappingURL=api.d.ts.map
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AActD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA4CrE"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAStD,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAS1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAgGrE"}
package/dist/api.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { mkdirSync, writeFileSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
  import { collectAst } from 'langium/grammar';
4
+ import { generateConformanceSource, inferConformanceOutputPath } from './conformance.js';
4
5
  import { ZodGeneratorError } from './errors.js';
5
6
  import { extractTypeDescriptors } from './extractor.js';
6
7
  import { generateZodCode } from './generator.js';
8
+ import { applyProjectionToDescriptors, resolveEffectiveStripFields } from './projection.js';
7
9
  import { detectRecursiveTypes } from './recursion-detector.js';
8
10
  function resolveAstTypes(astTypes) {
9
11
  return {
@@ -25,10 +27,7 @@ export function generateZodSchemas(config) {
25
27
  });
26
28
  }
27
29
  const astTypes = resolveAstTypes(rawAstTypes);
28
- const rawDescriptors = extractTypeDescriptors(astTypes, {
29
- include: config.include,
30
- exclude: config.exclude
31
- });
30
+ const rawDescriptors = buildDescriptorPipeline(astTypes, config);
32
31
  // Apply regexOverrides: upgrade primitive-alias schemas to regex-enum for types
33
32
  // whose Langium grammar rule is too complex for automatic regex derivation.
34
33
  const overrides = config.regexOverrides ?? {};
@@ -45,11 +44,64 @@ export function generateZodSchemas(config) {
45
44
  return d;
46
45
  });
47
46
  const recursiveTypes = detectRecursiveTypes(descriptors);
48
- const source = generateZodCode(descriptors, recursiveTypes);
47
+ const surfaceDescriptors = applyProjectionToDescriptors(descriptors, {
48
+ projection: config.projection,
49
+ stripInternals: config.stripInternals
50
+ });
51
+ const source = generateZodCode(descriptors, recursiveTypes, {
52
+ projection: config.projection,
53
+ stripInternals: config.stripInternals,
54
+ crossRefValidation: config.crossRefValidation,
55
+ formMetadata: config.formMetadata,
56
+ objectStyle: config.objectStyle
57
+ });
49
58
  if (config.outputPath) {
50
59
  mkdirSync(dirname(config.outputPath), { recursive: true });
51
60
  writeFileSync(config.outputPath, source, 'utf8');
52
61
  }
62
+ if (config.conformance) {
63
+ if (!config.outputPath) {
64
+ throw new ZodGeneratorError('Conformance generation requires outputPath', {
65
+ suggestion: 'Provide outputPath when conformance generation is enabled'
66
+ });
67
+ }
68
+ if (!config.conformance.astTypesPath) {
69
+ throw new ZodGeneratorError('Conformance generation requires astTypesPath', {
70
+ suggestion: 'Provide conformance.astTypesPath or use CLI --ast-types/auto-resolution'
71
+ });
72
+ }
73
+ const schemaTypeNames = surfaceDescriptors
74
+ .filter((descriptor) => descriptor.kind === 'object')
75
+ .map((descriptor) => descriptor.name);
76
+ if (schemaTypeNames.length === 0) {
77
+ console.warn('Warning: Conformance generation skipped because no schemas remain after filtering.');
78
+ return source;
79
+ }
80
+ const conformanceOutputPath = inferConformanceOutputPath(config.outputPath, config.conformance.outputPath);
81
+ const conformance = generateConformanceSource({
82
+ schemaOutputPath: config.outputPath,
83
+ conformanceOutputPath,
84
+ astTypesPath: config.conformance.astTypesPath,
85
+ schemaTypeNames,
86
+ stripFields: resolveEffectiveStripFields({
87
+ projection: config.projection,
88
+ stripInternals: config.stripInternals
89
+ }),
90
+ projection: config.projection
91
+ });
92
+ for (const missingType of conformance.missingAstTypes) {
93
+ console.warn(`Warning: Missing AST export for conformance type ${missingType}; skipping.`);
94
+ }
95
+ mkdirSync(dirname(conformanceOutputPath), { recursive: true });
96
+ writeFileSync(conformanceOutputPath, conformance.source, 'utf8');
97
+ }
53
98
  return source;
54
99
  }
100
+ function buildDescriptorPipeline(astTypes, config) {
101
+ const descriptors = extractTypeDescriptors(astTypes, {
102
+ include: config.include,
103
+ exclude: config.exclude
104
+ });
105
+ return descriptors;
106
+ }
55
107
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,SAAS,eAAe,CAAC,QAAsB;IAC9C,OAAO;QACN,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;QACrC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;KAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC5D,IAAI,WAAyB,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3B,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAA4B,CAAC;IACrE,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,mDAAmD,EAAE;YAChF,UAAU,EAAE,uEAAuE;SACnF,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,EAAE;QACvD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,gFAAgF;IAChF,4EAA4E;IAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAwB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;YAC3E,OAAO;gBACN,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAE,CAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;aAC9C,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface LangiumZodConfig extends Omit<ZodGeneratorConfig, 'grammar' | '
10
10
  /** Explicit output path. Overrides derived path from langium-config.json `out` field. */
11
11
  outputPath?: string;
12
12
  }
13
+ export declare function resolveFilterOverrides(base: Pick<LangiumZodConfig, 'include' | 'exclude'>, includeArg?: string, excludeArg?: string): Pick<LangiumZodConfig, 'include' | 'exclude'>;
14
+ export declare function getUnknownFilterNames(requested: string[] | undefined, availableTypeNames: string[]): string[];
13
15
  export interface GenerateOptions {
14
16
  /** Absolute path to langium-config.json */
15
17
  langiumConfigPath: string;
@@ -17,4 +19,5 @@ export interface GenerateOptions {
17
19
  config?: LangiumZodConfig;
18
20
  }
19
21
  export declare function generate(opts: GenerateOptions): Promise<void>;
22
+ export declare function main(): Promise<void>;
20
23
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAeA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOtD,kEAAkE;AAClE,MAAM,WAAW,gBAChB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACrE;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAuED,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DnE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQtD,kEAAkE;AAClE,MAAM,WAAW,gBAChB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACrE;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,SAAS,CAAC,EACnD,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GACjB,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,SAAS,CAAC,CAc/C;AAoBD,wBAAgB,qBAAqB,CACpC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,kBAAkB,EAAE,MAAM,EAAE,GAC1B,MAAM,EAAE,CAOV;AAyED,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FnE;AAMD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAmG1C"}
package/dist/cli.js CHANGED
@@ -13,6 +13,61 @@ import { URI } from 'langium';
13
13
  import { createLangiumGrammarServices, resolveImportUri } from 'langium/grammar';
14
14
  import { NodeFileSystem } from 'langium/node';
15
15
  import { generateZodSchemas } from './api.js';
16
+ import { resolveAstTypesPath } from './conformance.js';
17
+ import { loadProjectionConfig } from './projection.js';
18
+ function parseCsvList(value) {
19
+ const seen = new Set();
20
+ const parsed = [];
21
+ for (const entry of value.split(',')) {
22
+ const normalized = entry.trim();
23
+ if (!normalized || seen.has(normalized)) {
24
+ continue;
25
+ }
26
+ seen.add(normalized);
27
+ parsed.push(normalized);
28
+ }
29
+ return parsed;
30
+ }
31
+ function getArgValue(args, flag) {
32
+ const idx = args.indexOf(flag);
33
+ if (idx < 0) {
34
+ return undefined;
35
+ }
36
+ const value = args[idx + 1];
37
+ if (value == null || value.startsWith('--')) {
38
+ throw new Error(`Missing value for ${flag}`);
39
+ }
40
+ return value;
41
+ }
42
+ export function resolveFilterOverrides(base, includeArg, excludeArg) {
43
+ const includeFromCli = includeArg === undefined ? undefined : parseCsvList(includeArg);
44
+ const excludeFromCli = excludeArg === undefined ? undefined : parseCsvList(excludeArg);
45
+ const includeSource = includeFromCli ?? base.include ?? [];
46
+ const excludeSource = excludeFromCli ?? base.exclude ?? [];
47
+ const excludeSet = new Set(excludeSource);
48
+ const include = includeSource.filter((name) => !excludeSet.has(name));
49
+ return {
50
+ include,
51
+ exclude: excludeSource
52
+ };
53
+ }
54
+ function warnUnknownFilterNames(filterName, requested, availableTypeNames) {
55
+ const unknown = getUnknownFilterNames(requested, availableTypeNames);
56
+ if (unknown.length === 0) {
57
+ return;
58
+ }
59
+ const availableList = availableTypeNames.length > 0
60
+ ? availableTypeNames.join(', ')
61
+ : '(none)';
62
+ console.warn(`Warning: Unknown ${filterName} type name(s): ${unknown.join(', ')}. Available types: ${availableList}`);
63
+ }
64
+ export function getUnknownFilterNames(requested, availableTypeNames) {
65
+ if (!requested || requested.length === 0) {
66
+ return [];
67
+ }
68
+ const available = new Set(availableTypeNames);
69
+ return requested.filter((name) => !available.has(name));
70
+ }
16
71
  // ────────────────────────────────────────────────────────────────────────────
17
72
  // Helpers
18
73
  // ────────────────────────────────────────────────────────────────────────────
@@ -26,6 +81,14 @@ USAGE
26
81
  OPTIONS
27
82
  --config <path> Path to langium-config.json (default: langium-config.json)
28
83
  --out <path> Output file path (default: <out>/zod-schemas.ts)
84
+ --include <csv> Comma-separated type allowlist
85
+ --exclude <csv> Comma-separated type blocklist
86
+ --projection <file> Projection config JSON file
87
+ --strip-internals Strip internal Langium metadata fields
88
+ --conformance Generate conformance artifact
89
+ --ast-types <path> Path to generated AST declarations (ast.ts)
90
+ --conformance-out <path> Output path for conformance artifact
91
+ --cross-ref-validation Emit runtime cross-reference schema factories
29
92
  --help Show this help message
30
93
 
31
94
  CONFIGURATION
@@ -88,6 +151,21 @@ export async function generate(opts) {
88
151
  ? resolve(configDir, langiumConfig.out)
89
152
  : resolve(configDir, 'src/generated');
90
153
  const outputPath = userConfig.outputPath ?? join(outDir, 'zod-schemas.ts');
154
+ const conformanceConfig = userConfig.conformance;
155
+ if (conformanceConfig) {
156
+ const resolvedAstTypesPath = conformanceConfig.astTypesPath
157
+ ? resolve(configDir, conformanceConfig.astTypesPath)
158
+ : langiumConfig.astTypes
159
+ ? resolve(configDir, langiumConfig.astTypes)
160
+ : resolveAstTypesPath(configDir, outDir);
161
+ if (!existsSync(resolvedAstTypesPath)) {
162
+ throw new Error(`Unable to resolve ast types path for conformance: ${resolvedAstTypesPath}`);
163
+ }
164
+ userConfig.conformance = {
165
+ astTypesPath: resolvedAstTypesPath,
166
+ outputPath: conformanceConfig.outputPath
167
+ };
168
+ }
91
169
  // ── 3. Parse grammar using Langium services ──────────────────────────────
92
170
  const { shared, grammar: grammarServices } = createLangiumGrammarServices(NodeFileSystem);
93
171
  void grammarServices; // used only for type-checking if needed later
@@ -102,6 +180,14 @@ export async function generate(opts) {
102
180
  validation: false,
103
181
  });
104
182
  const grammar = entryDocument.parseResult.value;
183
+ const availableTypeNames = [
184
+ ...(grammar.interfaces ?? []).map((entry) => entry.name),
185
+ ...(grammar.types ?? []).map((entry) => entry.name)
186
+ ]
187
+ .filter((name) => typeof name === 'string')
188
+ .sort((left, right) => left.localeCompare(right));
189
+ warnUnknownFilterNames('include', userConfig.include, availableTypeNames);
190
+ warnUnknownFilterNames('exclude', userConfig.exclude, availableTypeNames);
105
191
  // ── 4. Generate schemas ──────────────────────────────────────────────────
106
192
  const { langiumConfig: _ignored, outputPath: _op, ...restConfig } = userConfig;
107
193
  generateZodSchemas({
@@ -114,7 +200,7 @@ export async function generate(opts) {
114
200
  // ────────────────────────────────────────────────────────────────────────────
115
201
  // CLI entry point
116
202
  // ────────────────────────────────────────────────────────────────────────────
117
- async function main() {
203
+ export async function main() {
118
204
  const args = process.argv.slice(2);
119
205
  if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
120
206
  printHelp();
@@ -131,6 +217,14 @@ async function main() {
131
217
  const configFlagValue = configFlagIdx >= 0 ? args[configFlagIdx + 1] : undefined;
132
218
  const outFlagIdx = args.indexOf('--out');
133
219
  const outFlagValue = outFlagIdx >= 0 ? args[outFlagIdx + 1] : undefined;
220
+ const includeFlagValue = getArgValue(args, '--include');
221
+ const excludeFlagValue = getArgValue(args, '--exclude');
222
+ const projectionFlagValue = getArgValue(args, '--projection');
223
+ const astTypesFlagValue = getArgValue(args, '--ast-types');
224
+ const conformanceOutFlagValue = getArgValue(args, '--conformance-out');
225
+ const stripInternalsEnabled = args.includes('--strip-internals');
226
+ const conformanceEnabled = args.includes('--conformance');
227
+ const crossRefValidationEnabled = args.includes('--cross-ref-validation');
134
228
  // ── Locate langium-config.json ───────────────────────────────────────────
135
229
  const configFileName = configFlagValue ?? 'langium-config.json';
136
230
  const langiumConfigPath = resolve(process.cwd(), configFileName);
@@ -152,6 +246,39 @@ async function main() {
152
246
  if (outFlagValue) {
153
247
  userConfig = { ...userConfig, outputPath: resolve(process.cwd(), outFlagValue) };
154
248
  }
249
+ const filterOverrides = resolveFilterOverrides(userConfig, includeFlagValue, excludeFlagValue);
250
+ userConfig = {
251
+ ...userConfig,
252
+ ...filterOverrides
253
+ };
254
+ if (projectionFlagValue) {
255
+ const projectionPath = resolve(process.cwd(), projectionFlagValue);
256
+ userConfig = {
257
+ ...userConfig,
258
+ projection: loadProjectionConfig(projectionPath)
259
+ };
260
+ }
261
+ if (stripInternalsEnabled) {
262
+ userConfig = {
263
+ ...userConfig,
264
+ stripInternals: true
265
+ };
266
+ }
267
+ if (conformanceEnabled) {
268
+ userConfig = {
269
+ ...userConfig,
270
+ conformance: {
271
+ astTypesPath: astTypesFlagValue ? resolve(process.cwd(), astTypesFlagValue) : undefined,
272
+ outputPath: conformanceOutFlagValue ? resolve(process.cwd(), conformanceOutFlagValue) : undefined
273
+ }
274
+ };
275
+ }
276
+ if (crossRefValidationEnabled) {
277
+ userConfig = {
278
+ ...userConfig,
279
+ crossRefValidation: true
280
+ };
281
+ }
155
282
  try {
156
283
  await generate({ langiumConfigPath, config: userConfig });
157
284
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Grammar, LangiumCoreServices } from 'langium';
2
2
  import type { AstTypesLike } from './types.js';
3
+ import type { ProjectionConfig } from './projection.js';
3
4
  export interface FilterConfig {
4
5
  include?: string[];
5
6
  exclude?: string[];
@@ -9,6 +10,13 @@ export interface ZodGeneratorConfig extends FilterConfig {
9
10
  services?: LangiumCoreServices;
10
11
  outputPath?: string;
11
12
  astTypes?: AstTypesLike;
13
+ projection?: ProjectionConfig;
14
+ stripInternals?: boolean;
15
+ crossRefValidation?: boolean;
16
+ conformance?: {
17
+ astTypesPath?: string;
18
+ outputPath?: string;
19
+ };
12
20
  /**
13
21
  * Override the generated schema for specific type names.
14
22
  *
@@ -26,6 +34,24 @@ export interface ZodGeneratorConfig extends FilterConfig {
26
34
  * ```
27
35
  */
28
36
  regexOverrides?: Record<string, string>;
37
+ /**
38
+ * When `true`, emit `.meta({ title, description? })` on generated Zod schemas
39
+ * using humanized property/type names as `title` and JSDoc comments from the grammar
40
+ * as `description`. The `description` field is only included when a JSDoc/grammar
41
+ * comment exists for the corresponding type or property. Useful for zod-to-forms
42
+ * integrations that derive field labels from metadata.
43
+ */
44
+ formMetadata?: boolean;
45
+ /**
46
+ * Controls how object schemas are emitted.
47
+ * - `'loose'` (default): emits `z.looseObject(...)` which allows extra properties to
48
+ * pass through unchanged.
49
+ * - `'strict'`: emits `z.object(...)` (the standard Zod object). This strips unknown
50
+ * properties by default instead of rejecting them with a validation error. Consumers
51
+ * can call `.strict()` on the emitted schema if they need hard rejection of unknown
52
+ * properties.
53
+ */
54
+ objectStyle?: 'loose' | 'strict';
29
55
  }
30
56
  export declare const DEFAULT_OUTPUT_PATH = "src/generated/zod-schemas.ts";
31
57
  export declare function normalizeFilterConfig(config?: FilterConfig): Required<FilterConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,CAKnF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC;AAED,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,CAKnF"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAElE,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IAC1D,OAAO;QACN,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;QAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;KAC9B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA0DA,MAAM,CAAC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAElE,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IAC1D,OAAO;QACN,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;QAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;KAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ProjectionConfig } from './projection.js';
2
+ export interface ConformanceGenerationOptions {
3
+ schemaOutputPath: string;
4
+ conformanceOutputPath?: string;
5
+ astTypesPath: string;
6
+ schemaTypeNames: string[];
7
+ stripFields: string[];
8
+ projection?: ProjectionConfig;
9
+ }
10
+ export declare function inferConformanceOutputPath(schemaOutputPath: string, overridePath?: string): string;
11
+ export declare function collectAstExportNames(astTypesPath: string): Set<string>;
12
+ export declare function generateConformanceSource(options: ConformanceGenerationOptions): {
13
+ source: string;
14
+ missingAstTypes: string[];
15
+ };
16
+ export declare function resolveAstTypesPath(configDir: string, langiumOutDir: string, explicitAstTypesPath?: string): string;
17
+ //# sourceMappingURL=conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,4BAA4B;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAuBD,wBAAgB,0BAA0B,CACzC,gBAAgB,EAAE,MAAM,EACxB,YAAY,CAAC,EAAE,MAAM,GACnB,MAAM,CASR;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAevE;AAED,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,4BAA4B,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CA2D/C;AAED,wBAAgB,mBAAmB,CAClC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAKR"}
@@ -0,0 +1,100 @@
1
+ import { dirname, extname, relative, resolve } from 'node:path';
2
+ import { readFileSync } from 'node:fs';
3
+ function toPosixPath(path) {
4
+ return path.split('\\').join('/');
5
+ }
6
+ function ensureImportPath(path) {
7
+ if (path.startsWith('.')) {
8
+ return path;
9
+ }
10
+ return `./${path}`;
11
+ }
12
+ function replaceWithJsExtension(path) {
13
+ if (path.endsWith('.ts')) {
14
+ return `${path.slice(0, -3)}.js`;
15
+ }
16
+ if (!extname(path)) {
17
+ return `${path}.js`;
18
+ }
19
+ return path;
20
+ }
21
+ export function inferConformanceOutputPath(schemaOutputPath, overridePath) {
22
+ if (overridePath) {
23
+ return overridePath;
24
+ }
25
+ if (schemaOutputPath.endsWith('.ts')) {
26
+ return `${schemaOutputPath.slice(0, -3)}.conformance.ts`;
27
+ }
28
+ return `${schemaOutputPath}.conformance.ts`;
29
+ }
30
+ export function collectAstExportNames(astTypesPath) {
31
+ const source = readFileSync(astTypesPath, 'utf8');
32
+ const names = new Set();
33
+ const re = /export\s+(?:interface|type)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g;
34
+ let match = re.exec(source);
35
+ while (match) {
36
+ const name = match[1];
37
+ if (name) {
38
+ names.add(name);
39
+ }
40
+ match = re.exec(source);
41
+ }
42
+ return names;
43
+ }
44
+ export function generateConformanceSource(options) {
45
+ const conformanceDir = dirname(options.conformanceOutputPath ?? options.schemaOutputPath);
46
+ const astImport = ensureImportPath(toPosixPath(replaceWithJsExtension(relative(conformanceDir, options.astTypesPath))));
47
+ const schemaImport = ensureImportPath(toPosixPath(replaceWithJsExtension(relative(conformanceDir, options.schemaOutputPath))));
48
+ const astExports = collectAstExportNames(options.astTypesPath);
49
+ const matchedSchemaNames = [];
50
+ const missingAstTypes = [];
51
+ for (const typeName of options.schemaTypeNames) {
52
+ if (astExports.has(typeName)) {
53
+ matchedSchemaNames.push(typeName);
54
+ }
55
+ else {
56
+ missingAstTypes.push(typeName);
57
+ }
58
+ }
59
+ const stripUnion = options.stripFields.length > 0
60
+ ? options.stripFields.map((field) => JSON.stringify(field)).join(' | ')
61
+ : 'never';
62
+ const schemaImports = matchedSchemaNames.map((name) => `${name}Schema`).join(', ');
63
+ const lines = [
64
+ '// generated conformance file',
65
+ "import type { z } from 'zod';",
66
+ `import type * as AST from ${JSON.stringify(astImport)};`
67
+ ];
68
+ if (schemaImports.length > 0) {
69
+ lines.push(`import { ${schemaImports} } from ${JSON.stringify(schemaImport)};`);
70
+ }
71
+ lines.push('');
72
+ lines.push(`type _Internals = ${stripUnion};`);
73
+ lines.push('type _Surface<T> = _Internals extends never ? T : Omit<T, _Internals>;');
74
+ lines.push('');
75
+ for (const typeName of matchedSchemaNames) {
76
+ const projectedFields = options.projection?.types?.[typeName]?.fields;
77
+ let surfaceType;
78
+ if (Array.isArray(projectedFields)) {
79
+ const allowlist = ['$type', ...projectedFields].map((f) => JSON.stringify(f)).join(' | ');
80
+ surfaceType = `Pick<_Surface<AST.${typeName}>, ${allowlist}>`;
81
+ }
82
+ else {
83
+ surfaceType = `_Surface<AST.${typeName}>`;
84
+ }
85
+ lines.push(`type _Fwd_${typeName} = z.infer<typeof ${typeName}Schema> extends ${surfaceType} ? true : never;`);
86
+ lines.push(`type _Rev_${typeName} = ${surfaceType} extends z.infer<typeof ${typeName}Schema> ? true : never;`);
87
+ lines.push('');
88
+ }
89
+ return {
90
+ source: `${lines.join('\n').trim()}\n`,
91
+ missingAstTypes
92
+ };
93
+ }
94
+ export function resolveAstTypesPath(configDir, langiumOutDir, explicitAstTypesPath) {
95
+ if (explicitAstTypesPath) {
96
+ return resolve(configDir, explicitAstTypesPath);
97
+ }
98
+ return resolve(langiumOutDir, 'ast.ts');
99
+ }
100
+ //# sourceMappingURL=conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EAKZ,iBAAiB,EAEjB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6QhD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,iBAAiB,EAAE,CAqKzG"}
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EAKZ,iBAAiB,EAEjB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqShD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,iBAAiB,EAAE,CAwKzG"}