@formspec/build 0.1.0-alpha.38 → 0.1.0-alpha.39

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/dist/index.d.ts CHANGED
@@ -35,15 +35,19 @@ export type { JSONSchema7, JSONSchemaType, ExtendedJSONSchema7, FormSpecSchemaEx
35
35
  export { createExtensionRegistry } from "./extensions/index.js";
36
36
  export type { ExtensionRegistry } from "./extensions/index.js";
37
37
  export type { UISchema, UISchemaElement, UISchemaElementBase, UISchemaElementType, ControlElement, VerticalLayout, HorizontalLayout, GroupLayout, Categorization, Category, LabelElement, Rule, RuleEffect, RuleConditionSchema, SchemaBasedCondition, } from "./ui-schema/types.js";
38
- export type { DiscriminatorResolutionOptions, GenerateFromClassOptions, GenerateFromClassResult, GenerateSchemasOptions, GenerateSchemasFromProgramOptions, StaticSchemaGenerationOptions, } from "./generators/class-schema.js";
38
+ export type { DetailedClassSchemasResult, DetailedSchemaGenerationTargetResult, DiscriminatorResolutionOptions, GenerateFromClassOptions, GenerateFromClassResult, GenerateSchemasOptions, GenerateSchemasBatchFromProgramOptions, GenerateSchemasBatchOptions, GenerateSchemasFromProgramOptions, SchemaGenerationTarget, StaticSchemaGenerationOptions, } from "./generators/class-schema.js";
39
39
  export type { StaticBuildContext } from "./static-build.js";
40
+ export type { ValidateIROptions, ValidationDiagnostic, ValidationDiagnosticLocation, ValidationDiagnosticSeverity, ValidationResult, } from "./validate/index.js";
40
41
  export type { DiscoveredTypeSchemas, GenerateSchemasFromDeclarationOptions, GenerateSchemasFromParameterOptions, GenerateSchemasFromReturnTypeOptions, GenerateSchemasFromTypeOptions, SchemaSourceDeclaration, } from "./generators/discovered-schema.js";
41
42
  export type { BuildMixedAuthoringSchemasOptions, MixedAuthoringSchemas, } from "./generators/mixed-authoring.js";
42
43
  export { jsonSchema7Schema } from "./json-schema/schema.js";
43
44
  export { uiSchema as uiSchemaSchema } from "./ui-schema/schema.js";
44
45
  export { generateJsonSchema } from "./json-schema/generator.js";
45
46
  export { generateUiSchema } from "./ui-schema/generator.js";
46
- export { generateSchemasFromClass, generateSchemas, generateSchemasFromProgram, } from "./generators/class-schema.js";
47
+ export { generateSchemasBatch, generateSchemasBatchFromProgram, generateSchemasFromClass, } from "./generators/class-schema.js";
48
+ export { generateSchemas } from "./generators/class-schema.js";
49
+ export { generateSchemasFromProgram } from "./generators/class-schema.js";
50
+ export { generateSchemasDetailed, generateSchemasFromProgramDetailed, } from "./generators/class-schema.js";
47
51
  export { createStaticBuildContext, createStaticBuildContextFromProgram, resolveModuleExport, resolveModuleExportDeclaration, } from "./static-build.js";
48
52
  export { generateSchemasFromDeclaration, generateSchemasFromParameter, generateSchemasFromReturnType, generateSchemasFromType, } from "./generators/discovered-schema.js";
49
53
  export { buildMixedAuthoringSchemas } from "./generators/mixed-authoring.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAsB,KAAK,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAChG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQrD,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EACV,uCAAuC,EACvC,yBAAyB,EACzB,4BAA4B,EAC5B,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EACR,KAAK,EACL,WAAW,EACX,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,YAAY,EACV,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,0BAA0B,EAC1B,oCAAoC,EACpC,8BAA8B,EAC9B,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,sCAAsC,EACtC,2BAA2B,EAC3B,iCAAiC,EACjC,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,4BAA4B,EAC5B,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,qBAAqB,EACrB,qCAAqC,EACrC,mCAAmC,EACnC,oCAAoC,EACpC,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,iCAAiC,EACjC,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAMnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EACL,uBAAuB,EACvB,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,wBAAwB,EACxB,mCAAmC,EACnC,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBACf,SAAQ,yBAAyB,EAAE,uBAAuB;CAAG;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,WAAW,EAAE,EAC/D,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,WAAW,CAKb;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,yBAAyB;IACpE,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,WAAW,EAAE,EAC3D,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAsBpB"}
package/dist/index.js CHANGED
@@ -1971,7 +1971,7 @@ var jsonSchema7Schema = z3.lazy(
1971
1971
  );
1972
1972
 
1973
1973
  // src/generators/class-schema.ts
1974
- import "typescript";
1974
+ import * as ts5 from "typescript";
1975
1975
 
1976
1976
  // src/analyzer/program.ts
1977
1977
  import * as ts4 from "typescript";
@@ -5143,29 +5143,35 @@ function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPol
5143
5143
  discriminatorOptions
5144
5144
  );
5145
5145
  }
5146
- function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5146
+ function analyzeNamedTypeToIRFromProgramContextDetailed(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5147
5147
  const analysisFilePath = path.resolve(filePath);
5148
5148
  const classDecl = findClassByName(ctx.sourceFile, typeName);
5149
5149
  if (classDecl !== null) {
5150
- return analyzeClassToIR(
5151
- classDecl,
5152
- ctx.checker,
5153
- analysisFilePath,
5154
- extensionRegistry,
5155
- metadataPolicy,
5156
- discriminatorOptions
5157
- );
5150
+ return {
5151
+ ok: true,
5152
+ analysis: analyzeClassToIR(
5153
+ classDecl,
5154
+ ctx.checker,
5155
+ analysisFilePath,
5156
+ extensionRegistry,
5157
+ metadataPolicy,
5158
+ discriminatorOptions
5159
+ )
5160
+ };
5158
5161
  }
5159
5162
  const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
5160
5163
  if (interfaceDecl !== null) {
5161
- return analyzeInterfaceToIR(
5162
- interfaceDecl,
5163
- ctx.checker,
5164
- analysisFilePath,
5165
- extensionRegistry,
5166
- metadataPolicy,
5167
- discriminatorOptions
5168
- );
5164
+ return {
5165
+ ok: true,
5166
+ analysis: analyzeInterfaceToIR(
5167
+ interfaceDecl,
5168
+ ctx.checker,
5169
+ analysisFilePath,
5170
+ extensionRegistry,
5171
+ metadataPolicy,
5172
+ discriminatorOptions
5173
+ )
5174
+ };
5169
5175
  }
5170
5176
  const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
5171
5177
  if (typeAlias !== null) {
@@ -5178,11 +5184,20 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5178
5184
  discriminatorOptions
5179
5185
  );
5180
5186
  if (result.ok) {
5181
- return result.analysis;
5187
+ return { ok: true, analysis: result.analysis };
5182
5188
  }
5183
5189
  const fallbackEligible = result.kind === "not-object-like" && isResolvableObjectLikeAliasTypeNode(typeAlias.type) && containsTypeReferenceInObjectLikeAlias(typeAlias.type);
5184
5190
  if (!fallbackEligible) {
5185
- throw new Error(result.error);
5191
+ return {
5192
+ ok: false,
5193
+ diagnostics: [
5194
+ makeProgramDiagnostic(
5195
+ result.kind === "duplicate-properties" ? "DUPLICATE_ROOT_PROPERTIES" : "UNSUPPORTED_ROOT_TYPE",
5196
+ result.error,
5197
+ makeNodeProvenance(typeAlias, analysisFilePath)
5198
+ )
5199
+ ]
5200
+ };
5186
5201
  }
5187
5202
  const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(
5188
5203
  typeAlias.type,
@@ -5191,9 +5206,16 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5191
5206
  if (duplicatePropertyNames.length > 0) {
5192
5207
  const sourceFile = typeAlias.getSourceFile();
5193
5208
  const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
5194
- throw new Error(
5195
- `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
5196
- );
5209
+ return {
5210
+ ok: false,
5211
+ diagnostics: [
5212
+ makeProgramDiagnostic(
5213
+ "DUPLICATE_ROOT_PROPERTIES",
5214
+ `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`,
5215
+ makeNodeProvenance(typeAlias, analysisFilePath)
5216
+ )
5217
+ ]
5218
+ };
5197
5219
  }
5198
5220
  const rootInfo = analyzeDeclarationRootInfo(
5199
5221
  typeAlias,
@@ -5223,13 +5245,71 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5223
5245
  diagnostics
5224
5246
  );
5225
5247
  if (fallbackAnalysis !== null) {
5226
- return fallbackAnalysis;
5248
+ return { ok: true, analysis: fallbackAnalysis };
5227
5249
  }
5228
- throw new Error(result.error);
5250
+ return {
5251
+ ok: false,
5252
+ diagnostics: [
5253
+ makeProgramDiagnostic(
5254
+ "UNSUPPORTED_ROOT_TYPE",
5255
+ result.error,
5256
+ makeNodeProvenance(typeAlias, analysisFilePath)
5257
+ )
5258
+ ]
5259
+ };
5229
5260
  }
5230
- throw new Error(
5231
- `Type "${typeName}" not found as a class, interface, or type alias in ${analysisFilePath}`
5261
+ return {
5262
+ ok: false,
5263
+ diagnostics: [
5264
+ makeProgramDiagnostic(
5265
+ "TYPE_NOT_FOUND",
5266
+ `Type "${typeName}" not found as a class, interface, or type alias in ${analysisFilePath}`,
5267
+ makeFileProvenance(analysisFilePath)
5268
+ )
5269
+ ]
5270
+ };
5271
+ }
5272
+ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5273
+ const result = analyzeNamedTypeToIRFromProgramContextDetailed(
5274
+ ctx,
5275
+ filePath,
5276
+ typeName,
5277
+ extensionRegistry,
5278
+ metadataPolicy,
5279
+ discriminatorOptions
5232
5280
  );
5281
+ if (result.ok) {
5282
+ return result.analysis;
5283
+ }
5284
+ throw new Error(result.diagnostics.map((diagnostic) => diagnostic.message).join("\n"));
5285
+ }
5286
+ function makeProgramDiagnostic(code, message, primaryLocation) {
5287
+ return {
5288
+ code,
5289
+ message,
5290
+ severity: "error",
5291
+ primaryLocation,
5292
+ relatedLocations: []
5293
+ };
5294
+ }
5295
+ function makeNodeProvenance(node, filePath) {
5296
+ const sourceFile = node.getSourceFile();
5297
+ const position = sourceFile.getLineAndCharacterOfPosition(node.getStart());
5298
+ return {
5299
+ surface: "tsdoc",
5300
+ file: filePath,
5301
+ line: position.line + 1,
5302
+ column: position.character,
5303
+ length: node.getWidth()
5304
+ };
5305
+ }
5306
+ function makeFileProvenance(filePath) {
5307
+ return {
5308
+ surface: "tsdoc",
5309
+ file: filePath,
5310
+ line: 1,
5311
+ column: 0
5312
+ };
5233
5313
  }
5234
5314
 
5235
5315
  // src/validate/constraint-validator.ts
@@ -5309,11 +5389,25 @@ function validateIR(ir, options) {
5309
5389
 
5310
5390
  // src/generators/class-schema.ts
5311
5391
  function generateClassSchemas(analysis, source, options) {
5312
- const errorDiagnostics = analysis.diagnostics?.filter(
5392
+ const result = generateClassSchemasDetailed(analysis, source, options);
5393
+ if (!result.ok || result.jsonSchema === void 0 || result.uiSchema === void 0) {
5394
+ throw new Error(formatValidationError(result.diagnostics));
5395
+ }
5396
+ return {
5397
+ jsonSchema: result.jsonSchema,
5398
+ uiSchema: result.uiSchema
5399
+ };
5400
+ }
5401
+ function generateClassSchemasDetailed(analysis, source, options) {
5402
+ const analysisDiagnostics = analysis.diagnostics ?? [];
5403
+ const errorDiagnostics = analysisDiagnostics.filter(
5313
5404
  (diagnostic) => diagnostic.severity === "error"
5314
5405
  );
5315
- if (errorDiagnostics !== void 0 && errorDiagnostics.length > 0) {
5316
- throw new Error(formatValidationError(errorDiagnostics));
5406
+ if (errorDiagnostics.length > 0) {
5407
+ return {
5408
+ ok: false,
5409
+ diagnostics: analysisDiagnostics
5410
+ };
5317
5411
  }
5318
5412
  const ir = canonicalizeTSDoc(
5319
5413
  analysis,
@@ -5327,9 +5421,14 @@ function generateClassSchemas(analysis, source, options) {
5327
5421
  ...options?.vendorPrefix !== void 0 && { vendorPrefix: options.vendorPrefix }
5328
5422
  });
5329
5423
  if (!validationResult.valid) {
5330
- throw new Error(formatValidationError(validationResult.diagnostics));
5424
+ return {
5425
+ ok: false,
5426
+ diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics]
5427
+ };
5331
5428
  }
5332
5429
  return {
5430
+ ok: true,
5431
+ diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],
5333
5432
  jsonSchema: generateJsonSchemaFromIR(ir, options),
5334
5433
  uiSchema: generateUiSchemaFromIR(ir)
5335
5434
  };
@@ -5371,25 +5470,127 @@ function generateSchemasFromClass(options) {
5371
5470
  );
5372
5471
  }
5373
5472
  function generateSchemas(options) {
5374
- const ctx = createProgramContext(options.filePath);
5473
+ const result = generateSchemasDetailedInternal(options);
5474
+ if (options.errorReporting === "diagnostics") {
5475
+ return result;
5476
+ }
5477
+ if (!result.ok || result.jsonSchema === void 0 || result.uiSchema === void 0) {
5478
+ throw new Error(formatValidationError(result.diagnostics));
5479
+ }
5480
+ return {
5481
+ jsonSchema: result.jsonSchema,
5482
+ uiSchema: result.uiSchema
5483
+ };
5484
+ }
5485
+ function generateSchemasFromProgram(options) {
5486
+ const result = generateSchemasFromProgramDetailedInternal(options);
5487
+ if (options.errorReporting === "diagnostics") {
5488
+ return result;
5489
+ }
5490
+ if (!result.ok || result.jsonSchema === void 0 || result.uiSchema === void 0) {
5491
+ throw new Error(formatValidationError(result.diagnostics));
5492
+ }
5493
+ return {
5494
+ jsonSchema: result.jsonSchema,
5495
+ uiSchema: result.uiSchema
5496
+ };
5497
+ }
5498
+ function generateSchemasDetailed(options) {
5499
+ return generateSchemas({
5500
+ ...options,
5501
+ errorReporting: "diagnostics"
5502
+ });
5503
+ }
5504
+ function generateSchemasDetailedInternal(options) {
5505
+ let ctx;
5506
+ try {
5507
+ ctx = createProgramContext(options.filePath);
5508
+ } catch (error) {
5509
+ return {
5510
+ ok: false,
5511
+ diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)]
5512
+ };
5513
+ }
5514
+ return generateSchemasFromDetailedProgramContext(ctx, options.filePath, options.typeName, options);
5515
+ }
5516
+ function generateSchemasFromProgramDetailed(options) {
5375
5517
  return generateSchemasFromProgram({
5376
5518
  ...options,
5377
- program: ctx.program
5519
+ errorReporting: "diagnostics"
5378
5520
  });
5379
5521
  }
5380
- function generateSchemasFromProgram(options) {
5381
- const ctx = createProgramContextFromProgram(options.program, options.filePath);
5382
- const analysis = analyzeNamedTypeToIRFromProgramContext(
5522
+ function generateSchemasFromProgramDetailedInternal(options) {
5523
+ let ctx;
5524
+ try {
5525
+ ctx = createProgramContextFromProgram(options.program, options.filePath);
5526
+ } catch (error) {
5527
+ return {
5528
+ ok: false,
5529
+ diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)]
5530
+ };
5531
+ }
5532
+ return generateSchemasFromDetailedProgramContext(ctx, options.filePath, options.typeName, options);
5533
+ }
5534
+ function generateSchemasBatch(options) {
5535
+ const contextCache = /* @__PURE__ */ new Map();
5536
+ return options.targets.map((target) => {
5537
+ let ctx;
5538
+ try {
5539
+ const cacheKey = ts5.sys.useCaseSensitiveFileNames ? target.filePath : target.filePath.toLowerCase();
5540
+ const cachedContext = contextCache.get(cacheKey);
5541
+ if (cachedContext === void 0) {
5542
+ ctx = createProgramContext(target.filePath);
5543
+ contextCache.set(cacheKey, ctx);
5544
+ } else {
5545
+ ctx = cachedContext;
5546
+ }
5547
+ } catch (error) {
5548
+ return withTarget(target, {
5549
+ ok: false,
5550
+ diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)]
5551
+ });
5552
+ }
5553
+ return withTarget(
5554
+ target,
5555
+ generateSchemasFromDetailedProgramContext(ctx, target.filePath, target.typeName, options)
5556
+ );
5557
+ });
5558
+ }
5559
+ function generateSchemasBatchFromProgram(options) {
5560
+ return options.targets.map((target) => {
5561
+ let ctx;
5562
+ try {
5563
+ ctx = createProgramContextFromProgram(options.program, target.filePath);
5564
+ } catch (error) {
5565
+ return withTarget(target, {
5566
+ ok: false,
5567
+ diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)]
5568
+ });
5569
+ }
5570
+ return withTarget(
5571
+ target,
5572
+ generateSchemasFromDetailedProgramContext(ctx, target.filePath, target.typeName, options)
5573
+ );
5574
+ });
5575
+ }
5576
+ function generateSchemasFromDetailedProgramContext(ctx, filePath, typeName, options) {
5577
+ const analysisResult = analyzeNamedTypeToIRFromProgramContextDetailed(
5383
5578
  ctx,
5384
- options.filePath,
5385
- options.typeName,
5579
+ filePath,
5580
+ typeName,
5386
5581
  options.extensionRegistry,
5387
5582
  options.metadata,
5388
5583
  options.discriminator
5389
5584
  );
5390
- return generateClassSchemas(
5391
- analysis,
5392
- { file: options.filePath },
5585
+ if (!analysisResult.ok) {
5586
+ return {
5587
+ ok: false,
5588
+ diagnostics: analysisResult.diagnostics
5589
+ };
5590
+ }
5591
+ return generateClassSchemasDetailed(
5592
+ analysisResult.analysis,
5593
+ { file: filePath },
5393
5594
  {
5394
5595
  extensionRegistry: options.extensionRegistry,
5395
5596
  metadata: options.metadata,
@@ -5397,6 +5598,27 @@ function generateSchemasFromProgram(options) {
5397
5598
  }
5398
5599
  );
5399
5600
  }
5601
+ function withTarget(target, result) {
5602
+ return {
5603
+ filePath: target.filePath,
5604
+ typeName: target.typeName,
5605
+ ...result
5606
+ };
5607
+ }
5608
+ function createProgramContextFailureDiagnostic(filePath, error) {
5609
+ return {
5610
+ code: "PROGRAM_CONTEXT_FAILURE",
5611
+ message: error instanceof Error ? error.message : String(error),
5612
+ severity: "error",
5613
+ primaryLocation: {
5614
+ surface: "tsdoc",
5615
+ file: filePath,
5616
+ line: 1,
5617
+ column: 0
5618
+ },
5619
+ relatedLocations: []
5620
+ };
5621
+ }
5400
5622
 
5401
5623
  // src/static-build.ts
5402
5624
  import * as ts6 from "typescript";
@@ -5434,8 +5656,11 @@ function resolveModuleExportDeclaration(context, exportName = "default") {
5434
5656
  // src/generators/discovered-schema.ts
5435
5657
  import * as ts7 from "typescript";
5436
5658
  import { IR_VERSION as IR_VERSION3 } from "@formspec/core/internals";
5437
- function toDiscoveredTypeSchemas(result) {
5438
- return result;
5659
+ function toDiscoveredTypeSchemas(result, resolvedMetadata) {
5660
+ return {
5661
+ ...result,
5662
+ ...resolvedMetadata !== void 0 && { resolvedMetadata }
5663
+ };
5439
5664
  }
5440
5665
  function isNamedTypeDeclaration(declaration) {
5441
5666
  return ts7.isClassDeclaration(declaration) || ts7.isInterfaceDeclaration(declaration) || ts7.isTypeAliasDeclaration(declaration);
@@ -5583,7 +5808,8 @@ function generateSchemasFromAnalysis(analysis, filePath, options) {
5583
5808
  metadata: options?.metadata,
5584
5809
  vendorPrefix: options?.vendorPrefix
5585
5810
  }
5586
- )
5811
+ ),
5812
+ analysis.metadata
5587
5813
  );
5588
5814
  }
5589
5815
  function generateSchemasFromResolvedType(options, skipNamedDeclaration = false, rootOverride) {
@@ -5641,7 +5867,8 @@ function generateSchemasFromResolvedType(options, skipNamedDeclaration = false,
5641
5867
  }
5642
5868
  return {
5643
5869
  jsonSchema: toStandaloneJsonSchema(root, typeRegistry, options),
5644
- uiSchema: null
5870
+ uiSchema: null,
5871
+ ...root.metadata !== void 0 && { resolvedMetadata: root.metadata }
5645
5872
  };
5646
5873
  }
5647
5874
  function generateSchemasFromDeclaration(options) {
@@ -5980,10 +6207,14 @@ export {
5980
6207
  createStaticBuildContextFromProgram,
5981
6208
  generateJsonSchema,
5982
6209
  generateSchemas,
6210
+ generateSchemasBatch,
6211
+ generateSchemasBatchFromProgram,
6212
+ generateSchemasDetailed,
5983
6213
  generateSchemasFromClass,
5984
6214
  generateSchemasFromDeclaration,
5985
6215
  generateSchemasFromParameter,
5986
6216
  generateSchemasFromProgram,
6217
+ generateSchemasFromProgramDetailed,
5987
6218
  generateSchemasFromReturnType,
5988
6219
  generateSchemasFromType,
5989
6220
  generateUiSchema,