@formspec/build 0.1.0-alpha.37 → 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":"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"}
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";
@@ -2147,6 +2147,16 @@ function buildSupportingDeclarations(sourceFile, extensionTypeNames) {
2147
2147
  return true;
2148
2148
  }).map((statement) => statement.getText(sourceFile));
2149
2149
  }
2150
+ function pushUniqueCompilerDiagnostics(target, additions) {
2151
+ for (const diagnostic of additions) {
2152
+ if ((diagnostic.code === "UNSUPPORTED_CUSTOM_TYPE_OVERRIDE" || diagnostic.code === "SYNTHETIC_SETUP_FAILURE") && target.some(
2153
+ (existing) => existing.code === diagnostic.code && existing.message === diagnostic.message
2154
+ )) {
2155
+ continue;
2156
+ }
2157
+ target.push(diagnostic);
2158
+ }
2159
+ }
2150
2160
  function renderSyntheticArgumentExpression(valueKind, argumentText) {
2151
2161
  const trimmed = argumentText.trim();
2152
2162
  if (trimmed === "") {
@@ -2413,6 +2423,16 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
2413
2423
  if (result.diagnostics.length === 0) {
2414
2424
  return [];
2415
2425
  }
2426
+ const setupDiagnostic = result.diagnostics.find((diagnostic) => diagnostic.kind !== "typescript");
2427
+ if (setupDiagnostic !== void 0) {
2428
+ return [
2429
+ makeDiagnostic(
2430
+ setupDiagnostic.kind === "unsupported-custom-type-override" ? "UNSUPPORTED_CUSTOM_TYPE_OVERRIDE" : "SYNTHETIC_SETUP_FAILURE",
2431
+ setupDiagnostic.message,
2432
+ provenance
2433
+ )
2434
+ ];
2435
+ }
2416
2436
  const expectedLabel = definition.valueKind === null ? "compatible argument" : capabilityLabel(definition.valueKind);
2417
2437
  return [
2418
2438
  makeDiagnostic(
@@ -2578,7 +2598,7 @@ function parseTSDocTags(node, file = "", options) {
2578
2598
  options
2579
2599
  );
2580
2600
  if (compilerDiagnostics.length > 0) {
2581
- diagnostics.push(...compilerDiagnostics);
2601
+ pushUniqueCompilerDiagnostics(diagnostics, compilerDiagnostics);
2582
2602
  continue;
2583
2603
  }
2584
2604
  const constraintNode = parseConstraintTagValue(
@@ -2665,7 +2685,7 @@ function parseTSDocTags(node, file = "", options) {
2665
2685
  options
2666
2686
  );
2667
2687
  if (compilerDiagnostics.length > 0) {
2668
- diagnostics.push(...compilerDiagnostics);
2688
+ pushUniqueCompilerDiagnostics(diagnostics, compilerDiagnostics);
2669
2689
  continue;
2670
2690
  }
2671
2691
  const constraintNode = parseConstraintTagValue(
@@ -2699,7 +2719,7 @@ function parseTSDocTags(node, file = "", options) {
2699
2719
  options
2700
2720
  );
2701
2721
  if (compilerDiagnostics.length > 0) {
2702
- diagnostics.push(...compilerDiagnostics);
2722
+ pushUniqueCompilerDiagnostics(diagnostics, compilerDiagnostics);
2703
2723
  continue;
2704
2724
  }
2705
2725
  const constraintNode = parseConstraintTagValue(
@@ -5123,29 +5143,35 @@ function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPol
5123
5143
  discriminatorOptions
5124
5144
  );
5125
5145
  }
5126
- function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5146
+ function analyzeNamedTypeToIRFromProgramContextDetailed(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5127
5147
  const analysisFilePath = path.resolve(filePath);
5128
5148
  const classDecl = findClassByName(ctx.sourceFile, typeName);
5129
5149
  if (classDecl !== null) {
5130
- return analyzeClassToIR(
5131
- classDecl,
5132
- ctx.checker,
5133
- analysisFilePath,
5134
- extensionRegistry,
5135
- metadataPolicy,
5136
- discriminatorOptions
5137
- );
5150
+ return {
5151
+ ok: true,
5152
+ analysis: analyzeClassToIR(
5153
+ classDecl,
5154
+ ctx.checker,
5155
+ analysisFilePath,
5156
+ extensionRegistry,
5157
+ metadataPolicy,
5158
+ discriminatorOptions
5159
+ )
5160
+ };
5138
5161
  }
5139
5162
  const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
5140
5163
  if (interfaceDecl !== null) {
5141
- return analyzeInterfaceToIR(
5142
- interfaceDecl,
5143
- ctx.checker,
5144
- analysisFilePath,
5145
- extensionRegistry,
5146
- metadataPolicy,
5147
- discriminatorOptions
5148
- );
5164
+ return {
5165
+ ok: true,
5166
+ analysis: analyzeInterfaceToIR(
5167
+ interfaceDecl,
5168
+ ctx.checker,
5169
+ analysisFilePath,
5170
+ extensionRegistry,
5171
+ metadataPolicy,
5172
+ discriminatorOptions
5173
+ )
5174
+ };
5149
5175
  }
5150
5176
  const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
5151
5177
  if (typeAlias !== null) {
@@ -5158,11 +5184,20 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5158
5184
  discriminatorOptions
5159
5185
  );
5160
5186
  if (result.ok) {
5161
- return result.analysis;
5187
+ return { ok: true, analysis: result.analysis };
5162
5188
  }
5163
5189
  const fallbackEligible = result.kind === "not-object-like" && isResolvableObjectLikeAliasTypeNode(typeAlias.type) && containsTypeReferenceInObjectLikeAlias(typeAlias.type);
5164
5190
  if (!fallbackEligible) {
5165
- 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
+ };
5166
5201
  }
5167
5202
  const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(
5168
5203
  typeAlias.type,
@@ -5171,9 +5206,16 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5171
5206
  if (duplicatePropertyNames.length > 0) {
5172
5207
  const sourceFile = typeAlias.getSourceFile();
5173
5208
  const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
5174
- throw new Error(
5175
- `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
5176
- );
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
+ };
5177
5219
  }
5178
5220
  const rootInfo = analyzeDeclarationRootInfo(
5179
5221
  typeAlias,
@@ -5203,13 +5245,71 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5203
5245
  diagnostics
5204
5246
  );
5205
5247
  if (fallbackAnalysis !== null) {
5206
- return fallbackAnalysis;
5248
+ return { ok: true, analysis: fallbackAnalysis };
5207
5249
  }
5208
- 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
+ };
5209
5260
  }
5210
- throw new Error(
5211
- `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
5212
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
+ };
5213
5313
  }
5214
5314
 
5215
5315
  // src/validate/constraint-validator.ts
@@ -5289,11 +5389,25 @@ function validateIR(ir, options) {
5289
5389
 
5290
5390
  // src/generators/class-schema.ts
5291
5391
  function generateClassSchemas(analysis, source, options) {
5292
- 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(
5293
5404
  (diagnostic) => diagnostic.severity === "error"
5294
5405
  );
5295
- if (errorDiagnostics !== void 0 && errorDiagnostics.length > 0) {
5296
- throw new Error(formatValidationError(errorDiagnostics));
5406
+ if (errorDiagnostics.length > 0) {
5407
+ return {
5408
+ ok: false,
5409
+ diagnostics: analysisDiagnostics
5410
+ };
5297
5411
  }
5298
5412
  const ir = canonicalizeTSDoc(
5299
5413
  analysis,
@@ -5307,9 +5421,14 @@ function generateClassSchemas(analysis, source, options) {
5307
5421
  ...options?.vendorPrefix !== void 0 && { vendorPrefix: options.vendorPrefix }
5308
5422
  });
5309
5423
  if (!validationResult.valid) {
5310
- throw new Error(formatValidationError(validationResult.diagnostics));
5424
+ return {
5425
+ ok: false,
5426
+ diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics]
5427
+ };
5311
5428
  }
5312
5429
  return {
5430
+ ok: true,
5431
+ diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],
5313
5432
  jsonSchema: generateJsonSchemaFromIR(ir, options),
5314
5433
  uiSchema: generateUiSchemaFromIR(ir)
5315
5434
  };
@@ -5351,25 +5470,127 @@ function generateSchemasFromClass(options) {
5351
5470
  );
5352
5471
  }
5353
5472
  function generateSchemas(options) {
5354
- 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) {
5355
5517
  return generateSchemasFromProgram({
5356
5518
  ...options,
5357
- program: ctx.program
5519
+ errorReporting: "diagnostics"
5358
5520
  });
5359
5521
  }
5360
- function generateSchemasFromProgram(options) {
5361
- const ctx = createProgramContextFromProgram(options.program, options.filePath);
5362
- 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(
5363
5578
  ctx,
5364
- options.filePath,
5365
- options.typeName,
5579
+ filePath,
5580
+ typeName,
5366
5581
  options.extensionRegistry,
5367
5582
  options.metadata,
5368
5583
  options.discriminator
5369
5584
  );
5370
- return generateClassSchemas(
5371
- analysis,
5372
- { 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 },
5373
5594
  {
5374
5595
  extensionRegistry: options.extensionRegistry,
5375
5596
  metadata: options.metadata,
@@ -5377,6 +5598,27 @@ function generateSchemasFromProgram(options) {
5377
5598
  }
5378
5599
  );
5379
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
+ }
5380
5622
 
5381
5623
  // src/static-build.ts
5382
5624
  import * as ts6 from "typescript";
@@ -5414,8 +5656,11 @@ function resolveModuleExportDeclaration(context, exportName = "default") {
5414
5656
  // src/generators/discovered-schema.ts
5415
5657
  import * as ts7 from "typescript";
5416
5658
  import { IR_VERSION as IR_VERSION3 } from "@formspec/core/internals";
5417
- function toDiscoveredTypeSchemas(result) {
5418
- return result;
5659
+ function toDiscoveredTypeSchemas(result, resolvedMetadata) {
5660
+ return {
5661
+ ...result,
5662
+ ...resolvedMetadata !== void 0 && { resolvedMetadata }
5663
+ };
5419
5664
  }
5420
5665
  function isNamedTypeDeclaration(declaration) {
5421
5666
  return ts7.isClassDeclaration(declaration) || ts7.isInterfaceDeclaration(declaration) || ts7.isTypeAliasDeclaration(declaration);
@@ -5563,7 +5808,8 @@ function generateSchemasFromAnalysis(analysis, filePath, options) {
5563
5808
  metadata: options?.metadata,
5564
5809
  vendorPrefix: options?.vendorPrefix
5565
5810
  }
5566
- )
5811
+ ),
5812
+ analysis.metadata
5567
5813
  );
5568
5814
  }
5569
5815
  function generateSchemasFromResolvedType(options, skipNamedDeclaration = false, rootOverride) {
@@ -5621,7 +5867,8 @@ function generateSchemasFromResolvedType(options, skipNamedDeclaration = false,
5621
5867
  }
5622
5868
  return {
5623
5869
  jsonSchema: toStandaloneJsonSchema(root, typeRegistry, options),
5624
- uiSchema: null
5870
+ uiSchema: null,
5871
+ ...root.metadata !== void 0 && { resolvedMetadata: root.metadata }
5625
5872
  };
5626
5873
  }
5627
5874
  function generateSchemasFromDeclaration(options) {
@@ -5960,10 +6207,14 @@ export {
5960
6207
  createStaticBuildContextFromProgram,
5961
6208
  generateJsonSchema,
5962
6209
  generateSchemas,
6210
+ generateSchemasBatch,
6211
+ generateSchemasBatchFromProgram,
6212
+ generateSchemasDetailed,
5963
6213
  generateSchemasFromClass,
5964
6214
  generateSchemasFromDeclaration,
5965
6215
  generateSchemasFromParameter,
5966
6216
  generateSchemasFromProgram,
6217
+ generateSchemasFromProgramDetailed,
5967
6218
  generateSchemasFromReturnType,
5968
6219
  generateSchemasFromType,
5969
6220
  generateUiSchema,