@formspec/build 0.1.0-alpha.59 → 0.1.0-alpha.61
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/analyzer/class-analyzer.d.ts +1 -1
- package/dist/analyzer/class-analyzer.d.ts.map +1 -1
- package/dist/analyzer/jsdoc-constraints.d.ts +0 -6
- package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -1
- package/dist/analyzer/tsdoc-parser.d.ts +2 -5
- package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
- package/dist/browser.cjs +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/build-alpha.d.ts +2 -1
- package/dist/build-beta.d.ts +2 -1
- package/dist/build-internal.d.ts +18 -15
- package/dist/build.d.ts +2 -1
- package/dist/canonicalize/chain-dsl-canonicalizer.d.ts +2 -1
- package/dist/canonicalize/chain-dsl-canonicalizer.d.ts.map +1 -1
- package/dist/canonicalize/tsdoc-canonicalizer.d.ts +2 -1
- package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -1
- package/dist/cli.cjs +45 -316
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +48 -319
- package/dist/cli.js.map +1 -1
- package/dist/extensions/registry.d.ts +2 -2
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/generators/method-schema.d.ts +3 -2
- package/dist/generators/method-schema.d.ts.map +1 -1
- package/dist/index.cjs +44 -315
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -318
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +44 -315
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.js +47 -318
- package/dist/internals.js.map +1 -1
- package/dist/metadata/index.d.ts +1 -4
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/policy.d.ts +2 -6
- package/dist/metadata/policy.d.ts.map +1 -1
- package/dist/metadata/resolve.d.ts +3 -2
- package/dist/metadata/resolve.d.ts.map +1 -1
- package/dist/ui-schema/schema.d.ts +11 -28
- package/dist/ui-schema/schema.d.ts.map +1 -1
- package/package.json +6 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/json-schema/generator.ts","../src/canonicalize/chain-dsl-canonicalizer.ts","../src/metadata/policy.ts","../src/metadata/resolve.ts","../src/canonicalize/tsdoc-canonicalizer.ts","../src/metadata/collision-guards.ts","../src/json-schema/ir-generator.ts","../src/ui-schema/generator.ts","../src/ui-schema/schema.ts","../src/ui-schema/ir-generator.ts","../src/extensions/registry.ts","../src/json-schema/schema.ts","../src/generators/class-schema.ts","../src/analyzer/program.ts","../src/analyzer/class-analyzer.ts","../src/analyzer/jsdoc-constraints.ts","../src/analyzer/tsdoc-parser.ts","../src/extensions/resolve-custom-type.ts","../src/extensions/ts-type-utils.ts","../src/analyzer/builtin-brands.ts","../src/extensions/symbol-registry.ts","../src/validate/constraint-validator.ts","../src/static-build.ts","../src/generators/discovered-schema.ts","../src/generators/mixed-authoring.ts"],"sourcesContent":["/**\n * `@formspec/build` - Build tools for FormSpec\n *\n * This package provides generators to compile FormSpec forms into:\n * - JSON Schema 2020-12 (for validation)\n * - JSON Forms UI Schema (for rendering)\n *\n * @example\n * ```typescript\n * import { buildFormSchemas } from \"@formspec/build\";\n * import { formspec, field, group } from \"@formspec/dsl\";\n *\n * const form = formspec(\n * group(\"Customer\",\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.text(\"email\", { label: \"Email\" }),\n * ),\n * );\n *\n * const { jsonSchema, uiSchema } = buildFormSchemas(form);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { FormElement, FormSpec, LoggerLike } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { generateJsonSchema, type GenerateJsonSchemaOptions } from \"./json-schema/generator.js\";\nimport { generateUiSchema, type GenerateUiSchemaOptions } from \"./ui-schema/generator.js\";\nimport { type JsonSchema2020 } from \"./json-schema/ir-generator.js\";\nimport type { UISchema } from \"./ui-schema/types.js\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type { JsonSchema2020 } from \"./json-schema/ir-generator.js\";\nexport type { GenerateJsonSchemaOptions } from \"./json-schema/generator.js\";\nexport type { GenerateUiSchemaOptions } from \"./ui-schema/generator.js\";\nexport type {\n BuiltinConstraintBroadeningRegistration,\n ConstraintTagRegistration,\n CustomAnnotationRegistration,\n CustomConstraintRegistration,\n CustomTypeRegistration,\n ExtensionDefinition,\n AnyField,\n ArrayField,\n BooleanField,\n Conditional,\n DynamicEnumField,\n DynamicSchemaField,\n EnumOption,\n EnumOptionValue,\n FormElement,\n FormSpec,\n Group,\n NumberField,\n ObjectField,\n StaticEnumField,\n TextField,\n} from \"@formspec/core\";\n\nexport type {\n JSONSchema7,\n JSONSchemaType,\n ExtendedJSONSchema7,\n FormSpecSchemaExtensions,\n} from \"./json-schema/types.js\";\n\nexport { createExtensionRegistry } from \"./extensions/index.js\";\nexport type {\n ExtensionRegistry,\n ExtensionTypeLookupResult,\n MutableExtensionRegistry,\n} from \"./extensions/index.js\";\n/**\n * A simplified TypeScript diagnostic surfaced from the synthetic compiler pass.\n *\n * Re-exported here because {@link ExtensionRegistry.setupDiagnostics} (an\n * `@internal` field on a `@public` interface) references this type directly.\n * API Extractor requires every type transitively referenced through a public\n * surface to be exported from the package entry point, even when the field\n * carrying it is marked `@internal`.\n *\n * @internal\n */\nexport type { SyntheticCompilerDiagnostic } from \"@formspec/analysis/internal\";\nexport type { FormSpecConfig } from \"@formspec/config\";\n\nexport type {\n UISchema,\n UISchemaElement,\n UISchemaElementBase,\n UISchemaElementType,\n ControlElement,\n VerticalLayout,\n HorizontalLayout,\n GroupLayout,\n Categorization,\n Category,\n LabelElement,\n Rule,\n RuleEffect,\n RuleConditionSchema,\n SchemaBasedCondition,\n} from \"./ui-schema/types.js\";\n\nexport type {\n DetailedClassSchemasResult,\n DetailedSchemaGenerationTargetResult,\n DiscriminatorResolutionOptions,\n GenerateFromClassOptions,\n GenerateFromClassResult,\n GenerateSchemasOptions,\n GenerateSchemasBatchFromProgramOptions,\n GenerateSchemasBatchOptions,\n GenerateSchemasFromProgramOptions,\n SchemaGenerationTarget,\n StaticSchemaGenerationOptions,\n} from \"./generators/class-schema.js\";\nexport type { StaticBuildContext } from \"./static-build.js\";\nexport type {\n ValidateIROptions,\n ValidationDiagnostic,\n ValidationDiagnosticLocation,\n ValidationDiagnosticSeverity,\n ValidationResult,\n} from \"./validate/index.js\";\nexport type {\n DiscoveredTypeSchemas,\n GenerateSchemasFromDeclarationOptions,\n MetadataSourceDeclaration,\n GenerateSchemasFromParameterOptions,\n GenerateSchemasFromReturnTypeOptions,\n GenerateSchemasFromTypeOptions,\n ResolveDeclarationMetadataOptions,\n SchemaSourceDeclaration,\n} from \"./generators/discovered-schema.js\";\nexport type {\n BuildMixedAuthoringSchemasOptions,\n MixedAuthoringSchemas,\n} from \"./generators/mixed-authoring.js\";\n\n// =============================================================================\n// Zod Validation Schemas\n// =============================================================================\n\nexport { jsonSchema7Schema } from \"./json-schema/schema.js\";\nexport { uiSchema as uiSchemaSchema } from \"./ui-schema/schema.js\";\n\n// =============================================================================\n// Chain DSL Generators\n// =============================================================================\n\nexport { generateJsonSchema } from \"./json-schema/generator.js\";\nexport { generateUiSchema } from \"./ui-schema/generator.js\";\nexport {\n generateSchemasBatch,\n generateSchemasBatchFromProgram,\n generateSchemasFromClass,\n} from \"./generators/class-schema.js\";\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport { generateSchemas } from \"./generators/class-schema.js\";\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport { generateSchemasFromProgram } from \"./generators/class-schema.js\";\n/* eslint-disable @typescript-eslint/no-deprecated */\nexport {\n generateSchemasDetailed,\n generateSchemasFromProgramDetailed,\n} from \"./generators/class-schema.js\";\n/* eslint-enable @typescript-eslint/no-deprecated */\nexport {\n createStaticBuildContext,\n createStaticBuildContextFromProgram,\n resolveModuleExport,\n resolveModuleExportDeclaration,\n} from \"./static-build.js\";\nexport {\n generateSchemasFromDeclaration,\n generateSchemasFromParameter,\n generateSchemasFromReturnType,\n generateSchemasFromType,\n resolveDeclarationMetadata,\n} from \"./generators/discovered-schema.js\";\nexport { buildMixedAuthoringSchemas } from \"./generators/mixed-authoring.js\";\n\n/**\n * Result of building form schemas.\n *\n * @public\n */\nexport interface BuildResult {\n /** JSON Schema 2020-12 for validation */\n readonly jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n readonly uiSchema: UISchema;\n}\n\n/**\n * Options for building schemas from a FormSpec.\n *\n * Currently identical to `GenerateJsonSchemaOptions`. Defined separately so the\n * Chain DSL surface can grow independently in the future if needed.\n *\n * @public\n */\nexport interface BuildFormSchemasOptions\n extends GenerateJsonSchemaOptions, GenerateUiSchemaOptions {\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Builds both JSON Schema and UI Schema from a FormSpec.\n *\n * This is a convenience function that combines `generateJsonSchema`\n * and `generateUiSchema`.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * field.text(\"name\", { required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n *\n * const { jsonSchema, uiSchema } = buildFormSchemas(form);\n *\n * // Use with JSON Forms renderer\n * <JsonForms\n * schema={jsonSchema}\n * uischema={uiSchema}\n * data={formData}\n * renderers={materialRenderers}\n * />\n * ```\n *\n * @param form - The FormSpec to build schemas from\n * @returns Object containing both jsonSchema and uiSchema\n *\n * @public\n */\nexport function buildFormSchemas<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: BuildFormSchemasOptions\n): BuildResult {\n const logger = options?.logger ?? noopLogger;\n logger.debug(\"buildFormSchemas: starting schema generation\");\n return {\n jsonSchema: generateJsonSchema(form, options),\n uiSchema: generateUiSchema(form, options),\n };\n}\n\n/**\n * Options for writing schemas to disk.\n *\n * @public\n */\nexport interface WriteSchemasOptions extends GenerateJsonSchemaOptions {\n /** Output directory for the schema files */\n readonly outDir: string;\n /** Base name for the output files (without extension). Defaults to \"schema\" */\n readonly name?: string;\n /** Number of spaces for JSON indentation. Defaults to 2 */\n readonly indent?: number;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Result of writing schemas to disk.\n *\n * @public\n */\nexport interface WriteSchemasResult {\n /** Path to the generated JSON Schema file */\n readonly jsonSchemaPath: string;\n /** Path to the generated UI Schema file */\n readonly uiSchemaPath: string;\n}\n\n/**\n * Builds and writes both JSON Schema and UI Schema files to disk.\n *\n * This is a convenience function for build-time schema generation.\n * It creates the output directory if it doesn't exist.\n *\n * @example\n * ```typescript\n * import { formspec, field } from \"formspec\";\n * import { writeSchemas } from \"@formspec/build\";\n *\n * const ProductForm = formspec(\n * field.text(\"name\", { required: true }),\n * field.enum(\"status\", [\"draft\", \"active\"]),\n * );\n *\n * // Write schemas to ./generated/product-schema.json and ./generated/product-uischema.json\n * const { jsonSchemaPath, uiSchemaPath } = writeSchemas(ProductForm, {\n * outDir: \"./generated\",\n * name: \"product\",\n * });\n *\n * console.log(`Generated: ${jsonSchemaPath}, ${uiSchemaPath}`);\n * ```\n *\n * @param form - The FormSpec to build schemas from\n * @param options - Output options (directory, file name, indentation)\n * @returns Object containing paths to the generated files\n *\n * @public\n */\nexport function writeSchemas<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options: WriteSchemasOptions\n): WriteSchemasResult {\n const {\n outDir,\n name = \"schema\",\n indent = 2,\n vendorPrefix,\n enumSerialization,\n metadata,\n logger: rawLogger,\n } = options;\n const logger = (rawLogger ?? noopLogger).child({ stage: \"write\" });\n\n // Build schemas\n const buildOptions =\n vendorPrefix === undefined && enumSerialization === undefined && metadata === undefined\n ? { logger: rawLogger }\n : {\n ...(vendorPrefix !== undefined && { vendorPrefix }),\n ...(enumSerialization !== undefined && { enumSerialization }),\n ...(metadata !== undefined && { metadata }),\n logger: rawLogger,\n };\n\n const { jsonSchema, uiSchema } = buildFormSchemas(form, buildOptions);\n\n // Ensure output directory exists\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n // Write files\n const jsonSchemaPath = path.join(outDir, `${name}-schema.json`);\n const uiSchemaPath = path.join(outDir, `${name}-uischema.json`);\n\n logger.debug(\"writing JSON Schema\", { path: jsonSchemaPath });\n fs.writeFileSync(jsonSchemaPath, JSON.stringify(jsonSchema, null, indent));\n logger.debug(\"writing UI Schema\", { path: uiSchemaPath });\n fs.writeFileSync(uiSchemaPath, JSON.stringify(uiSchema, null, indent));\n\n return { jsonSchemaPath, uiSchemaPath };\n}\n","/**\n * JSON Schema generator for FormSpec forms.\n *\n * Routes through the canonical IR pipeline: Chain DSL → FormIR → JSON Schema 2020-12.\n */\n\nimport type { FormElement, FormSpec, LoggerLike, MetadataPolicyInput } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { canonicalizeChainDSL } from \"../canonicalize/index.js\";\nimport {\n generateJsonSchemaFromIR,\n type GenerateJsonSchemaFromIROptions,\n type JsonSchema2020,\n} from \"./ir-generator.js\";\n\n/**\n * Options for generating JSON Schema from a Chain DSL form.\n *\n * @public\n */\nexport interface GenerateJsonSchemaOptions {\n /**\n * Vendor prefix for emitted extension keywords.\n * @defaultValue \"x-formspec\"\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\";\n /** Metadata resolution policy for chain DSL generation. */\n readonly metadata?: MetadataPolicyInput | undefined;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Generates a JSON Schema 2020-12 from a FormSpec.\n *\n * All generation routes through the canonical IR. The chain DSL is first\n * canonicalized to a FormIR, then the IR-based generator produces the schema.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n *\n * const schema = generateJsonSchema(form);\n * // {\n * // $schema: \"https://json-schema.org/draft/2020-12/schema\",\n * // type: \"object\",\n * // properties: {\n * // name: { type: \"string\", title: \"Name\" },\n * // age: { type: \"number\", minimum: 0 }\n * // },\n * // required: [\"name\"]\n * // }\n * ```\n *\n * @param form - The FormSpec to convert\n * @returns A JSON Schema 2020-12 object\n *\n * @public\n */\nexport function generateJsonSchema<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: GenerateJsonSchemaOptions\n): JsonSchema2020 {\n const logger = (options?.logger ?? noopLogger).child({ stage: \"ir\" });\n const metadata = options?.metadata;\n const vendorPrefix = options?.vendorPrefix;\n const enumSerialization = options?.enumSerialization;\n logger.debug(\"canonicalizing chain DSL to IR\");\n const ir = canonicalizeChainDSL(form, metadata !== undefined ? { metadata } : undefined);\n const schemaLogger = (options?.logger ?? noopLogger).child({ stage: \"schema\" });\n schemaLogger.debug(\"generating JSON Schema from IR\");\n const internalOptions: GenerateJsonSchemaFromIROptions | undefined =\n vendorPrefix === undefined && enumSerialization === undefined\n ? undefined\n : {\n ...(vendorPrefix !== undefined && { vendorPrefix }),\n ...(enumSerialization !== undefined && { enumSerialization }),\n };\n return generateJsonSchemaFromIR(ir, internalOptions);\n}\n","/**\n * Canonicalizer that translates chain DSL `FormSpec` objects into the\n * canonical FormIR intermediate representation.\n *\n * This module maps the runtime objects produced by `@formspec/dsl` builder\n * functions (`field.*`, `group`, `when`, `formspec`) into the IR that all\n * downstream phases (validation, JSON Schema generation, UI Schema generation)\n * consume.\n */\n\nimport type {\n // Source types (chain DSL)\n AnyField,\n ArrayField,\n BooleanField,\n Conditional,\n DynamicEnumField,\n DynamicSchemaField,\n EnumOptionValue,\n FormElement,\n FormSpec,\n Group,\n NumberField,\n ObjectField,\n StaticEnumField,\n TextField,\n MetadataPolicyInput,\n} from \"@formspec/core\";\nimport type {\n // IR types\n JsonValue,\n AnnotationNode,\n ArrayTypeNode,\n ConstraintNode,\n ConditionalLayoutNode,\n DisplayNameAnnotationNode,\n DynamicTypeNode,\n EnumMember,\n EnumTypeNode,\n FieldNode,\n FormIR,\n FormIRElement,\n GroupLayoutNode,\n LengthConstraintNode,\n NumericConstraintNode,\n ObjectProperty,\n PatternConstraintNode,\n ObjectTypeNode,\n PlaceholderAnnotationNode,\n PrimitiveTypeNode,\n Provenance,\n ResolvedMetadata,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport { IR_VERSION, _getFormSpecMetadataPolicy } from \"@formspec/core/internals\";\nimport {\n getDeclarationMetadataPolicy,\n makeMetadataContext,\n normalizeMetadataPolicy,\n resolveMetadata,\n resolveFormIRMetadata,\n} from \"../metadata/index.js\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Default provenance for chain DSL nodes (no source location available). */\nconst CHAIN_DSL_PROVENANCE: Provenance = {\n surface: \"chain-dsl\",\n file: \"\",\n line: 0,\n column: 0,\n} as const;\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\nfunction isGroup(el: FormElement): el is Group<readonly FormElement[]> {\n return el._type === \"group\";\n}\n\nfunction isConditional(\n el: FormElement\n): el is Conditional<string, unknown, readonly FormElement[]> {\n return el._type === \"conditional\";\n}\n\nfunction isField(el: FormElement): el is AnyField {\n return el._type === \"field\";\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Translates a chain DSL `FormSpec` into the canonical `FormIR`.\n *\n * @param form - A form specification created via `formspec(...)` from `@formspec/dsl`\n * @returns The canonical intermediate representation\n */\nexport interface CanonicalizeChainDSLOptions {\n readonly metadata?: MetadataPolicyInput;\n}\n\nexport function canonicalizeChainDSL(\n form: FormSpec<readonly FormElement[]>,\n options?: CanonicalizeChainDSLOptions\n): FormIR {\n const metadataPolicy = normalizeMetadataPolicy(\n options?.metadata ?? _getFormSpecMetadataPolicy(form)\n );\n const ir: FormIR = {\n kind: \"form-ir\",\n irVersion: IR_VERSION,\n elements: canonicalizeElements(form.elements, metadataPolicy),\n rootAnnotations: [],\n typeRegistry: {},\n provenance: CHAIN_DSL_PROVENANCE,\n };\n\n return resolveFormIRMetadata(ir, {\n policy: metadataPolicy,\n surface: \"chain-dsl\",\n // Chain DSL has no root/type-metadata authoring surface, so only resolve\n // field/type-registry metadata and enum-member labels here.\n resolveRootTypeMetadata: false,\n });\n}\n\n// =============================================================================\n// ELEMENT CANONICALIZATION\n// =============================================================================\n\n/**\n * Canonicalizes an array of chain DSL form elements into IR elements.\n */\nfunction canonicalizeElements(\n elements: readonly FormElement[],\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FormIRElement[] {\n return elements.map((element) => canonicalizeElement(element, metadataPolicy));\n}\n\n/**\n * Dispatches a single form element to its specific canonicalization function.\n */\nfunction canonicalizeElement(\n element: FormElement,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FormIRElement {\n if (isField(element)) {\n return canonicalizeField(element, metadataPolicy);\n }\n if (isGroup(element)) {\n return canonicalizeGroup(element, metadataPolicy);\n }\n if (isConditional(element)) {\n return canonicalizeConditional(element, metadataPolicy);\n }\n const _exhaustive: never = element;\n throw new Error(`Unknown element type: ${JSON.stringify(_exhaustive)}`);\n}\n\n// =============================================================================\n// FIELD CANONICALIZATION\n// =============================================================================\n\n/**\n * Dispatches a field element to its type-specific canonicalization function.\n */\nfunction canonicalizeField(\n field: AnyField,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n switch (field._field) {\n case \"text\":\n return canonicalizeTextField(field, metadataPolicy);\n case \"number\":\n return canonicalizeNumberField(field, metadataPolicy);\n case \"boolean\":\n return canonicalizeBooleanField(field, metadataPolicy);\n case \"enum\":\n return canonicalizeStaticEnumField(field, metadataPolicy);\n case \"dynamic_enum\":\n return canonicalizeDynamicEnumField(field, metadataPolicy);\n case \"dynamic_schema\":\n return canonicalizeDynamicSchemaField(field, metadataPolicy);\n case \"array\":\n return canonicalizeArrayField(field, metadataPolicy);\n case \"object\":\n return canonicalizeObjectField(field, metadataPolicy);\n default: {\n const _exhaustive: never = field;\n throw new Error(`Unknown field type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n\n// =============================================================================\n// SPECIFIC FIELD TYPE CANONICALIZERS\n// =============================================================================\n\nfunction canonicalizeTextField(\n field: TextField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"string\" };\n const constraints: ConstraintNode[] = [];\n\n if (field.minLength !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minLength\",\n value: field.minLength,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.maxLength !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maxLength\",\n value: field.maxLength,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.pattern !== undefined) {\n const c: PatternConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"pattern\",\n pattern: field.pattern,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field), field.placeholder),\n constraints\n );\n}\n\nfunction canonicalizeNumberField(\n field: NumberField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"number\" };\n const constraints: ConstraintNode[] = [];\n\n if (field.min !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minimum\",\n value: field.min,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.max !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maximum\",\n value: field.max,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.multipleOf !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"multipleOf\",\n value: field.multipleOf,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field)),\n constraints\n );\n}\n\nfunction canonicalizeBooleanField(\n field: BooleanField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"boolean\" };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeStaticEnumField(\n field: StaticEnumField<string, readonly EnumOptionValue[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const members: EnumMember[] = field.options.map((opt) => {\n if (typeof opt === \"string\") {\n return { value: opt } satisfies EnumMember;\n }\n // Object option with id/label\n return { value: opt.id, displayName: opt.label } satisfies EnumMember;\n });\n\n const type: EnumTypeNode = { kind: \"enum\", members };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeDynamicEnumField(\n field: DynamicEnumField<string, string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: DynamicTypeNode = {\n kind: \"dynamic\",\n dynamicKind: \"enum\",\n sourceKey: field.source,\n parameterFields: field.params ? [...field.params] : [],\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeDynamicSchemaField(\n field: DynamicSchemaField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: DynamicTypeNode = {\n kind: \"dynamic\",\n dynamicKind: \"schema\",\n sourceKey: field.schemaSource,\n parameterFields: [],\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeArrayField(\n field: ArrayField<string, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n // Array items form an object type from the sub-elements\n const itemProperties = buildObjectProperties(field.items, metadataPolicy);\n const itemsType: ObjectTypeNode = {\n kind: \"object\",\n properties: itemProperties,\n additionalProperties: true,\n };\n const type: ArrayTypeNode = { kind: \"array\", items: itemsType };\n\n const constraints: ConstraintNode[] = [];\n if (field.minItems !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minItems\",\n value: field.minItems,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n if (field.maxItems !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maxItems\",\n value: field.maxItems,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field)),\n constraints\n );\n}\n\nfunction canonicalizeObjectField(\n field: ObjectField<string, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const properties = buildObjectProperties(field.properties, metadataPolicy);\n const type: ObjectTypeNode = {\n kind: \"object\",\n properties,\n additionalProperties: true,\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\n// =============================================================================\n// LAYOUT CANONICALIZATION\n// =============================================================================\n\nfunction canonicalizeGroup(\n g: Group<readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): GroupLayoutNode {\n return {\n kind: \"group\",\n label: g.label,\n elements: canonicalizeElements(g.elements, metadataPolicy),\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\nfunction canonicalizeConditional(\n c: Conditional<string, unknown, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): ConditionalLayoutNode {\n return {\n kind: \"conditional\",\n fieldName: c.field,\n // Conditional values from the chain DSL are JSON-serializable primitives\n // (strings, numbers, booleans) produced by the `is()` predicate helper.\n value: assertJsonValue(c.value),\n elements: canonicalizeElements(c.elements, metadataPolicy),\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Validates that a value is JSON-serializable (`JsonValue`).\n * The chain DSL's `is()` helper constrains conditional values to\n * JSON-compatible primitives, but the TypeScript type is `unknown`.\n * This runtime guard replaces an `as` cast with a validated assertion.\n */\nfunction assertJsonValue(v: unknown): JsonValue {\n if (v === null || typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n return v;\n }\n if (Array.isArray(v)) {\n return v.map(assertJsonValue);\n }\n if (typeof v === \"object\") {\n const result: Record<string, JsonValue> = {};\n for (const [key, val] of Object.entries(v)) {\n result[key] = assertJsonValue(val);\n }\n return result;\n }\n // Remaining types (function, symbol, bigint, undefined) are not JSON-serializable\n throw new TypeError(`Conditional value is not a valid JsonValue: ${typeof v}`);\n}\n\n/**\n * Builds a FieldNode from common field properties.\n */\nfunction buildFieldNode(\n name: string,\n metadata: ResolvedMetadata | undefined,\n type: TypeNode,\n required: boolean | undefined,\n annotations: AnnotationNode[],\n constraints: ConstraintNode[] = []\n): FieldNode {\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: required === true,\n constraints,\n annotations,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\n/**\n * Builds annotation nodes from optional label and placeholder values.\n */\nfunction buildAnnotations(label?: string, placeholder?: string): AnnotationNode[] {\n const annotations: AnnotationNode[] = [];\n\n if (label !== undefined) {\n const a: DisplayNameAnnotationNode = {\n kind: \"annotation\",\n annotationKind: \"displayName\",\n value: label,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n annotations.push(a);\n }\n\n if (placeholder !== undefined) {\n const a: PlaceholderAnnotationNode = {\n kind: \"annotation\",\n annotationKind: \"placeholder\",\n value: placeholder,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n annotations.push(a);\n }\n\n return annotations;\n}\n\n/**\n * Converts an array of form elements into ObjectProperty nodes.\n * Used for ObjectField properties and ArrayField items.\n *\n * Only field elements produce properties; groups and conditionals within\n * an object/array context are recursively flattened to extract their fields.\n *\n * Fields inside conditional branches are always marked `optional: true`\n * because their presence in the data depends on the condition being met.\n * This matches the DSL's type inference behavior where conditional fields\n * produce optional properties in `InferFormSchema`.\n *\n * @param elements - The form elements to convert\n * @param insideConditional - Whether these elements are inside a conditional branch\n */\nfunction buildObjectProperties(\n elements: readonly FormElement[],\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>,\n insideConditional = false\n): ObjectProperty[] {\n const properties: ObjectProperty[] = [];\n\n for (const el of elements) {\n if (isField(el)) {\n const fieldNode = canonicalizeField(el, metadataPolicy);\n properties.push({\n name: fieldNode.name,\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n type: fieldNode.type,\n // Fields inside a conditional branch are always optional in the\n // data schema, regardless of their `required` flag — the condition\n // may not be met, so the field may be absent.\n optional: insideConditional || !fieldNode.required,\n constraints: fieldNode.constraints,\n annotations: fieldNode.annotations,\n provenance: CHAIN_DSL_PROVENANCE,\n });\n } else if (isGroup(el)) {\n // Groups inside object/array items contribute their fields by flattening.\n // Groups do not affect optionality — pass through the current state.\n properties.push(...buildObjectProperties(el.elements, metadataPolicy, insideConditional));\n } else if (isConditional(el)) {\n // Conditionals inside object/array items contribute their fields by\n // flattening, but all fields inside are forced optional.\n properties.push(...buildObjectProperties(el.elements, metadataPolicy, true));\n }\n }\n\n return properties;\n}\n\nfunction getExplicitDisplayName(field: {\n readonly label?: string;\n readonly displayName?: string;\n}): string | undefined {\n if (field.label !== undefined && field.displayName !== undefined) {\n throw new Error('Chain DSL fields cannot specify both \"label\" and \"displayName\".');\n }\n return field.displayName ?? field.label;\n}\n\nfunction resolveFieldMetadata(\n logicalName: string,\n field: {\n readonly apiName?: string;\n readonly label?: string;\n readonly displayName?: string;\n },\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): ResolvedMetadata | undefined {\n const displayName = getExplicitDisplayName(field);\n return resolveMetadata(\n {\n ...(field.apiName !== undefined && { apiName: field.apiName }),\n ...(displayName !== undefined && { displayName }),\n },\n getDeclarationMetadataPolicy(metadataPolicy, \"field\"),\n makeMetadataContext(\"chain-dsl\", \"field\", logicalName)\n );\n}\n","import type {\n EnumMemberDisplayNamePolicyInput,\n EnumMemberMetadataInferenceContext,\n MetadataAuthoringSurface,\n MetadataDeclarationKind,\n MetadataInferenceContext,\n MetadataPluralizationFn,\n MetadataPluralizationPolicyInput,\n MetadataPolicyInput,\n MetadataValuePolicyInput,\n NormalizedDeclarationMetadataPolicy,\n NormalizedEnumMemberDisplayNamePolicy,\n NormalizedEnumMemberMetadataPolicy,\n NormalizedMetadataPolicy,\n NormalizedMetadataPluralizationPolicy,\n NormalizedMetadataValuePolicy,\n} from \"@formspec/core/internals\";\nexport type {\n NormalizedDeclarationMetadataPolicy,\n NormalizedEnumMemberDisplayNamePolicy,\n NormalizedEnumMemberMetadataPolicy,\n NormalizedMetadataPolicy,\n NormalizedMetadataPluralizationPolicy as NormalizedPluralizationPolicy,\n} from \"@formspec/core/internals\";\n\nexport type MetadataResolutionContext = MetadataInferenceContext;\nexport type EnumMemberResolutionContext = EnumMemberMetadataInferenceContext;\nexport type NormalizedMetadataScalarPolicy = NormalizedMetadataValuePolicy;\n\nexport function defaultApiNameInference(_context: MetadataResolutionContext): string {\n return \"\";\n}\n\nexport function defaultDisplayNameInference(_context: MetadataResolutionContext): string {\n return \"\";\n}\n\nconst NOOP_INFLECT: MetadataPluralizationFn = () => \"\";\n\nfunction normalizePluralization(\n input: MetadataPluralizationPolicyInput | undefined\n): NormalizedMetadataPluralizationPolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: () => \"\",\n inflect: input.inflect,\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n inflect: NOOP_INFLECT,\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n inflect: NOOP_INFLECT,\n };\n}\n\nfunction normalizeScalarPolicy(\n input: MetadataValuePolicyInput | undefined\n): NormalizedMetadataValuePolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: input.infer,\n pluralization: normalizePluralization(input.pluralization),\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n pluralization: normalizePluralization(input.pluralization),\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n pluralization: normalizePluralization(input?.pluralization),\n };\n}\n\nfunction normalizeDeclarationPolicy(\n input: MetadataPolicyInput[MetadataDeclarationKind] | undefined\n): NormalizedDeclarationMetadataPolicy {\n return {\n apiName: normalizeScalarPolicy(input?.apiName),\n displayName: normalizeScalarPolicy(input?.displayName),\n };\n}\n\nfunction normalizeEnumMemberDisplayNamePolicy(\n input: EnumMemberDisplayNamePolicyInput | undefined\n): NormalizedEnumMemberDisplayNamePolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: input.infer,\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n };\n}\n\nfunction normalizeEnumMemberPolicy(\n input: MetadataPolicyInput[\"enumMember\"] | undefined\n): NormalizedEnumMemberMetadataPolicy {\n return {\n displayName: normalizeEnumMemberDisplayNamePolicy(input?.displayName),\n };\n}\n\nexport function normalizeMetadataPolicy(input?: MetadataPolicyInput): NormalizedMetadataPolicy {\n return {\n type: normalizeDeclarationPolicy(input?.type),\n field: normalizeDeclarationPolicy(input?.field),\n method: normalizeDeclarationPolicy(input?.method),\n enumMember: normalizeEnumMemberPolicy(input?.enumMember),\n };\n}\n\nexport function getDeclarationMetadataPolicy(\n policy: NormalizedMetadataPolicy,\n declarationKind: MetadataDeclarationKind\n): NormalizedDeclarationMetadataPolicy {\n return policy[declarationKind];\n}\n\nexport function makeMetadataContext(\n surface: MetadataAuthoringSurface,\n declarationKind: MetadataDeclarationKind,\n logicalName: string,\n buildContext?: unknown\n): MetadataResolutionContext {\n return {\n surface,\n declarationKind,\n logicalName,\n ...(buildContext !== undefined && { buildContext }),\n };\n}\n\nexport function getDefaultMetadataPolicy(): NormalizedMetadataPolicy {\n return normalizeMetadataPolicy(undefined);\n}\n","import type {\n EnumTypeNode,\n FieldNode,\n FormIR,\n FormIRElement,\n MetadataAuthoringSurface,\n ObjectProperty,\n ResolvedMetadata,\n ResolvedScalarMetadata,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport type {\n EnumMemberResolutionContext,\n MetadataResolutionContext,\n NormalizedDeclarationMetadataPolicy,\n NormalizedMetadataPolicy,\n} from \"./policy.js\";\n\nexport interface ExplicitMetadataInput {\n readonly apiName?: string;\n readonly displayName?: string;\n readonly apiNamePlural?: string;\n readonly displayNamePlural?: string;\n}\n\nexport interface ResolveFormIRMetadataOptions {\n readonly policy: NormalizedMetadataPolicy;\n readonly surface: MetadataAuthoringSurface;\n readonly buildContext?: unknown;\n readonly rootLogicalName?: string;\n readonly resolveRootTypeMetadata?: boolean;\n}\n\nfunction toExplicitScalar(value: string | undefined): ResolvedScalarMetadata | undefined {\n return value !== undefined && value.trim() !== \"\" ? { value, source: \"explicit\" } : undefined;\n}\n\nfunction toExplicitResolvedMetadata(\n explicit: ExplicitMetadataInput | undefined\n): ResolvedMetadata | undefined {\n if (explicit === undefined) {\n return undefined;\n }\n\n const apiName = toExplicitScalar(explicit.apiName);\n const displayName = toExplicitScalar(explicit.displayName);\n const apiNamePlural = toExplicitScalar(explicit.apiNamePlural);\n const displayNamePlural = toExplicitScalar(explicit.displayNamePlural);\n const metadata: ResolvedMetadata = {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction resolveScalar(\n current: ResolvedScalarMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy[\"apiName\"],\n context: MetadataResolutionContext,\n metadataLabel: \"apiName\" | \"displayName\"\n): ResolvedScalarMetadata | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit ${metadataLabel} for ${context.declarationKind} \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const inferredValue = policy.infer(context);\n return inferredValue.trim() !== \"\" ? { value: inferredValue, source: \"inferred\" } : undefined;\n}\n\nfunction resolvePlural(\n current: ResolvedScalarMetadata | undefined,\n singular: ResolvedScalarMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy[\"apiName\"][\"pluralization\"],\n context: MetadataResolutionContext,\n metadataLabel: \"apiNamePlural\" | \"displayNamePlural\"\n): ResolvedScalarMetadata | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit ${metadataLabel} for ${context.declarationKind} \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (singular === undefined || policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const pluralValue = policy.inflect({ ...context, singular: singular.value });\n return pluralValue.trim() !== \"\" ? { value: pluralValue, source: \"inferred\" } : undefined;\n}\n\nfunction resolveResolvedMetadata(\n current: ResolvedMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy,\n context: MetadataResolutionContext\n): ResolvedMetadata | undefined {\n const apiName = resolveScalar(current?.apiName, policy.apiName, context, \"apiName\");\n const displayName = resolveScalar(\n current?.displayName,\n policy.displayName,\n context,\n \"displayName\"\n );\n const apiNamePlural = resolvePlural(\n current?.apiNamePlural,\n apiName,\n policy.apiName.pluralization,\n context,\n \"apiNamePlural\"\n );\n const displayNamePlural = resolvePlural(\n current?.displayNamePlural,\n displayName,\n policy.displayName.pluralization,\n context,\n \"displayNamePlural\"\n );\n\n if (\n apiName === undefined &&\n displayName === undefined &&\n apiNamePlural === undefined &&\n displayNamePlural === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n}\n\nfunction pickResolvedMetadataValue(\n baseValue: ResolvedScalarMetadata | undefined,\n overlayValue: ResolvedScalarMetadata | undefined\n): ResolvedScalarMetadata | undefined {\n if (overlayValue?.source === \"explicit\") {\n return overlayValue;\n }\n if (baseValue?.source === \"explicit\") {\n return baseValue;\n }\n return baseValue ?? overlayValue;\n}\n\nfunction resolveEnumMemberDisplayName(\n current: string | undefined,\n policy: NormalizedMetadataPolicy[\"enumMember\"][\"displayName\"],\n context: EnumMemberResolutionContext\n): string | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit displayName for enum member \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const inferredValue = policy.infer(context).trim();\n return inferredValue !== \"\" ? inferredValue : undefined;\n}\n\nfunction resolveEnumTypeMetadata(\n type: EnumTypeNode,\n options: ResolveFormIRMetadataOptions\n): EnumTypeNode {\n const members = type.members.map((member) => {\n const displayName = resolveEnumMemberDisplayName(\n member.displayName,\n options.policy.enumMember.displayName,\n {\n surface: options.surface,\n logicalName: String(member.value),\n memberValue: member.value,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n }\n );\n\n if (displayName === member.displayName) {\n return member;\n }\n\n return displayName === undefined\n ? { value: member.value }\n : { value: member.value, displayName };\n });\n\n return members.some((member, index) => member !== type.members[index])\n ? { ...type, members }\n : type;\n}\n\nfunction resolveTypeNodeMetadata(type: TypeNode, options: ResolveFormIRMetadataOptions): TypeNode {\n switch (type.kind) {\n case \"array\":\n return {\n ...type,\n items: resolveTypeNodeMetadata(type.items, options),\n };\n\n case \"object\":\n return {\n ...type,\n properties: type.properties.map((property) =>\n resolveObjectPropertyMetadata(property, options)\n ),\n };\n\n case \"record\":\n return {\n ...type,\n valueType: resolveTypeNodeMetadata(type.valueType, options),\n };\n\n case \"union\":\n return {\n ...type,\n members: type.members.map((member) => resolveTypeNodeMetadata(member, options)),\n };\n\n case \"enum\":\n return resolveEnumTypeMetadata(type, options);\n\n case \"reference\":\n case \"primitive\":\n case \"dynamic\":\n case \"custom\":\n return type;\n\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\nfunction resolveObjectPropertyMetadata(\n property: ObjectProperty,\n options: ResolveFormIRMetadataOptions\n): ObjectProperty {\n const metadata = resolveResolvedMetadata(property.metadata, options.policy.field, {\n surface: options.surface,\n declarationKind: \"field\",\n logicalName: property.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...property,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(property.type, options),\n };\n}\n\nfunction resolveFieldMetadataNode(\n field: FieldNode,\n options: ResolveFormIRMetadataOptions\n): FieldNode {\n const metadata = resolveResolvedMetadata(field.metadata, options.policy.field, {\n surface: options.surface,\n declarationKind: \"field\",\n logicalName: field.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...field,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(field.type, options),\n };\n}\n\nfunction resolveFormElementMetadata(\n element: FormIRElement,\n options: ResolveFormIRMetadataOptions\n): FormIRElement {\n switch (element.kind) {\n case \"field\":\n return resolveFieldMetadataNode(element, options);\n\n case \"group\":\n return {\n ...element,\n elements: element.elements.map((child) => resolveFormElementMetadata(child, options)),\n };\n\n case \"conditional\":\n return {\n ...element,\n elements: element.elements.map((child) => resolveFormElementMetadata(child, options)),\n };\n\n default: {\n const _exhaustive: never = element;\n return _exhaustive;\n }\n }\n}\n\nfunction resolveTypeDefinitionMetadata(\n typeDefinition: TypeDefinition,\n options: ResolveFormIRMetadataOptions\n): TypeDefinition {\n const metadata = resolveResolvedMetadata(typeDefinition.metadata, options.policy.type, {\n surface: options.surface,\n declarationKind: \"type\",\n logicalName: typeDefinition.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...typeDefinition,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(typeDefinition.type, options),\n };\n}\n\nexport function resolveMetadata(\n explicit: ExplicitMetadataInput | undefined,\n policy: NormalizedDeclarationMetadataPolicy,\n context: MetadataResolutionContext\n): ResolvedMetadata | undefined {\n return resolveResolvedMetadata(toExplicitResolvedMetadata(explicit), policy, context);\n}\n\nexport function mergeResolvedMetadata(\n baseMetadata: ResolvedMetadata | undefined,\n overlayMetadata: ResolvedMetadata | undefined\n): ResolvedMetadata | undefined {\n const apiName = pickResolvedMetadataValue(baseMetadata?.apiName, overlayMetadata?.apiName);\n const displayName = pickResolvedMetadataValue(\n baseMetadata?.displayName,\n overlayMetadata?.displayName\n );\n const apiNamePlural = pickResolvedMetadataValue(\n baseMetadata?.apiNamePlural,\n overlayMetadata?.apiNamePlural\n );\n const displayNamePlural = pickResolvedMetadataValue(\n baseMetadata?.displayNamePlural,\n overlayMetadata?.displayNamePlural\n );\n\n if (\n apiName === undefined &&\n displayName === undefined &&\n apiNamePlural === undefined &&\n displayNamePlural === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n}\n\nexport function getSerializedName(\n logicalName: string,\n metadata: ResolvedMetadata | undefined\n): string {\n return metadata?.apiName?.value ?? logicalName;\n}\n\nexport function getDisplayName(metadata: ResolvedMetadata | undefined): string | undefined {\n return metadata?.displayName?.value;\n}\n\nexport function resolveFormIRMetadata(ir: FormIR, options: ResolveFormIRMetadataOptions): FormIR {\n const metadata =\n options.resolveRootTypeMetadata === false\n ? ir.metadata\n : resolveResolvedMetadata(ir.metadata, options.policy.type, {\n surface: options.surface,\n declarationKind: \"type\",\n logicalName: options.rootLogicalName ?? ir.name ?? \"FormSpec\",\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n\n return {\n ...ir,\n ...(metadata !== undefined && { metadata }),\n elements: ir.elements.map((element) => resolveFormElementMetadata(element, options)),\n typeRegistry: Object.fromEntries(\n Object.entries(ir.typeRegistry).map(([name, definition]) => [\n name,\n resolveTypeDefinitionMetadata(definition, options),\n ])\n ),\n };\n}\n","/**\n * TSDoc canonicalizer — assembles an {@link IRClassAnalysis} into a canonical\n * {@link FormIR}, applying layout metadata from `@Group` and `@ShowWhen`\n * TSDoc tags.\n *\n * The analysis functions in `class-analyzer.ts` produce `FieldNode[]`,\n * `fieldLayouts`, and `typeRegistry` directly. This canonicalizer uses\n * the layout metadata to wrap fields in `GroupLayoutNode` and\n * `ConditionalLayoutNode` elements.\n */\n\nimport type {\n FormIR,\n FormIRElement,\n FieldNode,\n GroupLayoutNode,\n ConditionalLayoutNode,\n Provenance,\n} from \"@formspec/core/internals\";\nimport { IR_VERSION } from \"@formspec/core/internals\";\nimport type { IRClassAnalysis, FieldLayoutMetadata } from \"../analyzer/class-analyzer.js\";\nimport { normalizeMetadataPolicy, resolveFormIRMetadata } from \"../metadata/index.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\n\n/**\n * Source-level metadata for provenance tracking.\n */\nexport interface TSDocSource {\n /** Absolute path to the source file. */\n readonly file: string;\n}\n\nexport interface CanonicalizeTSDocOptions {\n readonly metadata?: MetadataPolicyInput;\n}\n\n/**\n * Wraps an {@link IRClassAnalysis} (from `analyzeClassToIR`,\n * `analyzeInterfaceToIR`, or `analyzeTypeAliasToIR`) into a canonical\n * {@link FormIR}.\n *\n * Fields with `@Group` TSDoc tags are grouped into `GroupLayoutNode` elements.\n * Fields with `@ShowWhen` TSDoc tags are wrapped in `ConditionalLayoutNode` elements.\n * When both are present, the conditional wraps the field inside the group.\n *\n * @param analysis - IR analysis result (fields are already FieldNode[])\n * @param source - Optional source file metadata for provenance\n * @returns The canonical FormIR\n */\nexport function canonicalizeTSDoc(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: CanonicalizeTSDocOptions\n): FormIR {\n const file = source?.file ?? \"\";\n\n const provenance: Provenance = {\n surface: \"tsdoc\",\n file,\n line: 1,\n column: 0,\n };\n\n const elements = assembleElements(analysis.fields, analysis.fieldLayouts, provenance);\n\n const ir: FormIR = {\n kind: \"form-ir\",\n name: analysis.name,\n irVersion: IR_VERSION,\n elements,\n ...(analysis.metadata !== undefined && { metadata: analysis.metadata }),\n typeRegistry: analysis.typeRegistry,\n ...(analysis.annotations !== undefined &&\n analysis.annotations.length > 0 && { rootAnnotations: analysis.annotations }),\n ...(analysis.annotations !== undefined &&\n analysis.annotations.length > 0 && { annotations: analysis.annotations }),\n provenance,\n };\n\n return resolveFormIRMetadata(ir, {\n policy: normalizeMetadataPolicy(options?.metadata),\n surface: \"tsdoc\",\n });\n}\n\n/**\n * Assembles flat fields and their layout metadata into a tree of\n * `FormIRElement[]` with groups and conditionals.\n *\n * Fields are processed in order. Consecutive fields with the same\n * `@Group` label are collected into a single `GroupLayoutNode`.\n * Fields with `@ShowWhen` are wrapped in `ConditionalLayoutNode`.\n */\nfunction assembleElements(\n fields: readonly FieldNode[],\n layouts: readonly FieldLayoutMetadata[],\n provenance: Provenance\n): readonly FormIRElement[] {\n const elements: FormIRElement[] = [];\n\n // Group consecutive fields with the same group label together.\n // We use an ordered map to preserve insertion order of groups.\n const groupMap = new Map<string, FormIRElement[]>();\n const topLevelOrder: (\n | { type: \"group\"; label: string }\n | { type: \"element\"; element: FormIRElement }\n )[] = [];\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const layout = layouts[i];\n if (!field || !layout) continue;\n\n // Wrap in conditional if @ShowWhen is present\n const element = wrapInConditional(field, layout, provenance);\n\n if (layout.groupLabel !== undefined) {\n const label = layout.groupLabel;\n let groupElements = groupMap.get(label);\n if (!groupElements) {\n groupElements = [];\n groupMap.set(label, groupElements);\n topLevelOrder.push({ type: \"group\", label });\n }\n groupElements.push(element);\n } else {\n topLevelOrder.push({ type: \"element\", element });\n }\n }\n\n // Assemble the final element array in order\n for (const entry of topLevelOrder) {\n if (entry.type === \"group\") {\n const groupElements = groupMap.get(entry.label);\n if (groupElements) {\n const groupNode: GroupLayoutNode = {\n kind: \"group\",\n label: entry.label,\n elements: groupElements,\n provenance,\n };\n elements.push(groupNode);\n // Clear so duplicate group labels in topLevelOrder don't re-emit\n groupMap.delete(entry.label);\n }\n } else {\n elements.push(entry.element);\n }\n }\n\n return elements;\n}\n\n/**\n * Wraps a field in a `ConditionalLayoutNode` if the layout has `showWhen` metadata.\n */\nfunction wrapInConditional(\n field: FieldNode,\n layout: FieldLayoutMetadata,\n provenance: Provenance\n): FormIRElement {\n if (layout.showWhen === undefined) {\n return field;\n }\n\n const conditional: ConditionalLayoutNode = {\n kind: \"conditional\",\n fieldName: layout.showWhen.field,\n value: layout.showWhen.value,\n elements: [field],\n provenance,\n };\n\n return conditional;\n}\n","import type {\n FieldNode,\n FormIR,\n FormIRElement,\n ObjectProperty,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport { getSerializedName } from \"./resolve.js\";\n\ninterface SerializedNameEntry {\n readonly logicalName: string;\n readonly serializedName: string;\n readonly category: \"field\" | \"object property\" | \"type definition\";\n}\n\nfunction assertUniqueSerializedNames(entries: readonly SerializedNameEntry[], scope: string): void {\n const seen = new Map<string, SerializedNameEntry>();\n\n for (const entry of entries) {\n const previous = seen.get(entry.serializedName);\n if (previous !== undefined) {\n if (previous.logicalName === entry.logicalName && previous.category === entry.category) {\n continue;\n }\n throw new Error(\n `Serialized name collision in ${scope}: ${previous.category} \"${previous.logicalName}\" and ${entry.category} \"${entry.logicalName}\" both resolve to \"${entry.serializedName}\".`\n );\n }\n seen.set(entry.serializedName, entry);\n }\n}\n\nfunction collectFlattenedFields(elements: readonly FormIRElement[]): FieldNode[] {\n const fields: FieldNode[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n fields.push(element);\n break;\n case \"group\":\n case \"conditional\":\n fields.push(...collectFlattenedFields(element.elements));\n break;\n default: {\n const exhaustive: never = element;\n void exhaustive;\n }\n }\n }\n\n return fields;\n}\n\nfunction validateObjectProperties(properties: readonly ObjectProperty[], scope: string): void {\n assertUniqueSerializedNames(\n properties.map((property) => ({\n logicalName: property.name,\n serializedName: getSerializedName(property.name, property.metadata),\n category: \"object property\" as const,\n })),\n scope\n );\n\n for (const property of properties) {\n validateTypeNode(\n property.type,\n `${scope}.${getSerializedName(property.name, property.metadata)}`\n );\n }\n}\n\nfunction validateTypeNode(type: TypeNode, scope: string): void {\n switch (type.kind) {\n case \"array\":\n validateTypeNode(type.items, `${scope}[]`);\n break;\n case \"object\":\n validateObjectProperties(type.properties, scope);\n break;\n case \"record\":\n validateTypeNode(type.valueType, `${scope}.*`);\n break;\n case \"union\":\n type.members.forEach((member, index) => {\n validateTypeNode(member, `${scope}|${String(index)}`);\n });\n break;\n case \"reference\":\n case \"primitive\":\n case \"enum\":\n case \"dynamic\":\n case \"custom\":\n break;\n default: {\n const exhaustive: never = type;\n void exhaustive;\n }\n }\n}\n\nfunction validateTypeDefinitions(typeRegistry: FormIR[\"typeRegistry\"]): void {\n const definitions = Object.values(typeRegistry);\n assertUniqueSerializedNames(\n definitions.map((definition) => ({\n logicalName: definition.name,\n serializedName: getSerializedName(definition.name, definition.metadata),\n category: \"type definition\" as const,\n })),\n \"$defs\"\n );\n\n for (const definition of definitions) {\n validateTypeDefinition(definition);\n }\n}\n\nfunction validateTypeDefinition(definition: TypeDefinition): void {\n validateTypeNode(\n definition.type,\n `type \"${getSerializedName(definition.name, definition.metadata)}\"`\n );\n}\n\nexport function assertNoSerializedNameCollisions(ir: FormIR): void {\n assertUniqueSerializedNames(\n collectFlattenedFields(ir.elements).map((field) => ({\n logicalName: field.name,\n serializedName: getSerializedName(field.name, field.metadata),\n category: \"field\" as const,\n })),\n \"form root\"\n );\n\n for (const field of collectFlattenedFields(ir.elements)) {\n validateTypeNode(field.type, `field \"${getSerializedName(field.name, field.metadata)}\"`);\n }\n\n validateTypeDefinitions(ir.typeRegistry);\n}\n","/**\n * JSON Schema 2020-12 generator that consumes the canonical FormIR.\n *\n * This generator is a pure function of the IR. It never consults the TypeScript\n * AST or surface syntax directly — only the IR (per the JSON Schema vocabulary spec §1.2).\n *\n * @see https://json-schema.org/draft/2020-12/schema\n * @see https://json-schema.org/draft/2020-12/schema\n */\n\nimport type {\n FormIR,\n FormIRElement,\n FieldNode,\n TypeNode,\n PrimitiveTypeNode,\n EnumTypeNode,\n ArrayTypeNode,\n ObjectTypeNode,\n RecordTypeNode,\n UnionTypeNode,\n ReferenceTypeNode,\n DynamicTypeNode,\n CustomTypeNode,\n ConstraintNode,\n AnnotationNode,\n ObjectProperty,\n} from \"@formspec/core/internals\";\nimport type { ResolvedMetadata } from \"@formspec/core\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport { getDisplayName, getSerializedName } from \"../metadata/index.js\";\nimport { assertNoSerializedNameCollisions } from \"../metadata/collision-guards.js\";\n\n// =============================================================================\n// OUTPUT TYPE\n// =============================================================================\n\n/**\n * A JSON Schema 2020-12 document, sub-schema, or keyword collection.\n *\n * This interface covers the subset of JSON Schema 2020-12 that this generator\n * emits, plus an index signature for custom `x-formspec-*` extension keywords.\n *\n * @public\n */\nexport interface JsonSchema2020 {\n /** Declared JSON Schema dialect URI for the document root. */\n $schema?: string;\n /** Reference to another schema location. */\n $ref?: string;\n /** Named reusable schema definitions keyed by definition name. */\n $defs?: Record<string, JsonSchema2020>;\n /** JSON Schema type keyword for the current node. */\n type?: string;\n /** Object properties keyed by property name. */\n properties?: Record<string, JsonSchema2020>;\n /** Property names that must be present on object values. */\n required?: string[];\n /** Item schema applied to array elements. */\n items?: JsonSchema2020;\n /** Whether, or how, additional object properties are allowed. */\n additionalProperties?: boolean | JsonSchema2020;\n /** Closed set of allowed scalar values. */\n enum?: readonly (string | number)[];\n /** Literal value the instance must equal. */\n const?: unknown;\n /** Schemas that must all validate successfully. */\n allOf?: readonly JsonSchema2020[];\n /** Schemas of which exactly one should validate successfully. */\n oneOf?: readonly JsonSchema2020[];\n /** Schemas of which at least one may validate successfully. */\n anyOf?: readonly JsonSchema2020[];\n // Constraints\n /** Inclusive numeric lower bound. */\n minimum?: number;\n /** Inclusive numeric upper bound. */\n maximum?: number;\n /** Exclusive numeric lower bound. */\n exclusiveMinimum?: number;\n /** Exclusive numeric upper bound. */\n exclusiveMaximum?: number;\n /** Required numeric step interval. */\n multipleOf?: number;\n /** Inclusive minimum string length. */\n minLength?: number;\n /** Inclusive maximum string length. */\n maxLength?: number;\n /** Inclusive minimum array length. */\n minItems?: number;\n /** Inclusive maximum array length. */\n maxItems?: number;\n /** Regular expression pattern applied to string values. */\n pattern?: string;\n /** Whether array elements must be unique. */\n uniqueItems?: boolean;\n /** Format hint for downstream validators and tooling. */\n format?: string;\n // Annotations\n /** Human-readable title for the schema node. */\n title?: string;\n /** Human-readable description for the schema node. */\n description?: string;\n /** Default value suggested for the schema node. */\n default?: unknown;\n /** Whether the schema node is deprecated. */\n deprecated?: boolean;\n // Extensions (open for vendor-prefixed keywords, e.g., x-formspec-*, x-stripe-*)\n // The vendor prefix is configurable (white-labelable).\n /** Additional vendor-prefixed extension keywords. */\n [key: `x-${string}`]: unknown;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\n/**\n * Mutable accumulator passed through the generation traversal.\n *\n * Using a context object rather than return-value threading keeps the\n * recursive generators simple and avoids repeated object spreading.\n */\ninterface GeneratorContext {\n /** Named type schemas collected during traversal, keyed by reference name. */\n readonly defs: Record<string, JsonSchema2020>;\n /** Logical type name to serialized `$defs` key. */\n readonly typeNameMap: Readonly<Record<string, string>>;\n /** Original type registry for reference lookups and property-name mapping. */\n readonly typeRegistry: Readonly<FormIR[\"typeRegistry\"]>;\n /** Optional extension registry for resolving custom IR nodes. */\n readonly extensionRegistry: ExtensionRegistry | undefined;\n /** Vendor prefix passed through to extension toJsonSchema handlers. */\n readonly vendorPrefix: string;\n /** Selected JSON Schema representation for enum-like values. */\n readonly enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\";\n}\n\n/**\n * Options for generating JSON Schema from a canonical FormIR.\n *\n * @internal\n */\nexport interface GenerateJsonSchemaFromIROptions {\n /**\n * Registry used to resolve custom types, constraints, and annotations.\n *\n * JSON Schema generation throws when custom IR nodes are present without a\n * matching registration in this registry.\n */\n readonly extensionRegistry?: ExtensionRegistry | undefined;\n /**\n * Vendor prefix passed to extension `toJsonSchema` hooks.\n * @defaultValue \"x-formspec\"\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n}\n\n/**\n * Normalizes enum serialization input so JavaScript callers still get a\n * runtime validation error for unsupported values.\n */\nfunction parseEnumSerialization(value: unknown): GeneratorContext[\"enumSerialization\"] {\n switch (value) {\n case undefined:\n case \"enum\":\n return \"enum\";\n case \"oneOf\":\n return \"oneOf\";\n case \"smart-size\":\n return \"smart-size\";\n default:\n throw new Error(\n `Invalid enumSerialization \"${String(value)}\". Expected \"enum\", \"oneOf\", or \"smart-size\".`\n );\n }\n}\n\nfunction makeContext(options?: GenerateJsonSchemaFromIROptions): GeneratorContext {\n const vendorPrefix = options?.vendorPrefix ?? \"x-formspec\";\n const enumSerialization = parseEnumSerialization(options?.enumSerialization);\n if (!vendorPrefix.startsWith(\"x-\")) {\n throw new Error(\n `Invalid vendorPrefix \"${vendorPrefix}\". Extension JSON Schema keywords must start with \"x-\".`\n );\n }\n\n return {\n defs: {},\n typeNameMap: {},\n typeRegistry: {},\n extensionRegistry: options?.extensionRegistry,\n vendorPrefix,\n enumSerialization,\n };\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Generates a JSON Schema 2020-12 object from a canonical FormIR.\n *\n * Groups and conditionals are flattened — they influence UI layout but do not\n * affect the data schema. All fields appear at the level they would occupy in\n * the output data.\n *\n * Named types in the `typeRegistry` are emitted as `$defs` entries and\n * referenced via `$ref` (per PP7 — high-fidelity output).\n *\n * @example\n * ```typescript\n * import { canonicalizeDSL } from \"./canonicalize/index.js\";\n * import { generateJsonSchemaFromIR } from \"./json-schema/ir-generator.js\";\n * import { formspec, field } from \"@formspec/dsl\";\n *\n * const form = formspec(\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n * const ir = canonicalizeDSL(form);\n * const schema = generateJsonSchemaFromIR(ir);\n * // {\n * // $schema: \"https://json-schema.org/draft/2020-12/schema\",\n * // type: \"object\",\n * // properties: {\n * // name: { type: \"string\", title: \"Name\" },\n * // age: { type: \"number\", minimum: 0 }\n * // },\n * // required: [\"name\"]\n * // }\n * ```\n *\n * Advanced API — most consumers should use `generateJsonSchema()` or\n * `buildFormSchemas()`, which canonicalize form definitions automatically.\n * Callers of this function are responsible for providing pre-canonicalized IR.\n *\n * @param ir - The canonical FormIR produced by a canonicalizer\n * @returns A plain JSON-serializable JSON Schema 2020-12 object\n *\n * @internal\n */\nexport function generateJsonSchemaFromIR(\n ir: FormIR,\n options?: GenerateJsonSchemaFromIROptions\n): JsonSchema2020 {\n assertNoSerializedNameCollisions(ir);\n\n const ctx = {\n ...makeContext(options),\n typeRegistry: ir.typeRegistry,\n typeNameMap: Object.fromEntries(\n Object.entries(ir.typeRegistry).map(([name, typeDef]) => [\n name,\n getSerializedName(name, typeDef.metadata),\n ])\n ),\n };\n\n // Seed $defs from the type registry so referenced types are available even if\n // the field tree traversal never visits them (e.g., unreferenced types added\n // by a TSDoc canonicalizer pass).\n for (const [name, typeDef] of Object.entries(ir.typeRegistry)) {\n const schemaName = ctx.typeNameMap[name] ?? name;\n ctx.defs[schemaName] = generateTypeNode(typeDef.type, ctx);\n applyResolvedMetadata(ctx.defs[schemaName], typeDef.metadata);\n if (typeDef.constraints && typeDef.constraints.length > 0) {\n applyConstraints(ctx.defs[schemaName], typeDef.constraints, ctx);\n }\n if (typeDef.annotations && typeDef.annotations.length > 0) {\n applyAnnotations(ctx.defs[schemaName], typeDef.annotations, ctx, typeDef.type);\n }\n }\n\n const properties: Record<string, JsonSchema2020> = {};\n const required: string[] = [];\n\n collectFields(ir.elements, properties, required, ctx);\n\n // Deduplicate required (same field can appear across conditional branches).\n const uniqueRequired = [...new Set(required)];\n\n const result: JsonSchema2020 = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n type: \"object\",\n properties,\n ...(uniqueRequired.length > 0 && { required: uniqueRequired }),\n };\n applyResolvedMetadata(result, ir.metadata);\n\n if (ir.annotations && ir.annotations.length > 0) {\n applyAnnotations(result, ir.annotations, ctx);\n }\n\n if (Object.keys(ctx.defs).length > 0) {\n result.$defs = ctx.defs;\n }\n\n return result;\n}\n\n// =============================================================================\n// ELEMENT TRAVERSAL\n// =============================================================================\n\n/**\n * Recursively visits all IR elements, collecting field schemas and required names.\n *\n * Groups and conditionals are transparent to the schema — their children are\n * lifted to the enclosing level (per the JSON Schema vocabulary spec §1.2).\n */\nfunction collectFields(\n elements: readonly FormIRElement[],\n properties: Record<string, JsonSchema2020>,\n required: string[],\n ctx: GeneratorContext\n): void {\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n properties[getSerializedFieldName(element)] = generateFieldSchema(element, ctx);\n if (element.required) {\n required.push(getSerializedFieldName(element));\n }\n break;\n\n case \"group\":\n // Groups are UI-only; flatten children into the enclosing schema.\n collectFields(element.elements, properties, required, ctx);\n break;\n\n case \"conditional\":\n // Conditional visibility is UI-only; all fields remain in the schema.\n collectFields(element.elements, properties, required, ctx);\n break;\n\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n}\n\n// =============================================================================\n// FIELD SCHEMA GENERATION\n// =============================================================================\n\n/**\n * Generates the JSON Schema sub-schema for a single FieldNode.\n */\nfunction generateFieldSchema(field: FieldNode, ctx: GeneratorContext): JsonSchema2020 {\n const schema = generateTypeNode(field.type, ctx);\n const itemStringSchema =\n schema.type === \"array\" && schema.items?.type === \"string\" ? schema.items : undefined;\n\n // Partition constraints into direct (no path) and path-targeted.\n const directConstraints: ConstraintNode[] = [];\n const itemConstraints: ConstraintNode[] = [];\n const pathConstraints: ConstraintNode[] = [];\n for (const c of field.constraints) {\n if (c.path) {\n pathConstraints.push(c);\n } else if (itemStringSchema !== undefined && isStringItemConstraint(c)) {\n itemConstraints.push(c);\n } else {\n directConstraints.push(c);\n }\n }\n\n // Apply direct constraints. multipleOf:1 on a number type is a special case:\n // it promotes the type to \"integer\" and removes the multipleOf keyword.\n applyConstraints(schema, directConstraints, ctx);\n\n if (itemStringSchema !== undefined) {\n applyConstraints(itemStringSchema, itemConstraints, ctx);\n }\n\n // Apply annotations (title, description, default, deprecated, etc.).\n const rootAnnotations: AnnotationNode[] = [];\n const itemAnnotations: AnnotationNode[] = [];\n for (const annotation of field.annotations) {\n if (itemStringSchema !== undefined && annotation.annotationKind === \"format\") {\n itemAnnotations.push(annotation);\n } else {\n rootAnnotations.push(annotation);\n }\n }\n\n applyResolvedMetadata(schema, field.metadata);\n applyAnnotations(schema, rootAnnotations, ctx, field.type);\n if (itemStringSchema !== undefined) {\n applyAnnotations(itemStringSchema, itemAnnotations, ctx);\n }\n\n // If no path-targeted constraints, return as-is.\n if (pathConstraints.length === 0) {\n return schema;\n }\n\n return applyPathTargetedConstraints(schema, pathConstraints, ctx, field.type);\n}\n\n/**\n * Returns true if a constraint should be applied to the `items` schema of a\n * primitive `string[]` rather than the array itself.\n *\n * `@const` is intentionally excluded: arrays cannot carry primitive const\n * constraints in FormSpec, so `@const` on `string[]` remains a validation\n * error instead of targeting the item schema.\n */\nfunction isStringItemConstraint(constraint: ConstraintNode): boolean {\n switch (constraint.constraintKind) {\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Applies path-targeted constraints to a schema using JSON Schema 2020-12\n * sibling keywords wherever possible.\n *\n * For $ref schemas: merges property overrides as sibling keywords alongside\n * `$ref`. JSON Schema 2020-12 §10.2.1 allows keywords to appear next to\n * `$ref`; the draft-07 restriction that required `allOf` composition no\n * longer applies. Sibling emission preserves `$defs` deduplication and\n * produces leaner output downstream renderers can consume directly (#364).\n *\n * For inline object schemas: merges property overrides flat into\n * `properties`. Declaring the key in `properties` legitimizes it regardless\n * of `additionalProperties`, so no `allOf` wrapper is needed even when the\n * base is closed (#366, #382 Site 1).\n *\n * For already-composed `allOf` schemas: flatten to siblings when the\n * composition is expressible that way under 2020-12; otherwise append the\n * override as another `allOf` member (#382 Site 2).\n *\n * For array schemas: recurse into the `items` sub-schema.\n *\n * @see https://github.com/mike-north/formspec/issues/364\n * @see https://github.com/mike-north/formspec/issues/366\n * @see https://github.com/mike-north/formspec/issues/382\n * @see https://json-schema.org/draft/2020-12/json-schema-core — §10.2.1 sibling keywords\n */\nfunction applyPathTargetedConstraints(\n schema: JsonSchema2020,\n pathConstraints: readonly ConstraintNode[],\n ctx: GeneratorContext,\n typeNode?: TypeNode\n): JsonSchema2020 {\n // Array transparency: path-targeted constraints target the item type.\n if (schema.type === \"array\" && schema.items) {\n const referencedType =\n typeNode?.kind === \"reference\" ? resolveReferencedType(typeNode, ctx) : undefined;\n const nestedType =\n typeNode?.kind === \"array\"\n ? typeNode.items\n : referencedType?.kind === \"array\"\n ? referencedType.items\n : undefined;\n schema.items = applyPathTargetedConstraints(schema.items, pathConstraints, ctx, nestedType);\n return schema;\n }\n\n const propertyOverrides = buildPropertyOverrides(pathConstraints, typeNode, ctx);\n const nullableValueBranch = getNullableUnionValueSchema(schema);\n\n if (nullableValueBranch !== undefined) {\n const updatedNullableValueBranch = applyPathTargetedConstraints(\n nullableValueBranch,\n pathConstraints,\n ctx,\n resolveTraversableTypeNode(typeNode, ctx)\n );\n if (schema.oneOf !== undefined) {\n schema.oneOf = schema.oneOf.map((branch) =>\n branch === nullableValueBranch ? updatedNullableValueBranch : branch\n );\n }\n return schema;\n }\n\n // $ref schema: add property overrides as sibling keywords alongside $ref.\n // JSON Schema 2020-12 §10.2.1 explicitly permits sibling keywords next to\n // $ref, unlike draft-07 where $ref caused all siblings to be ignored. Using\n // sibling keywords avoids unnecessary allOf composition and preserves $defs\n // deduplication. (Fixes #364.)\n //\n // Invariant: upstream reference resolution produces `$ref` schemas that do\n // not carry their own `properties` key, so this spread-then-overwrite is\n // safe today. If that ever changes, the override must still win — merge\n // explicitly via `properties: { ...schema.properties, ...propertyOverrides }`.\n if (schema.$ref) {\n return {\n ...schema,\n properties: propertyOverrides,\n };\n }\n\n // Inline object schema: merge property overrides directly into siblings.\n //\n // Previously missing-property overrides were composed via `allOf` to keep\n // `additionalProperties` semantics intact. JSON Schema 2020-12 (§10.2.1)\n // lets us express this as a single flat object: merge the override into\n // `properties` (which legitimizes the key even under\n // `additionalProperties: false`) and preserve `additionalProperties`/`type`\n // as siblings. Downstream renderers that do not unwrap `allOf` can now see\n // the override. (Fixes #366 and #382 Site 1.)\n if (schema.type === \"object\" && schema.properties) {\n for (const [target, overrideSchema] of Object.entries(propertyOverrides)) {\n // Own-property lookup + defineProperty guard against prototype-pollution\n // vectors when a path target names a key like `__proto__`:\n // - Plain `obj[target] = value` assignment with target === \"__proto__\"\n // invokes the Object.prototype `__proto__` setter, replacing the\n // object's [[Prototype]] instead of adding an own property.\n // - `Object.defineProperty` bypasses the setter and writes an own\n // data property, so the override lands where we expect.\n // `Object.hasOwn` (not `in`) rejects inherited members like\n // `constructor`, avoiding a mis-merge into Object.prototype.constructor.\n if (Object.hasOwn(schema.properties, target)) {\n const existing = schema.properties[target];\n if (existing) {\n mergeSchemaOverride(existing, overrideSchema);\n continue;\n }\n }\n Object.defineProperty(schema.properties, target, {\n value: overrideSchema,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return schema;\n }\n\n // Pre-composed allOf base: flatten to siblings when the composition is\n // expressible that way under 2020-12; otherwise append as a new allOf\n // member. Expressible-as-siblings means the allOf has a single member whose\n // keys do not conflict with the override's keys (mirrors the $ref-sibling\n // fix in #365 above). (Fixes #382 Site 2.)\n if (schema.allOf) {\n const overrideMember: JsonSchema2020 = { properties: propertyOverrides };\n const flattened = tryFlattenAllOfToSiblings(schema, overrideMember);\n if (flattened !== undefined) {\n return flattened;\n }\n schema.allOf = [...schema.allOf, overrideMember];\n return schema;\n }\n\n // Fallback: for non-object/non-$ref schemas, path-targeted constraints do not\n // apply in a meaningful way. Return the original schema unchanged and rely\n // on validation diagnostics to surface misuse of path-based constraints.\n return schema;\n}\n\n// =============================================================================\n// TYPE NODE GENERATION\n// =============================================================================\n\n/**\n * Converts a TypeNode to a JSON Schema sub-schema.\n *\n * This function is intentionally exhaustive — all TypeNode variants are handled.\n * TypeScript's exhaustiveness check via the default branch ensures new variants\n * added to the IR are caught at compile time.\n */\nfunction generateTypeNode(type: TypeNode, ctx: GeneratorContext): JsonSchema2020 {\n switch (type.kind) {\n case \"primitive\":\n return generatePrimitiveType(type);\n\n case \"enum\":\n return generateEnumType(type, ctx);\n\n case \"array\":\n return generateArrayType(type, ctx);\n\n case \"object\":\n return generateObjectType(type, ctx);\n\n case \"record\":\n return generateRecordType(type, ctx);\n\n case \"union\":\n return generateUnionType(type, ctx);\n\n case \"reference\":\n return generateReferenceType(type, ctx);\n\n case \"dynamic\":\n return generateDynamicType(type);\n\n case \"custom\":\n return generateCustomType(type, ctx);\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Maps primitive IR types to JSON Schema type keywords.\n *\n * Note: `integer` is NOT a primitive kind in the IR. Integer semantics are\n * expressed via a `multipleOf: 1` constraint on a number type; `applyConstraints`\n * handles the promotion (per the JSON Schema vocabulary spec §2.1).\n */\nfunction generatePrimitiveType(type: PrimitiveTypeNode): JsonSchema2020 {\n return {\n type:\n type.primitiveKind === \"integer\" || type.primitiveKind === \"bigint\"\n ? \"integer\"\n : type.primitiveKind,\n };\n}\n\n/**\n * Generates JSON Schema for a static enum type.\n *\n * Enum emission is caller-configurable. The default `enum` mode keeps the\n * compact keyword and adds a complete vendor-prefixed display-name map when\n * any member label is available. The `oneOf` mode emits per-member `const`\n * entries, and includes `title` only when the member has an explicit\n * `@displayName` that differs from the value — omitting redundant titles\n * such as `{ \"const\": \"USD\", \"title\": \"USD\" }` (#310). `smart-size`\n * chooses `oneOf` only when any effective title differs from the serialized\n * enum value.\n */\nfunction generateEnumType(type: EnumTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n if (\n ctx.enumSerialization === \"oneOf\" ||\n (ctx.enumSerialization === \"smart-size\" && shouldSerializeEnumAsOneOf(type))\n ) {\n return {\n oneOf: type.members.map((m) => {\n const stringValue = String(m.value);\n const title =\n m.displayName !== undefined && m.displayName !== stringValue ? m.displayName : undefined;\n return title !== undefined ? { const: m.value, title } : { const: m.value };\n }),\n };\n }\n\n const schema: JsonSchema2020 = { enum: type.members.map((m) => m.value) };\n if (ctx.enumSerialization === \"smart-size\") {\n return schema;\n }\n\n const displayNames = buildEnumDisplayNameExtension(type);\n if (displayNames !== undefined) {\n // Emit either no extension at all or a complete map for every member.\n schema[`${ctx.vendorPrefix}-display-names` as `x-${string}`] = displayNames;\n }\n return schema;\n}\n\n/**\n * `smart-size` can stay compact when every visible title would only restate\n * the enum value. Any distinct title requires `oneOf` so that label survives.\n */\nfunction shouldSerializeEnumAsOneOf(type: EnumTypeNode): boolean {\n return type.members.some((member) => {\n const title = member.displayName ?? String(member.value);\n return title !== String(member.value);\n });\n}\n\nfunction buildEnumDisplayNameExtension(type: EnumTypeNode): Record<string, string> | undefined {\n if (!type.members.some((member) => member.displayName !== undefined)) {\n return undefined;\n }\n\n const displayNames: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const member of type.members) {\n const key = String(member.value);\n if (Object.hasOwn(displayNames, key)) {\n throw new Error(\n `Enum display-name key \"${key}\" is ambiguous after stringification. ` +\n `Use oneOf serialization for mixed string/number enum values that collide.`\n );\n }\n displayNames[key] = member.displayName ?? key;\n }\n\n return displayNames;\n}\n\n/**\n * Generates JSON Schema for an array type.\n * Per 2020-12, `items` is a single schema (not an array); tuple types use\n * `prefixItems` + `items: false`.\n */\nfunction generateArrayType(type: ArrayTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return {\n type: \"array\",\n items: generateTypeNode(type.items, ctx),\n };\n}\n\n/**\n * Generates JSON Schema for an object type.\n *\n * `additionalProperties` is emitted only when the IR explicitly closes the\n * object. Ordinary static object types now canonicalize to\n * `additionalProperties: true`, which omits the keyword per spec 003 §2.5.\n */\nfunction generateObjectType(type: ObjectTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n const properties: Record<string, JsonSchema2020> = {};\n const required: string[] = [];\n\n for (const prop of type.properties) {\n const propertyName = getSerializedObjectPropertyName(prop);\n properties[propertyName] = generatePropertySchema(prop, ctx);\n if (!prop.optional) {\n required.push(propertyName);\n }\n }\n\n const schema: JsonSchema2020 = { type: \"object\", properties };\n\n if (required.length > 0) {\n schema.required = required;\n }\n\n if (!type.additionalProperties) {\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Generates JSON Schema for a record (dictionary) type per spec 003 §2.5.\n *\n * `Record<string, T>` and `{ [k: string]: T }` both emit:\n * `{ \"type\": \"object\", \"additionalProperties\": <T schema> }`\n *\n * No `properties` key is emitted — the record has no named properties.\n */\nfunction generateRecordType(type: RecordTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return {\n type: \"object\",\n additionalProperties: generateTypeNode(type.valueType, ctx),\n };\n}\n\n/**\n * Generates a schema for an ObjectProperty, applying its use-site constraints\n * and annotations (per the JSON Schema vocabulary spec §5.4 — inline allOf at use site).\n */\nfunction generatePropertySchema(prop: ObjectProperty, ctx: GeneratorContext): JsonSchema2020 {\n const schema = generateTypeNode(prop.type, ctx);\n applyConstraints(schema, prop.constraints, ctx);\n applyResolvedMetadata(schema, prop.metadata);\n applyAnnotations(schema, prop.annotations, ctx, prop.type);\n return schema;\n}\n\n/**\n * Generates JSON Schema for a union type.\n *\n * Union handling strategy (per spec 003):\n * - Boolean shorthand: `true | false` → `{ type: \"boolean\" }` (not oneOf/anyOf)\n * - Nullable unions: `T | null` → `{ \"oneOf\": [<T schema>, { \"type\": \"null\" }] }` (§2.3)\n * - All other unions → `anyOf` (members may overlap; discriminated union\n * detection is deferred to a future phase per design doc 003 §7.4)\n */\nfunction generateUnionType(type: UnionTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n // Boolean shorthand: union of true-literal and false-literal → type: \"boolean\"\n if (isBooleanUnion(type)) {\n return { type: \"boolean\" };\n }\n\n // Nullable union: `T | null` → oneOf per spec 003 §2.3.\n // A nullable union is any union where exactly one member is the null primitive.\n if (isNullableUnion(type)) {\n return {\n oneOf: type.members.map((m) => generateTypeNode(m, ctx)),\n };\n }\n\n // Default: anyOf for non-discriminated object unions (spec 003 §7.4).\n // Discriminated union detection (shared required property with distinct consts)\n // is deferred to a future phase.\n return {\n anyOf: type.members.map((m) => generateTypeNode(m, ctx)),\n };\n}\n\n/**\n * Returns true if the union is `true | false` (boolean shorthand).\n */\nfunction isBooleanUnion(type: UnionTypeNode): boolean {\n if (type.members.length !== 2) return false;\n const kinds = type.members.map((m) => m.kind);\n // Both must be primitives; check if both are \"boolean\" primitives.\n // The IR currently does not have a boolean literal node, so boolean union\n // is represented as two primitive boolean members.\n return (\n kinds.every((k) => k === \"primitive\") &&\n type.members.every((m) => m.kind === \"primitive\" && m.primitiveKind === \"boolean\")\n );\n}\n\n/**\n * Returns true if the union is a nullable wrapper union (`T | null` for any T).\n *\n * A nullable union is a two-member union where exactly one member is the `null`\n * primitive type and the other member is any non-null type.\n * Per spec 003 §2.3, nullable unions map to `oneOf` (not `anyOf`).\n */\nfunction isNullableUnion(type: UnionTypeNode): boolean {\n if (type.members.length !== 2) return false;\n const nullCount = type.members.filter(\n (m) => m.kind === \"primitive\" && m.primitiveKind === \"null\"\n ).length;\n return nullCount === 1;\n}\n\n/**\n * Generates JSON Schema for a reference type.\n *\n * The referenced type's schema is stored in `$defs` (seeded from the type\n * registry before traversal begins). The reference simply emits a `$ref`.\n */\nfunction generateReferenceType(type: ReferenceTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return { $ref: `#/$defs/${getSerializedTypeName(type.name, ctx)}` };\n}\n\nfunction getSerializedFieldName(field: Pick<FieldNode, \"name\" | \"metadata\">): string {\n return getSerializedName(field.name, field.metadata);\n}\n\nfunction getSerializedObjectPropertyName(\n property: Pick<ObjectProperty, \"name\" | \"metadata\">\n): string {\n return getSerializedName(property.name, property.metadata);\n}\n\nfunction getSerializedTypeName(logicalName: string, ctx: GeneratorContext): string {\n return ctx.typeNameMap[logicalName] ?? logicalName;\n}\n\nfunction applyResolvedMetadata(\n schema: JsonSchema2020,\n metadata: ResolvedMetadata | undefined\n): void {\n const displayName = getDisplayName(metadata);\n if (displayName !== undefined) {\n schema.title = displayName;\n }\n}\n\nfunction resolveReferencedType(\n type: ReferenceTypeNode,\n ctx: GeneratorContext\n): TypeNode | undefined {\n return ctx.typeRegistry[type.name]?.type;\n}\n\nfunction dereferenceTypeNode(\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n if (typeNode?.kind !== \"reference\") {\n return typeNode;\n }\n\n return resolveReferencedType(typeNode, ctx);\n}\n\nfunction unwrapNullableTypeNode(typeNode: TypeNode | undefined): TypeNode | undefined {\n if (typeNode?.kind !== \"union\" || !isNullableUnion(typeNode)) {\n return typeNode;\n }\n\n return typeNode.members.find(\n (member) => !(member.kind === \"primitive\" && member.primitiveKind === \"null\")\n );\n}\n\nfunction resolveTraversableTypeNode(\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n const dereferenced = dereferenceTypeNode(typeNode, ctx);\n const unwrapped = unwrapNullableTypeNode(dereferenced);\n\n if (unwrapped !== dereferenced) {\n return resolveTraversableTypeNode(unwrapped, ctx);\n }\n\n return dereferenced;\n}\n\nfunction resolveSerializedPropertyName(\n logicalName: string,\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): string {\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n return resolveSerializedPropertyName(logicalName, effectiveType.items, ctx);\n }\n\n if (effectiveType?.kind === \"object\") {\n const property = effectiveType.properties.find((candidate) => candidate.name === logicalName);\n return property === undefined ? logicalName : getSerializedObjectPropertyName(property);\n }\n\n return logicalName;\n}\n\nfunction resolveTargetTypeNode(\n logicalName: string,\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n return resolveTargetTypeNode(logicalName, effectiveType.items, ctx);\n }\n\n if (effectiveType?.kind !== \"object\") {\n return undefined;\n }\n\n return effectiveType.properties.find((candidate) => candidate.name === logicalName)?.type;\n}\n\nfunction buildPropertyOverrides(\n pathConstraints: readonly ConstraintNode[],\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): Record<string, JsonSchema2020> {\n const byTarget = new Map<string, ConstraintNode[]>();\n\n for (const constraint of pathConstraints) {\n const target = constraint.path?.segments[0];\n if (!target) {\n continue;\n }\n const grouped = byTarget.get(target) ?? [];\n grouped.push(constraint);\n byTarget.set(target, grouped);\n }\n\n // Null-prototype map so path-targeted keys like `__proto__` or `constructor`\n // become own properties rather than invoking Object.prototype setters or\n // matching inherited members. This is the upstream half of the\n // prototype-pollution hardening at Site 1 in `applyPathTargetedConstraints`:\n // without it, `overrides[\"__proto__\"] = ...` replaces this map's own\n // [[Prototype]] and `Object.entries(overrides)` yields `[]`, silently\n // dropping the constraint before the Site 1 guard can run.\n const overrides = Object.create(null) as Record<string, JsonSchema2020>;\n for (const [target, constraints] of byTarget) {\n const resolvedName = resolveSerializedPropertyName(target, typeNode, ctx);\n const schema = buildPathOverrideSchema(\n constraints.map(stripLeadingPathSegment),\n resolveTargetTypeNode(target, typeNode, ctx),\n ctx\n );\n Object.defineProperty(overrides, resolvedName, {\n value: schema,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n return overrides;\n}\n\nfunction buildPathOverrideSchema(\n constraints: readonly ConstraintNode[],\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): JsonSchema2020 {\n const schema: JsonSchema2020 = {};\n const directConstraints: ConstraintNode[] = [];\n const nestedConstraints: ConstraintNode[] = [];\n\n for (const constraint of constraints) {\n if (constraint.path === undefined || constraint.path.segments.length === 0) {\n directConstraints.push(constraint);\n } else {\n nestedConstraints.push(constraint);\n }\n }\n\n applyConstraints(schema, directConstraints, ctx);\n\n if (nestedConstraints.length === 0) {\n return schema;\n }\n\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n schema.items = buildPathOverrideSchema(nestedConstraints, effectiveType.items, ctx);\n return schema;\n }\n\n schema.properties = buildPropertyOverrides(nestedConstraints, effectiveType, ctx);\n return schema;\n}\n\n/**\n * Attempts to flatten a pre-composed `allOf` schema into sibling keywords\n * when the JSON Schema 2020-12 evaluation semantics allow it.\n *\n * Flattening is safe when the allOf has **exactly one** member and that\n * member's keys do not collide with either the outer schema's keys or the\n * new override member's keys. In that case we lift the single member's\n * keys up alongside the outer schema and attach the override as siblings —\n * producing `{ <outer keys...>, <member keys...>, <override keys...> }`.\n *\n * When flattening is not safe (multiple members, or key collisions that\n * would silently overwrite one contribution), returns `undefined` and the\n * caller falls back to appending an `allOf` member.\n *\n * The single-member restriction is a conservative scope choice, not a\n * JSON Schema 2020-12 semantic constraint. In-tree emission paths only\n * ever produce single-member `allOf` wrappers. Multi-member `allOf`\n * reaches this helper only from user-supplied `toJsonSchema` hooks,\n * where the multiple members typically represent intentional composition\n * that should not be silently flattened. Pairwise-disjoint N-member\n * flattening is semantically valid but is not performed today because\n * no current producer requires it.\n *\n * Mirrors the `$ref`-sibling fix at `ir-generator.ts:492-497` (issue #364).\n *\n * @see https://github.com/mike-north/formspec/issues/382 Site 2\n * @see https://json-schema.org/draft/2020-12/json-schema-core — §10.2.1 sibling keywords\n */\nfunction tryFlattenAllOfToSiblings(\n schema: JsonSchema2020,\n overrideMember: JsonSchema2020\n): JsonSchema2020 | undefined {\n if (schema.allOf?.length !== 1) {\n return undefined;\n }\n\n // Defensive-only; required under `noUncheckedIndexedAccess`.\n const [soleMember] = schema.allOf;\n if (soleMember === undefined) {\n return undefined;\n }\n\n // Outer schema sans allOf — what the siblings would sit next to.\n const { allOf: _allOf, ...outerRest } = schema;\n\n const outerKeys = new Set(Object.keys(outerRest));\n const memberKeys = new Set(Object.keys(soleMember));\n const overrideKeys = new Set(Object.keys(overrideMember));\n\n // Any overlap between the three contributions would silently overwrite\n // one side — keep `allOf` to preserve both under 2020-12 evaluation.\n for (const key of memberKeys) {\n if (outerKeys.has(key) || overrideKeys.has(key)) {\n return undefined;\n }\n }\n for (const key of overrideKeys) {\n if (outerKeys.has(key)) {\n return undefined;\n }\n }\n\n return {\n ...outerRest,\n ...soleMember,\n ...overrideMember,\n };\n}\n\nfunction mergeSchemaOverride(target: JsonSchema2020, override: JsonSchema2020): void {\n const nullableValueBranch = getNullableUnionValueSchema(target);\n if (nullableValueBranch !== undefined) {\n mergeSchemaOverride(nullableValueBranch, override);\n return;\n }\n\n if (override.properties !== undefined) {\n // Fresh maps use a null prototype so `__proto__`-named path segments can\n // land as own properties. Existing maps are preserved as-is — when they\n // came from `buildPropertyOverrides` they are already null-prototype; when\n // they came from an external `toJsonSchema` hook they are a plain object\n // whose own-property shape we do not modify.\n const mergedProperties =\n target.properties ?? (Object.create(null) as Record<string, JsonSchema2020>);\n for (const [name, propertyOverride] of Object.entries(override.properties)) {\n const existing = Object.hasOwn(mergedProperties, name) ? mergedProperties[name] : undefined;\n if (existing === undefined) {\n // `defineProperty` bypasses the `__proto__` setter on regular-prototype\n // maps; safe no-op on null-prototype maps. See the hardening comment\n // at Site 1 in `applyPathTargetedConstraints` for the full rationale.\n Object.defineProperty(mergedProperties, name, {\n value: propertyOverride,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n mergeSchemaOverride(existing, propertyOverride);\n }\n }\n target.properties = mergedProperties;\n }\n\n if (override.items !== undefined) {\n if (target.items === undefined) {\n target.items = override.items;\n } else {\n mergeSchemaOverride(target.items, override.items);\n }\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (key === \"properties\" || key === \"items\") {\n continue;\n }\n // `defineProperty` guards against the same prototype-pollution vector as\n // the nested-properties branch above, for completeness. Schema keywords\n // like `minimum`/`type` are never `__proto__`, but callers reach this\n // code path through recursion from path-targeted overrides where the\n // boundary is not locally enforceable.\n Object.defineProperty(target, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n}\n\nfunction stripLeadingPathSegment(constraint: ConstraintNode): ConstraintNode {\n const segments = constraint.path?.segments;\n if (segments === undefined || segments.length === 0) {\n return constraint;\n }\n\n const [, ...rest] = segments;\n if (rest.length === 0) {\n const { path: _path, ...stripped } = constraint;\n return stripped;\n }\n\n return {\n ...constraint,\n path: { segments: rest },\n };\n}\n\nfunction getNullableUnionValueSchema(schema: JsonSchema2020): JsonSchema2020 | undefined {\n if (schema.oneOf?.length !== 2) {\n return undefined;\n }\n\n const valueSchema = schema.oneOf.find((branch) => branch.type !== \"null\");\n const nullSchema = schema.oneOf.find((branch) => branch.type === \"null\");\n return valueSchema !== undefined && nullSchema !== undefined ? valueSchema : undefined;\n}\n\n/**\n * Generates JSON Schema for a dynamic type (runtime-resolved enum or schema).\n *\n * Dynamic enums emit `x-formspec-source` and optionally `x-formspec-params`.\n * Dynamic schemas emit `x-formspec-schemaSource` with `additionalProperties: true`\n * since the actual schema is determined at runtime (per the JSON Schema vocabulary spec §3.2).\n */\nfunction generateDynamicType(type: DynamicTypeNode): JsonSchema2020 {\n if (type.dynamicKind === \"enum\") {\n const schema: JsonSchema2020 = {\n type: \"string\",\n \"x-formspec-source\": type.sourceKey,\n };\n if (type.parameterFields.length > 0) {\n schema[\"x-formspec-params\"] = [...type.parameterFields];\n }\n return schema;\n }\n\n // dynamicKind === \"schema\"\n return {\n type: \"object\",\n additionalProperties: true,\n \"x-formspec-schemaSource\": type.sourceKey,\n };\n}\n\n// =============================================================================\n// CONSTRAINT APPLICATION\n// =============================================================================\n\n/**\n * Applies constraint nodes onto an existing JSON Schema object (mutates in place).\n *\n * All callers pass freshly-created objects so there is no aliasing risk.\n *\n * Special rule (per the JSON Schema vocabulary spec §2.1): `multipleOf: 1` on a `\"number\"` type\n * promotes to `\"integer\"` and suppresses the `multipleOf` keyword (integer is a\n * subtype of number; expressing it via multipleOf:1 is redundant).\n *\n * Path-targeted constraints are handled separately by `applyPathTargetedConstraints`.\n */\nfunction applyConstraints(\n schema: JsonSchema2020,\n constraints: readonly ConstraintNode[],\n ctx: GeneratorContext\n): void {\n for (const constraint of constraints) {\n switch (constraint.constraintKind) {\n case \"minimum\":\n schema.minimum = constraint.value;\n break;\n\n case \"maximum\":\n schema.maximum = constraint.value;\n break;\n\n case \"exclusiveMinimum\":\n schema.exclusiveMinimum = constraint.value;\n break;\n\n case \"exclusiveMaximum\":\n schema.exclusiveMaximum = constraint.value;\n break;\n\n case \"multipleOf\": {\n const { value } = constraint;\n if (value === 1 && schema.type === \"number\") {\n // Promote number → integer; omit the multipleOf keyword (redundant).\n schema.type = \"integer\";\n } else {\n schema.multipleOf = value;\n }\n break;\n }\n\n case \"minLength\":\n schema.minLength = constraint.value;\n break;\n\n case \"maxLength\":\n schema.maxLength = constraint.value;\n break;\n\n case \"minItems\":\n schema.minItems = constraint.value;\n break;\n\n case \"maxItems\":\n schema.maxItems = constraint.value;\n break;\n\n case \"pattern\":\n schema.pattern = constraint.pattern;\n break;\n\n case \"uniqueItems\":\n schema.uniqueItems = constraint.value;\n break;\n\n case \"const\":\n schema.const = constraint.value;\n break;\n\n case \"allowedMembers\":\n // EnumMemberConstraintNode — not yet emitted to JSON Schema (Phase 6 validation).\n break;\n\n case \"custom\":\n applyCustomConstraint(schema, constraint, ctx);\n break;\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = constraint;\n void _exhaustive;\n }\n }\n }\n}\n\n// =============================================================================\n// ANNOTATION APPLICATION\n// =============================================================================\n\n/**\n * Applies annotation nodes onto an existing JSON Schema object (mutates in place).\n *\n * Mapping per the JSON Schema vocabulary spec §2.8:\n * - `displayName` → `title`\n * - `description` → `description` (from summary text, spec 002 §2.3)\n * - `remarks` → `x-<vendor>-remarks` (from @remarks, spec 003 §3.2)\n * - `defaultValue` → `default`\n * - `deprecated` → `deprecated: true` (2020-12 standard annotation)\n * - `format` → `format`\n *\n * UI-only annotations (`placeholder`, `formatHint`) are silently ignored here —\n * they belong in the UI Schema, not the data schema.\n */\nfunction applyAnnotations(\n schema: JsonSchema2020,\n annotations: readonly AnnotationNode[],\n ctx: GeneratorContext,\n typeNode?: TypeNode\n): void {\n for (const annotation of annotations) {\n switch (annotation.annotationKind) {\n case \"displayName\":\n schema.title ??= annotation.value;\n break;\n\n case \"description\":\n schema.description = annotation.value;\n break;\n\n case \"remarks\":\n schema[`${ctx.vendorPrefix}-remarks` as `x-${string}`] = annotation.value;\n break;\n\n case \"defaultValue\":\n schema.default = coerceDefaultValue(annotation.value, typeNode, schema, ctx);\n break;\n\n case \"format\":\n schema.format = annotation.value;\n break;\n\n case \"deprecated\":\n schema.deprecated = true;\n if (annotation.message !== undefined && annotation.message !== \"\") {\n schema[`${ctx.vendorPrefix}-deprecation-description` as `x-${string}`] =\n annotation.message;\n }\n break;\n\n case \"placeholder\":\n // UI-only — belongs in UI Schema, not emitted here.\n break;\n\n case \"formatHint\":\n // UI-only — belongs in UI Schema, not emitted here.\n break;\n\n case \"custom\":\n applyCustomAnnotation(schema, annotation, ctx);\n break;\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = annotation;\n void _exhaustive;\n }\n }\n }\n}\n\n/**\n * Coerces a `@defaultValue` literal to match the serialized shape of the\n * field's type.\n *\n * `@defaultValue` arguments are parsed as JavaScript literals (numbers,\n * booleans, strings, etc.) by the TSDoc parser and injected into the emitted\n * JSON Schema as-is. For custom types whose `toJsonSchema` output differs in\n * runtime shape from the parsed literal (for example, `Decimal` maps to\n * `{ type: \"string\" }` but authors naturally write `@defaultValue 9.99`),\n * emitting the literal unchanged produces a schema where `default` is\n * inconsistent with `type` — the emitted `default` would fail validation\n * against the very schema declaring it (see GitHub issue #358).\n *\n * Coercion strategy:\n * 1. If the underlying type is a custom type with a `serializeDefault` hook,\n * delegate fully to the extension.\n * 2. Otherwise, fall back to best-effort inference based on the `type` keyword\n * on the already-emitted schema: when the emitted schema has\n * `type: \"string\"`, coerce primitive non-string literals currently handled\n * by this function (`number`, `boolean`, and `bigint`) to strings. Other\n * values are left unchanged unless the extension provides\n * `serializeDefault`.\n * 3. For non-custom types, pass the value through unchanged.\n */\nfunction coerceDefaultValue(\n value: unknown,\n typeNode: TypeNode | undefined,\n emittedSchema: JsonSchema2020,\n ctx: GeneratorContext\n): unknown {\n if (typeNode?.kind !== \"custom\") {\n return value;\n }\n const registration = ctx.extensionRegistry?.findType(typeNode.typeId);\n if (registration === undefined) {\n return value;\n }\n\n if (registration.serializeDefault !== undefined) {\n return registration.serializeDefault(value, typeNode.payload);\n }\n\n // Inference fallback: reuse the already-emitted schema from generateCustomType\n // rather than invoking `toJsonSchema` a second time — that call may be\n // expensive and is not required to be pure.\n const declaredType = (emittedSchema as Record<string, unknown>)[\"type\"];\n if (declaredType === \"string\" && typeof value !== \"string\") {\n // Coerce number/boolean/bigint literals into their string form so the\n // emitted `default` conforms to the custom type's JSON Schema `type`.\n // Non-finite numbers (NaN, Infinity, -Infinity) are not representable in\n // JSON Schema and would stringify to values like \"NaN\" that the author\n // almost certainly did not mean — pass them through unchanged and let\n // downstream validation surface the issue.\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n return value;\n }\n return String(value);\n }\n if (typeof value === \"boolean\") {\n return String(value);\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n }\n\n return value;\n}\n\nfunction generateCustomType(type: CustomTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n const registration = ctx.extensionRegistry?.findType(type.typeId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom type \"${type.typeId}\" without a matching extension registration`\n );\n }\n\n // Trust boundary: extensions are responsible for returning valid JSON Schema.\n // Core only depends on Record<string, unknown> here, so we cast at the edge.\n return registration.toJsonSchema(type.payload, ctx.vendorPrefix) as JsonSchema2020;\n}\n\n/**\n * JSON Schema keywords that vocabulary-mode constraints (`emitsVocabularyKeywords`)\n * must not overwrite. Includes standard JSON Schema keywords (2020-12 and legacy):\n * structural (`type`, `properties`, `$ref`), annotation (`title`, `description`),\n * and validation (`minimum`, `maximum`, `minLength`, etc.).\n *\n * Integer types are now builtin (via `__integerBrand`), so standard numeric\n * constraints (`@minimum`, `@maximum`, etc.) are handled natively by the IR\n * pipeline — extensions never need to emit these keywords.\n */\nconst VOCABULARY_MODE_BLOCKED_KEYWORDS = new Set([\n \"$schema\",\n \"$ref\",\n \"$defs\",\n \"$id\",\n \"$anchor\",\n \"$dynamicRef\",\n \"$dynamicAnchor\",\n \"$vocabulary\",\n \"$comment\",\n \"type\",\n \"enum\",\n \"const\",\n \"properties\",\n \"patternProperties\",\n \"additionalProperties\",\n \"required\",\n \"items\",\n \"prefixItems\",\n \"additionalItems\",\n \"contains\",\n \"allOf\",\n \"oneOf\",\n \"anyOf\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n \"minimum\",\n \"maximum\",\n \"exclusiveMinimum\",\n \"exclusiveMaximum\",\n \"multipleOf\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"minItems\",\n \"maxItems\",\n \"uniqueItems\",\n \"minProperties\",\n \"maxProperties\",\n \"minContains\",\n \"maxContains\",\n \"format\",\n \"title\",\n \"description\",\n \"default\",\n \"deprecated\",\n \"readOnly\",\n \"writeOnly\",\n \"examples\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"propertyNames\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\",\n \"contentEncoding\",\n \"contentMediaType\",\n \"contentSchema\",\n]);\n\nfunction applyCustomConstraint(\n schema: JsonSchema2020,\n constraint: Extract<ConstraintNode, { constraintKind: \"custom\" }>,\n ctx: GeneratorContext\n): void {\n const registration = ctx.extensionRegistry?.findConstraint(constraint.constraintId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom constraint \"${constraint.constraintId}\" without a matching extension registration`\n );\n }\n\n const extensionSchema = registration.toJsonSchema(constraint.payload, ctx.vendorPrefix);\n\n if (registration.emitsVocabularyKeywords) {\n // Vocabulary-mode: assign keywords directly without prefix enforcement.\n // Guard against accidental collisions with standard JSON Schema keywords.\n const target = schema as Record<string, unknown>;\n for (const [key, value] of Object.entries(extensionSchema)) {\n if (VOCABULARY_MODE_BLOCKED_KEYWORDS.has(key)) {\n throw new Error(\n `Custom constraint \"${constraint.constraintId}\" with emitsVocabularyKeywords ` +\n `must not overwrite standard JSON Schema keyword \"${key}\"`\n );\n }\n target[key] = value;\n }\n } else {\n assignVendorPrefixedExtensionKeywords(\n schema,\n extensionSchema,\n ctx.vendorPrefix,\n `custom constraint \"${constraint.constraintId}\"`\n );\n }\n}\n\nfunction applyCustomAnnotation(\n schema: JsonSchema2020,\n annotation: Extract<AnnotationNode, { annotationKind: \"custom\" }>,\n ctx: GeneratorContext\n): void {\n const registration = ctx.extensionRegistry?.findAnnotation(annotation.annotationId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom annotation \"${annotation.annotationId}\" without a matching extension registration`\n );\n }\n\n if (registration.toJsonSchema === undefined) {\n return;\n }\n\n assignVendorPrefixedExtensionKeywords(\n schema,\n registration.toJsonSchema(annotation.value, ctx.vendorPrefix),\n ctx.vendorPrefix,\n `custom annotation \"${annotation.annotationId}\"`\n );\n}\n\nfunction assignVendorPrefixedExtensionKeywords(\n schema: JsonSchema2020,\n extensionSchema: Record<string, unknown>,\n vendorPrefix: string,\n source: string\n): void {\n for (const [key, value] of Object.entries(extensionSchema)) {\n if (!key.startsWith(`${vendorPrefix}-`)) {\n throw new Error(\n `Cannot apply ${source}: extension hooks may only emit \"${vendorPrefix}-*\" JSON Schema keywords`\n );\n }\n schema[key as `x-${string}`] = value;\n }\n}\n","/**\n * JSON Forms UI Schema generator for FormSpec forms.\n *\n * Routes through the canonical IR pipeline: Chain DSL → FormIR → UI Schema.\n */\n\nimport type { FormElement, FormSpec, LoggerLike, MetadataPolicyInput } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { canonicalizeChainDSL } from \"../canonicalize/index.js\";\nimport { generateUiSchemaFromIR } from \"./ir-generator.js\";\nimport type { UISchema } from \"./types.js\";\n\n/**\n * Options for generating a UI Schema from a Chain DSL form.\n *\n * @public\n */\nexport interface GenerateUiSchemaOptions {\n /** Metadata resolution policy for chain DSL UI generation. */\n readonly metadata?: MetadataPolicyInput | undefined;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Generates a JSON Forms UI Schema from a FormSpec.\n *\n * All generation routes through the canonical IR. The chain DSL is first\n * canonicalized to a FormIR, then the IR-based generator produces the schema.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * group(\"Customer\",\n * field.text(\"name\", { label: \"Name\" }),\n * ),\n * when(\"status\", \"draft\",\n * field.text(\"notes\", { label: \"Notes\" }),\n * ),\n * );\n *\n * const uiSchema = generateUiSchema(form);\n * // {\n * // type: \"VerticalLayout\",\n * // elements: [\n * // {\n * // type: \"Group\",\n * // label: \"Customer\",\n * // elements: [\n * // { type: \"Control\", scope: \"#/properties/name\", label: \"Name\" }\n * // ]\n * // },\n * // {\n * // type: \"Control\",\n * // scope: \"#/properties/notes\",\n * // label: \"Notes\",\n * // rule: {\n * // effect: \"SHOW\",\n * // condition: { scope: \"#/properties/status\", schema: { const: \"draft\" } }\n * // }\n * // }\n * // ]\n * // }\n * ```\n *\n * @param form - The FormSpec to convert\n * @returns A JSON Forms UI Schema\n *\n * @public\n */\nexport function generateUiSchema<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: GenerateUiSchemaOptions\n): UISchema {\n const logger = (options?.logger ?? noopLogger).child({ stage: \"ir\" });\n logger.debug(\"canonicalizing chain DSL to IR for UI Schema generation\");\n const ir = canonicalizeChainDSL(\n form,\n options?.metadata !== undefined ? { metadata: options.metadata } : undefined\n );\n const schemaLogger = (options?.logger ?? noopLogger).child({ stage: \"schema\" });\n schemaLogger.debug(\"generating UI Schema from IR\");\n return generateUiSchemaFromIR(ir);\n}\n","/**\n * Zod schemas for JSON Forms UI Schema.\n *\n * These schemas are the source of truth for UI Schema validation.\n * TypeScript types are derived from these schemas via `z.infer<>`.\n *\n * @see https://jsonforms.io/docs/uischema/\n */\n\nimport { z } from \"zod\";\nimport type { UISchema } from \"./types.js\";\n\n// =============================================================================\n// Primitive helpers\n// =============================================================================\n\n/** JSON Pointer string (e.g., \"#/properties/fieldName\") */\nconst jsonPointerSchema = z.string();\n\n// =============================================================================\n// Rule Effect and Element Type enums\n// =============================================================================\n\n/**\n * Zod schema for rule effect values.\n *\n * @internal\n */\nexport const ruleEffectSchema = z.enum([\"SHOW\", \"HIDE\", \"ENABLE\", \"DISABLE\"]);\n\n/**\n * Rule effect types for conditional visibility.\n *\n * @internal\n */\nexport type RuleEffect = z.infer<typeof ruleEffectSchema>;\n\n/**\n * Zod schema for UI Schema element type strings.\n *\n * @internal\n */\nexport const uiSchemaElementTypeSchema = z.enum([\n \"Control\",\n \"VerticalLayout\",\n \"HorizontalLayout\",\n \"Group\",\n \"Categorization\",\n \"Category\",\n \"Label\",\n]);\n\n/**\n * UI Schema element types.\n *\n * @internal\n */\nexport type UISchemaElementType = z.infer<typeof uiSchemaElementTypeSchema>;\n\n// =============================================================================\n// Rule Condition Schema (recursive)\n// =============================================================================\n\n// Forward-declare the recursive TypeScript type.\n// We use an interface here (rather than z.infer<>) because the recursive\n// z.lazy() type annotation requires us to pre-declare the shape.\n/**\n * JSON Schema subset used in rule conditions.\n *\n * @internal\n */\nexport interface RuleConditionSchema {\n const?: unknown;\n enum?: readonly unknown[];\n type?: string;\n not?: RuleConditionSchema;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minLength?: number;\n properties?: Record<string, RuleConditionSchema>;\n required?: string[];\n allOf?: RuleConditionSchema[];\n}\n\n/**\n * Zod schema for the rule-condition JSON Schema subset.\n *\n * @internal\n */\nexport const ruleConditionSchema: z.ZodType<RuleConditionSchema> = z.lazy(() =>\n z\n .object({\n const: z.unknown().optional(),\n enum: z.array(z.unknown()).readonly().optional(),\n type: z.string().optional(),\n not: ruleConditionSchema.optional(),\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n exclusiveMinimum: z.number().optional(),\n exclusiveMaximum: z.number().optional(),\n minLength: z.number().optional(),\n properties: z.record(z.string(), ruleConditionSchema).optional(),\n required: z.array(z.string()).optional(),\n allOf: z.array(ruleConditionSchema).optional(),\n })\n .strict()\n) as z.ZodType<RuleConditionSchema>;\n\n// =============================================================================\n// Schema-Based Condition and Rule\n// =============================================================================\n\n/**\n * Zod schema for a schema-based rule condition.\n *\n * @internal\n */\nexport const schemaBasedConditionSchema = z\n .object({\n scope: jsonPointerSchema,\n schema: ruleConditionSchema,\n })\n .strict();\n\n/**\n * Condition for a rule.\n *\n * @internal\n */\nexport type SchemaBasedCondition = z.infer<typeof schemaBasedConditionSchema>;\n\n/**\n * Zod schema for a UI Schema rule.\n *\n * @internal\n */\nexport const ruleSchema = z\n .object({\n effect: ruleEffectSchema,\n condition: schemaBasedConditionSchema,\n })\n .strict();\n\n/**\n * Rule for conditional element visibility/enablement.\n *\n * @internal\n */\nexport type Rule = z.infer<typeof ruleSchema>;\n\n// =============================================================================\n// UI Schema Element Schemas (recursive via z.lazy)\n// =============================================================================\n\n// Forward-declare UISchemaElement so layout schemas can reference it.\n// We declare the type up-front and wire the Zod schema below.\n/**\n * Union of all UI Schema element types.\n *\n * @internal\n */\nexport type UISchemaElement =\n | ControlElement\n | VerticalLayout\n | HorizontalLayout\n | GroupLayout\n | Categorization\n | Category\n | LabelElement;\n\n// The Zod schema for UISchemaElement is defined as a const using z.lazy(),\n// which defers evaluation until first use. This allows all element schemas\n// below to be referenced even though they are declared after this line.\n/**\n * Zod schema for any UI Schema element.\n *\n * @internal\n */\nexport const uiSchemaElementSchema: z.ZodType<UISchemaElement> = z.lazy(() =>\n z.union([\n controlSchema,\n verticalLayoutSchema,\n horizontalLayoutSchema,\n groupLayoutSchema,\n categorizationSchema,\n categorySchema,\n labelElementSchema,\n ])\n) as z.ZodType<UISchemaElement>;\n\n// -----------------------------------------------------------------------------\n// Control\n// -----------------------------------------------------------------------------\n\n/**\n * Zod schema for a Control element.\n *\n * @internal\n */\nexport const controlSchema = z\n .object({\n type: z.literal(\"Control\"),\n scope: jsonPointerSchema,\n label: z.union([z.string(), z.literal(false)]).optional(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * A Control element that binds to a JSON Schema property.\n *\n * @internal\n */\nexport type ControlElement = z.infer<typeof controlSchema>;\n\n// -----------------------------------------------------------------------------\n// VerticalLayout\n// -----------------------------------------------------------------------------\n\n// Pre-declare the interface so the Zod schema can reference UISchemaElement.\n/**\n * A vertical layout element.\n *\n * @internal\n */\nexport interface VerticalLayout {\n type: \"VerticalLayout\";\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a vertical layout element.\n *\n * @internal\n */\nexport const verticalLayoutSchema: z.ZodType<VerticalLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"VerticalLayout\"),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// HorizontalLayout\n// -----------------------------------------------------------------------------\n\n/**\n * A horizontal layout element.\n *\n * @internal\n */\nexport interface HorizontalLayout {\n type: \"HorizontalLayout\";\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a horizontal layout element.\n *\n * @internal\n */\nexport const horizontalLayoutSchema: z.ZodType<HorizontalLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"HorizontalLayout\"),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// GroupLayout\n// -----------------------------------------------------------------------------\n\n/**\n * A group element with a label.\n *\n * @internal\n */\nexport interface GroupLayout {\n type: \"Group\";\n label: string;\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a group layout element.\n *\n * @internal\n */\nexport const groupLayoutSchema: z.ZodType<GroupLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Group\"),\n label: z.string(),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// Category\n// -----------------------------------------------------------------------------\n\n/**\n * A Category element, used inside a Categorization layout.\n *\n * @internal\n */\nexport interface Category {\n type: \"Category\";\n label: string;\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a category element.\n *\n * @internal\n */\nexport const categorySchema: z.ZodType<Category> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Category\"),\n label: z.string(),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// Categorization\n// -----------------------------------------------------------------------------\n\n/**\n * A Categorization element (tab-based layout).\n *\n * @internal\n */\nexport interface Categorization {\n type: \"Categorization\";\n elements: Category[];\n label?: string | undefined;\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a categorization element.\n *\n * @internal\n */\nexport const categorizationSchema: z.ZodType<Categorization> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Categorization\"),\n elements: z.array(categorySchema),\n label: z.string().optional(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// LabelElement\n// -----------------------------------------------------------------------------\n\n/**\n * Zod schema for a Label element.\n *\n * @internal\n */\nexport const labelElementSchema = z\n .object({\n type: z.literal(\"Label\"),\n text: z.string(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * A Label element for displaying static text.\n *\n * @internal\n */\nexport type LabelElement = z.infer<typeof labelElementSchema>;\n\n// =============================================================================\n// Root UISchema\n// =============================================================================\n\n/**\n * Zod schema for the root UI Schema (layout types only).\n *\n * @public\n */\nexport const uiSchema: z.ZodType<UISchema> = z.lazy(() =>\n z.union([verticalLayoutSchema, horizontalLayoutSchema, groupLayoutSchema, categorizationSchema])\n) as z.ZodType<UISchema>;\n","/**\n * JSON Forms UI Schema generator that operates on the canonical FormIR.\n *\n * This generator consumes the IR produced by the Canonicalize phase and\n * produces a JSON Forms UI Schema. All downstream UI Schema generation\n * should use this module for UI Schema generation.\n */\n\nimport type { FormIR, FormIRElement, FieldNode, GroupLayoutNode } from \"@formspec/core/internals\";\nimport { getDisplayName, getSerializedName } from \"../metadata/index.js\";\nimport { assertNoSerializedNameCollisions } from \"../metadata/collision-guards.js\";\nimport type {\n UISchema,\n UISchemaElement,\n ControlElement,\n GroupLayout,\n Rule,\n RuleConditionSchema,\n} from \"./types.js\";\nimport { uiSchema as uiSchemaValidator } from \"./schema.js\";\nimport { z } from \"zod\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Parses a value through a Zod schema, converting validation errors to a\n * descriptive Error.\n */\nfunction parseOrThrow<T>(schema: z.ZodType<T>, value: unknown, label: string): T {\n try {\n return schema.parse(value);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(\n `Generated ${label} failed validation:\\n${error.issues.map((i) => ` ${i.path.join(\".\")}: ${i.message}`).join(\"\\n\")}`\n );\n }\n throw error;\n }\n}\n\n/**\n * Converts a field name to a JSON Pointer scope string.\n */\nfunction fieldToScope(fieldName: string): string {\n return `#/properties/${fieldName}`;\n}\n\n/**\n * Creates a SHOW rule for a single conditional field/value pair.\n */\nfunction createShowRule(fieldName: string, value: unknown): Rule {\n return {\n effect: \"SHOW\",\n condition: {\n scope: fieldToScope(fieldName),\n schema: { const: value },\n },\n };\n}\n\n/**\n * Combines two SHOW rules into a single rule using an allOf condition.\n *\n * When elements are nested inside multiple conditionals, all parent conditions\n * must be met for the element to be visible. This function flattens both\n * conditions into a single rule using a top-level allOf so JSON Forms evaluates\n * every predicate simultaneously without nesting rule fragments.\n */\nfunction flattenConditionSchema(scope: string, schema: RuleConditionSchema): RuleConditionSchema[] {\n if (schema.allOf === undefined) {\n if (scope === \"#\") {\n return [schema];\n }\n\n const fieldName = scope.replace(\"#/properties/\", \"\");\n return [\n {\n properties: {\n [fieldName]: schema,\n },\n },\n ];\n }\n\n return schema.allOf.flatMap((member) => flattenConditionSchema(scope, member));\n}\n\nfunction combineRules(parentRule: Rule, childRule: Rule): Rule {\n return {\n effect: \"SHOW\",\n condition: {\n scope: \"#\",\n schema: {\n allOf: [\n ...flattenConditionSchema(parentRule.condition.scope, parentRule.condition.schema),\n ...flattenConditionSchema(childRule.condition.scope, childRule.condition.schema),\n ],\n },\n },\n };\n}\n\nfunction getFieldDisplayName(field: FieldNode): string | undefined {\n const resolvedDisplayName = getDisplayName(field.metadata);\n if (resolvedDisplayName !== undefined) {\n return resolvedDisplayName;\n }\n\n return field.annotations.find((annotation) => annotation.annotationKind === \"displayName\")?.value;\n}\n\n// =============================================================================\n// ELEMENT CONVERSION\n// =============================================================================\n\n/**\n * Converts a FieldNode from the IR to a ControlElement.\n *\n * The label prefers resolved metadata, with annotation fallback for callers\n * that still construct IR without the metadata resolver pass.\n */\nfunction fieldNodeToControl(\n field: FieldNode,\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): ControlElement {\n const placeholderAnnotation = field.annotations.find((a) => a.annotationKind === \"placeholder\");\n const serializedName =\n fieldNameMap.get(field.name) ?? getSerializedName(field.name, field.metadata);\n const displayName = getFieldDisplayName(field);\n\n const control: ControlElement = {\n type: \"Control\",\n scope: fieldToScope(serializedName),\n ...(displayName !== undefined && { label: displayName }),\n ...(placeholderAnnotation !== undefined && {\n options: { placeholder: placeholderAnnotation.value },\n }),\n ...(parentRule !== undefined && { rule: parentRule }),\n };\n\n return control;\n}\n\n/**\n * Converts a GroupLayoutNode from the IR to a GroupLayout element.\n *\n * The group's children are recursively converted; the optional parent rule is\n * forwarded to nested elements so that a group inside a conditional inherits\n * the visibility rule.\n */\nfunction groupNodeToLayout(\n group: GroupLayoutNode,\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): GroupLayout {\n return {\n type: \"Group\",\n label: group.label,\n elements: irElementsToUiSchema(group.elements, fieldNameMap, parentRule),\n ...(parentRule !== undefined && { rule: parentRule }),\n };\n}\n\n/**\n * Converts an array of IR elements to UI Schema elements.\n *\n * @param elements - The IR elements to convert\n * @param parentRule - Optional rule inherited from a parent ConditionalLayoutNode\n * @returns Array of UI Schema elements\n */\nfunction irElementsToUiSchema(\n elements: readonly FormIRElement[],\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): UISchemaElement[] {\n const result: UISchemaElement[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\": {\n result.push(fieldNodeToControl(element, fieldNameMap, parentRule));\n break;\n }\n\n case \"group\": {\n result.push(groupNodeToLayout(element, fieldNameMap, parentRule));\n break;\n }\n\n case \"conditional\": {\n // Build the rule for this conditional level.\n const newRule = createShowRule(\n fieldNameMap.get(element.fieldName) ?? element.fieldName,\n element.value\n );\n // Combine with the inherited parent rule for nested conditionals.\n const combinedRule = parentRule !== undefined ? combineRules(parentRule, newRule) : newRule;\n // Children are flattened into the parent container with the combined\n // rule attached.\n const childElements = irElementsToUiSchema(element.elements, fieldNameMap, combinedRule);\n result.push(...childElements);\n break;\n }\n\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n throw new Error(\"Unhandled IR element kind\");\n }\n }\n }\n\n return result;\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Generates a JSON Forms UI Schema from a canonical `FormIR`.\n *\n * Mapping rules:\n * - `FieldNode` → `ControlElement` with `scope: \"#/properties/<name>\"`\n * - resolved `displayName` metadata → `label` on the `ControlElement`\n * - `displayName` annotation → fallback `label` when metadata is absent\n * - `GroupLayoutNode` → `GroupLayout` with recursively converted `elements`\n * - `ConditionalLayoutNode` → children flattened with a `SHOW` rule\n * - Nested conditionals → combined `allOf` rule\n * - Root wrapper is always `{ type: \"VerticalLayout\", elements: [...] }`\n *\n * @example\n * ```typescript\n * const ir = canonicalizeDSL(\n * formspec(\n * group(\"Customer\", field.text(\"name\", { label: \"Name\" })),\n * when(is(\"status\", \"draft\"), field.text(\"notes\", { label: \"Notes\" })),\n * )\n * );\n *\n * const uiSchema = generateUiSchemaFromIR(ir);\n * // {\n * // type: \"VerticalLayout\",\n * // elements: [\n * // {\n * // type: \"Group\",\n * // label: \"Customer\",\n * // elements: [{ type: \"Control\", scope: \"#/properties/name\", label: \"Name\" }]\n * // },\n * // {\n * // type: \"Control\",\n * // scope: \"#/properties/notes\",\n * // label: \"Notes\",\n * // rule: { effect: \"SHOW\", condition: { scope: \"#/properties/status\", schema: { const: \"draft\" } } }\n * // }\n * // ]\n * // }\n * ```\n *\n * @param ir - The canonical FormIR produced by the Canonicalize phase\n * @returns A validated JSON Forms UI Schema\n */\nexport function generateUiSchemaFromIR(ir: FormIR): UISchema {\n assertNoSerializedNameCollisions(ir);\n const fieldNameMap = collectFieldNameMap(ir.elements);\n const result: UISchema = {\n type: \"VerticalLayout\",\n elements: irElementsToUiSchema(ir.elements, fieldNameMap),\n };\n\n return parseOrThrow(uiSchemaValidator, result, \"UI Schema\");\n}\n\nfunction collectFieldNameMap(elements: readonly FormIRElement[]): ReadonlyMap<string, string> {\n const map = new Map<string, string>();\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n map.set(element.name, getSerializedName(element.name, element.metadata));\n break;\n case \"group\":\n case \"conditional\":\n for (const [key, value] of collectFieldNameMap(element.elements)) {\n map.set(key, value);\n }\n break;\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n\n return map;\n}\n","/**\n * Extension registry for resolving custom types, constraints, and annotations\n * during JSON Schema generation and IR validation.\n *\n * The registry is created from a list of {@link ExtensionDefinition} objects\n * and provides O(1) lookup by fully-qualified ID (extensionId + \"/\" + name).\n *\n * @packageDocumentation\n */\n\nimport type * as ts from \"typescript\";\nimport type {\n ExtensionDefinition,\n CustomTypeRegistration,\n CustomConstraintRegistration,\n CustomAnnotationRegistration,\n ConstraintTagRegistration,\n BuiltinConstraintBroadeningRegistration,\n} from \"@formspec/core/internals\";\nimport {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n} from \"@formspec/core/internals\";\nimport {\n getTagDefinition,\n normalizeFormSpecTagName,\n getSyntheticLogger,\n _validateExtensionSetup,\n logSetupDiagnostics,\n type ExtensionTagSource,\n type SyntheticCompilerDiagnostic,\n} from \"@formspec/analysis/internal\";\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * The result of a successful extension type lookup.\n *\n * Returned by {@link ExtensionRegistry.findTypeByName},\n * {@link ExtensionRegistry.findTypeByBrand}, and\n * {@link ExtensionRegistry.findTypeBySymbol}.\n *\n * @public\n */\nexport interface ExtensionTypeLookupResult {\n /** The fully-qualified extension ID (e.g., \"x-stripe/monetary\"). */\n readonly extensionId: string;\n /** The custom type registration matched by this lookup. */\n readonly registration: CustomTypeRegistration;\n}\n\n/**\n * A registry of extensions that provides lookup by fully-qualified ID.\n *\n * Type IDs follow the format: `<extensionId>/<typeName>`\n * Constraint IDs follow the format: `<extensionId>/<constraintName>`\n * Annotation IDs follow the format: `<extensionId>/<annotationName>`\n *\n * @public\n */\nexport interface ExtensionRegistry {\n /** The extensions registered in this registry (in registration order). */\n readonly extensions: readonly ExtensionDefinition[];\n\n /**\n * Setup diagnostics detected during registry construction.\n *\n * These diagnostics represent configuration errors in the extension\n * registrations — e.g. unsupported TypeScript built-in type overrides,\n * invalid type-name identifiers, or duplicate registrations. They are\n * computed ONCE at `createExtensionRegistry` call time (§4 Phase 4 Slice C)\n * and carried on the registry so consumers can emit them without re-running\n * the validation on every analysis call.\n *\n * Consumers should check this array at the start of each analysis pass and\n * short-circuit if it is non-empty — the registry is unusable for\n * constraint-type validation when setup diagnostics are present.\n *\n * @internal\n */\n readonly setupDiagnostics: readonly SyntheticCompilerDiagnostic[];\n\n /**\n * Look up a custom type registration by its fully-qualified type ID.\n *\n * @param typeId - The fully-qualified type ID (e.g., \"x-stripe/monetary/Decimal\").\n * @returns The registration if found, otherwise `undefined`.\n */\n findType(typeId: string): CustomTypeRegistration | undefined;\n /**\n * Look up a custom type registration by a TypeScript-facing type name.\n *\n * This is used during TSDoc/class analysis to resolve extension-defined\n * custom types from source-level declarations.\n */\n findTypeByName(typeName: string): ExtensionTypeLookupResult | undefined;\n /**\n * Look up a custom type registration by a brand identifier.\n *\n * This is used during class analysis to resolve extension-defined custom types\n * via structural brand detection (`unique symbol` computed property keys).\n * Brand identifiers are stored as plain strings, so they must be unique\n * across all extensions loaded into the registry.\n *\n * @param brand - The identifier text of the `unique symbol` brand variable.\n */\n findTypeByBrand(brand: string): ExtensionTypeLookupResult | undefined;\n\n /**\n * Look up a custom type by its TypeScript symbol identity.\n *\n * Built from `defineCustomType<T>()` type parameter extraction in the config file.\n * This is the most precise detection path — it uses `ts.Symbol` identity, which is\n * immune to import aliases and name collisions.\n *\n * Returns `undefined` until {@link MutableExtensionRegistry.setSymbolMap} has been\n * called (i.e., before the TypeScript program is available), or when the symbol is\n * not registered via a type parameter.\n *\n * @param symbol - The canonical TypeScript symbol to look up.\n */\n findTypeBySymbol(symbol: ts.Symbol): ExtensionTypeLookupResult | undefined;\n\n /**\n * Look up a custom constraint registration by its fully-qualified constraint ID.\n *\n * @param constraintId - The fully-qualified constraint ID.\n * @returns The registration if found, otherwise `undefined`.\n */\n findConstraint(constraintId: string): CustomConstraintRegistration | undefined;\n /**\n * Look up a TSDoc custom constraint-tag registration by tag name.\n */\n findConstraintTag(tagName: string):\n | {\n readonly extensionId: string;\n readonly registration: ConstraintTagRegistration;\n }\n | undefined;\n /**\n * Look up built-in tag broadening for a given custom type ID.\n */\n findBuiltinConstraintBroadening(\n typeId: string,\n tagName: string\n ):\n | {\n readonly extensionId: string;\n readonly registration: BuiltinConstraintBroadeningRegistration;\n }\n | undefined;\n\n /**\n * Look up a custom annotation registration by its fully-qualified annotation ID.\n *\n * @param annotationId - The fully-qualified annotation ID.\n * @returns The registration if found, otherwise `undefined`.\n */\n findAnnotation(annotationId: string): CustomAnnotationRegistration | undefined;\n}\n\n/**\n * Mutable extension registry used internally by the build pipeline.\n *\n * Extends {@link ExtensionRegistry} with `setSymbolMap`, which must be called\n * after the TypeScript program is created. Consumer code should accept only\n * the read-only {@link ExtensionRegistry} interface.\n *\n * @public\n */\nexport interface MutableExtensionRegistry extends ExtensionRegistry {\n /**\n * Sets the symbol map built from config AST analysis.\n *\n * Called after the TypeScript program is created and the config file is analyzed.\n * Prior to this call, {@link ExtensionRegistry.findTypeBySymbol} always returns\n * `undefined`.\n *\n * @param map - A map from canonical `ts.Symbol` to the matching registry entry.\n */\n setSymbolMap(map: Map<ts.Symbol, ExtensionTypeLookupResult>): void;\n}\n\n// =============================================================================\n// IMPLEMENTATION\n// =============================================================================\n\nconst BUILTIN_METADATA_TAGS = new Set([\"apiName\", \"displayName\"]);\n\nfunction buildConstraintTagSources(\n extensions: readonly ExtensionDefinition[]\n): readonly ExtensionTagSource[] {\n return extensions.map((extension) => ({\n extensionId: extension.extensionId,\n ...(extension.constraintTags !== undefined\n ? {\n constraintTags: extension.constraintTags.map((tag) => ({\n tagName: normalizeFormSpecTagName(tag.tagName),\n })),\n }\n : {}),\n // Include customTypes so _validateExtensionSetup can check tsTypeNames for\n // unsupported built-in overrides and invalid identifier patterns.\n ...(extension.types !== undefined\n ? {\n customTypes: extension.types.map((type) => ({\n // tsTypeNames: deprecated in favour of symbol-based detection, but\n // still required for name-based validation in _validateExtensionSetup\n // until the bridge is fully retired (see §synthetic-checker-retirement §4C).\n tsTypeNames: type.tsTypeNames ?? [type.typeName],\n })),\n }\n : {}),\n }));\n}\n\n/**\n * Creates an extension registry from a list of extension definitions.\n *\n * The registry indexes all types, constraints, and annotations by their\n * fully-qualified IDs (`<extensionId>/<name>`) for O(1) lookup during\n * generation and validation.\n *\n * @param extensions - The extension definitions to register.\n * @returns An {@link ExtensionRegistry} instance.\n * @throws If duplicate type/constraint/annotation IDs are detected across extensions.\n *\n * @public\n */\nexport function createExtensionRegistry(\n extensions: readonly ExtensionDefinition[]\n): MutableExtensionRegistry {\n // §8.3c — log registry construction at debug so setup-diagnostic emission is\n // observable across repeated calls (e.g. snapshot-driven consumers per §9 #19).\n const registryLog = getSyntheticLogger();\n registryLog.debug(\"createExtensionRegistry: constructing\", {\n extensionCount: extensions.length,\n extensionIds: extensions.map((e) => e.extensionId),\n });\n\n // §4 Phase 4 Slice C — validate extension type-name registrations ONCE at\n // construction time. Consumers pull `registry.setupDiagnostics` at the start\n // of each analysis pass instead of re-running validation per synthetic batch.\n const extensionTagSources = buildConstraintTagSources(extensions);\n const setupDiagnostics = _validateExtensionSetup(extensionTagSources);\n logSetupDiagnostics(registryLog, {\n diagnosticCount: setupDiagnostics.length,\n codes: setupDiagnostics.map((d) => d.kind),\n });\n\n // extensionTagSources is already computed above for _validateExtensionSetup;\n // reuse it here to avoid a second pass over the extensions array.\n const reservedTagSources = extensionTagSources;\n let symbolMap = new Map<ts.Symbol, ExtensionTypeLookupResult>();\n const typeMap = new Map<string, CustomTypeRegistration>();\n const typeNameMap = new Map<string, ExtensionTypeLookupResult>();\n const brandMap = new Map<string, ExtensionTypeLookupResult>();\n const constraintMap = new Map<string, CustomConstraintRegistration>();\n const constraintTagMap = new Map<\n string,\n { readonly extensionId: string; readonly registration: ConstraintTagRegistration }\n >();\n const builtinBroadeningMap = new Map<\n string,\n { readonly extensionId: string; readonly registration: BuiltinConstraintBroadeningRegistration }\n >();\n const annotationMap = new Map<string, CustomAnnotationRegistration>();\n const metadataSlotMap = new Map<string, true>();\n const metadataTagMap = new Map<string, true>();\n\n for (const ext of extensions) {\n if (ext.types !== undefined) {\n for (const type of ext.types) {\n const qualifiedId = `${ext.extensionId}/${type.typeName}`;\n if (typeMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom type ID: \"${qualifiedId}\"`);\n }\n typeMap.set(qualifiedId, type);\n\n for (const sourceTypeName of type.tsTypeNames ?? [type.typeName]) {\n if (typeNameMap.has(sourceTypeName)) {\n throw new Error(`Duplicate custom type source name: \"${sourceTypeName}\"`);\n }\n typeNameMap.set(sourceTypeName, {\n extensionId: ext.extensionId,\n registration: type,\n });\n }\n\n if (type.brand !== undefined) {\n if (type.brand === \"__integerBrand\") {\n throw new Error(\n `Brand \"__integerBrand\" is reserved for the builtin Integer type and cannot be registered by extensions`\n );\n }\n if (brandMap.has(type.brand)) {\n throw new Error(`Duplicate custom type brand: \"${type.brand}\"`);\n }\n brandMap.set(type.brand, {\n extensionId: ext.extensionId,\n registration: type,\n });\n }\n\n if (type.builtinConstraintBroadenings !== undefined) {\n for (const broadening of type.builtinConstraintBroadenings) {\n const key = `${qualifiedId}:${broadening.tagName}`;\n if (builtinBroadeningMap.has(key)) {\n throw new Error(`Duplicate built-in constraint broadening: \"${key}\"`);\n }\n builtinBroadeningMap.set(key, {\n extensionId: ext.extensionId,\n registration: broadening,\n });\n }\n }\n }\n }\n\n if (ext.constraints !== undefined) {\n for (const constraint of ext.constraints) {\n const qualifiedId = `${ext.extensionId}/${constraint.constraintName}`;\n if (constraintMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom constraint ID: \"${qualifiedId}\"`);\n }\n constraintMap.set(qualifiedId, constraint);\n }\n }\n\n if (ext.constraintTags !== undefined) {\n for (const tag of ext.constraintTags) {\n const canonicalTagName = normalizeFormSpecTagName(tag.tagName);\n if (constraintTagMap.has(canonicalTagName)) {\n throw new Error(`Duplicate custom constraint tag: \"@${canonicalTagName}\"`);\n }\n constraintTagMap.set(canonicalTagName, {\n extensionId: ext.extensionId,\n registration: tag,\n });\n }\n }\n\n if (ext.annotations !== undefined) {\n for (const annotation of ext.annotations) {\n const qualifiedId = `${ext.extensionId}/${annotation.annotationName}`;\n if (annotationMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom annotation ID: \"${qualifiedId}\"`);\n }\n annotationMap.set(qualifiedId, annotation);\n }\n }\n\n if (ext.metadataSlots !== undefined) {\n for (const slot of ext.metadataSlots) {\n if (metadataSlotMap.has(slot.slotId)) {\n throw new Error(`Duplicate metadata slot ID: \"${slot.slotId}\"`);\n }\n metadataSlotMap.set(slot.slotId, true);\n\n const canonicalTagName = normalizeFormSpecTagName(slot.tagName);\n if (slot.allowBare === false && (slot.qualifiers?.length ?? 0) === 0) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" must allow bare usage or declare at least one qualifier.`\n );\n }\n if (metadataTagMap.has(canonicalTagName)) {\n throw new Error(`Duplicate metadata tag: \"@${canonicalTagName}\"`);\n }\n if (BUILTIN_METADATA_TAGS.has(canonicalTagName)) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with built-in metadata tags.`\n );\n }\n if (constraintTagMap.has(canonicalTagName)) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${canonicalTagName}\".`\n );\n }\n if (\n Object.hasOwn(\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName(canonicalTagName)\n )\n ) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${normalizeConstraintTagName(canonicalTagName)}\".`\n );\n }\n const existingTag = getTagDefinition(canonicalTagName, reservedTagSources);\n if (existingTag !== null) {\n throw BUILTIN_METADATA_TAGS.has(existingTag.canonicalName)\n ? new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with built-in metadata tags.`\n )\n : new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${existingTag.canonicalName}\".`\n );\n }\n metadataTagMap.set(canonicalTagName, true);\n }\n }\n }\n\n registryLog.debug(\"createExtensionRegistry: complete\", {\n typeCount: typeMap.size,\n constraintCount: constraintMap.size,\n constraintTagCount: constraintTagMap.size,\n broadeningCount: builtinBroadeningMap.size,\n annotationCount: annotationMap.size,\n metadataSlotCount: metadataSlotMap.size,\n setupDiagnosticCount: setupDiagnostics.length,\n });\n\n return {\n extensions,\n setupDiagnostics,\n findType: (typeId: string) => typeMap.get(typeId),\n findTypeByName: (typeName: string) => typeNameMap.get(typeName),\n findTypeByBrand: (brand: string) => brandMap.get(brand),\n findTypeBySymbol: (symbol: ts.Symbol) => symbolMap.get(symbol),\n setSymbolMap: (map) => {\n symbolMap = map;\n },\n findConstraint: (constraintId: string) => constraintMap.get(constraintId),\n findConstraintTag: (tagName: string) => constraintTagMap.get(normalizeFormSpecTagName(tagName)),\n findBuiltinConstraintBroadening: (typeId: string, tagName: string) =>\n builtinBroadeningMap.get(`${typeId}:${tagName}`),\n findAnnotation: (annotationId: string) => annotationMap.get(annotationId),\n };\n}\n","/**\n * Zod schemas for JSON Schema output validation.\n *\n * These schemas cover the subset of JSON Schema that FormSpec generates,\n * plus the FormSpec-specific `x-formspec-*` extension properties.\n *\n * @see https://json-schema.org/draft/2020-12/schema\n */\n\nimport { z } from \"zod\";\nimport type { JSONSchema7 } from \"./types.js\";\n\n// =============================================================================\n// JSON Schema type enum\n// =============================================================================\n\n/**\n * Zod schema for JSON Schema primitive type strings.\n *\n * @public\n */\nexport const jsonSchemaTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"object\",\n \"array\",\n \"null\",\n]);\n\n// =============================================================================\n// JSON Schema validator schema (recursive)\n// =============================================================================\n\n// We annotate with z.ZodType<JSONSchema7> for the recursive self-reference.\n// The @ts-expect-error is required because exactOptionalPropertyTypes:true causes\n// Zod's inferred output type for optional fields (`T | undefined`) to be\n// incompatible with the JSONSchema7 interface's exact optional fields (`T?`).\n// The runtime behavior is correct: z.optional() will strip `undefined` values\n// during parsing and correctly handle absent keys.\n//\n/**\n * Zod schema for the legacy JSON Schema 7 subset used by `@formspec/build`.\n *\n * @public\n */\n// @ts-expect-error -- exactOptionalPropertyTypes: Zod optional infers `T | undefined`\n// but JSONSchema7 uses exact optional `?:` which disallows explicit undefined.\nexport const jsonSchema7Schema: z.ZodType<JSONSchema7> = z.lazy(() =>\n z\n .object({\n $schema: z.string().optional(),\n $id: z.string().optional(),\n $ref: z.string().optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n deprecated: z.boolean().optional(),\n\n // Type\n type: z.union([jsonSchemaTypeSchema, z.array(jsonSchemaTypeSchema)]).optional(),\n\n // String validation\n minLength: z.number().optional(),\n maxLength: z.number().optional(),\n pattern: z.string().optional(),\n\n // Number validation\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n exclusiveMinimum: z.number().optional(),\n exclusiveMaximum: z.number().optional(),\n\n // Enum\n enum: z\n .array(z.union([z.string(), z.number(), z.boolean(), z.null()]))\n .readonly()\n .optional(),\n const: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n\n // Object\n properties: z.record(z.string(), jsonSchema7Schema).optional(),\n required: z.array(z.string()).optional(),\n additionalProperties: z.union([z.boolean(), jsonSchema7Schema]).optional(),\n\n // Array\n items: z.union([jsonSchema7Schema, z.array(jsonSchema7Schema)]).optional(),\n minItems: z.number().optional(),\n maxItems: z.number().optional(),\n\n // Composition\n allOf: z.array(jsonSchema7Schema).optional(),\n anyOf: z.array(jsonSchema7Schema).optional(),\n oneOf: z.array(jsonSchema7Schema).optional(),\n not: jsonSchema7Schema.optional(),\n\n // Conditional\n if: jsonSchema7Schema.optional(),\n then: jsonSchema7Schema.optional(),\n else: jsonSchema7Schema.optional(),\n\n // Format\n format: z.string().optional(),\n\n // Default\n default: z.unknown().optional(),\n\n // FormSpec extensions\n \"x-formspec-source\": z.string().optional(),\n \"x-formspec-params\": z.array(z.string()).readonly().optional(),\n \"x-formspec-schemaSource\": z.string().optional(),\n })\n // passthrough preserves arbitrary x-formspec-* extension properties\n // added by custom constraint tags without causing validation failures\n .passthrough()\n);\n","/**\n * Class schema generator.\n *\n * Generates JSON Schema 2020-12 and JSON Forms UI Schema from statically\n * analyzed class/interface/type alias declarations, routing through the\n * canonical FormIR pipeline.\n */\n\nimport * as ts from \"typescript\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\nimport type { FormSpecConfig } from \"@formspec/config\";\nimport {\n analyzeNamedTypeToIRFromProgramContextDetailed,\n createProgramContext,\n createProgramContextFromProgram,\n findClassByName,\n type AnalyzeNamedTypeToIRDetailedResult,\n type ProgramContext,\n} from \"../analyzer/program.js\";\nimport {\n analyzeClassToIR,\n type DiscriminatorResolutionOptions,\n type IRClassAnalysis,\n} from \"../analyzer/class-analyzer.js\";\nimport { canonicalizeTSDoc, type TSDocSource } from \"../canonicalize/index.js\";\nimport {\n generateJsonSchemaFromIR,\n type GenerateJsonSchemaFromIROptions,\n type JsonSchema2020,\n} from \"../json-schema/ir-generator.js\";\nimport {\n createExtensionRegistry,\n type ExtensionRegistry,\n type MutableExtensionRegistry,\n} from \"../extensions/index.js\";\nimport { buildSymbolMapFromConfig } from \"../extensions/symbol-registry.js\";\nimport { generateUiSchemaFromIR } from \"../ui-schema/ir-generator.js\";\nimport { validateIR, type ValidationDiagnostic } from \"../validate/index.js\";\n\nexport type { DiscriminatorResolutionOptions } from \"../analyzer/class-analyzer.js\";\n\n/**\n * Generated schemas for a class.\n *\n * @beta\n */\nexport interface ClassSchemas {\n /** JSON Schema 2020-12 for validation */\n jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n uiSchema: UISchema;\n}\n\n/**\n * Non-throwing schema generation result with structured diagnostics.\n *\n * @public\n */\nexport interface DetailedClassSchemasResult {\n /** Whether schema generation completed without error-severity diagnostics. */\n readonly ok: boolean;\n /** Collected analysis and validation diagnostics for this target. */\n readonly diagnostics: readonly ValidationDiagnostic[];\n /** JSON Schema 2020-12 for validation, when generation succeeds. */\n readonly jsonSchema?: JsonSchema2020 | undefined;\n /** JSON Forms UI Schema for rendering, when generation succeeds. */\n readonly uiSchema?: UISchema | undefined;\n}\n\n/**\n * A batch target for non-throwing schema generation.\n *\n * @public\n */\nexport interface SchemaGenerationTarget {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze. */\n readonly typeName: string;\n}\n\n/**\n * Batch options for non-throwing schema generation.\n *\n * @public\n */\nexport interface GenerateSchemasBatchOptions extends StaticSchemaGenerationOptions {\n /** Targets to analyze and generate. */\n readonly targets: readonly SchemaGenerationTarget[];\n}\n\n/**\n * Batch options for non-throwing schema generation using an existing program.\n *\n * @public\n */\nexport interface GenerateSchemasBatchFromProgramOptions extends StaticSchemaGenerationOptions {\n /** Existing TypeScript program supplied by the caller. */\n readonly program: ts.Program;\n /** Targets to analyze and generate. */\n readonly targets: readonly SchemaGenerationTarget[];\n}\n\n/**\n * Result for a single target in a batch generation request.\n *\n * @public\n */\nexport interface DetailedSchemaGenerationTargetResult extends DetailedClassSchemasResult {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias that was analyzed. */\n readonly typeName: string;\n}\n\n/**\n * Generates JSON Schema 2020-12 and UI Schema from an IR class analysis.\n *\n * Routes through the canonical IR pipeline:\n * IRClassAnalysis → canonicalizeTSDoc → FormIR → JSON Schema / UI Schema\n *\n * @param analysis - The IR analysis result (from analyzeClassToIR, analyzeInterfaceToIR, or analyzeTypeAliasToIR)\n * @param source - Optional source file metadata for provenance\n * @returns Generated JSON Schema and UI Schema\n */\nexport function generateClassSchemas(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: GenerateJsonSchemaFromIROptions & { metadata?: MetadataPolicyInput | undefined }\n): ClassSchemas {\n const result = generateClassSchemasDetailed(analysis, source, options);\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema 2020-12 and UI Schema from an IR class analysis\n * without throwing on validation diagnostics.\n *\n * @public\n */\nexport function generateClassSchemasDetailed(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: GenerateJsonSchemaFromIROptions & { metadata?: MetadataPolicyInput | undefined }\n): DetailedClassSchemasResult {\n const analysisDiagnostics = analysis.diagnostics ?? [];\n const errorDiagnostics = analysisDiagnostics.filter(\n (diagnostic) => diagnostic.severity === \"error\"\n );\n if (errorDiagnostics.length > 0) {\n return {\n ok: false,\n diagnostics: analysisDiagnostics,\n };\n }\n\n const ir = canonicalizeTSDoc(\n analysis,\n source,\n options?.metadata !== undefined ? { metadata: options.metadata } : undefined\n );\n const validationResult = validateIR(ir, {\n ...(options?.extensionRegistry !== undefined && {\n extensionRegistry: options.extensionRegistry,\n }),\n ...(options?.vendorPrefix !== undefined && { vendorPrefix: options.vendorPrefix }),\n });\n if (!validationResult.valid) {\n return {\n ok: false,\n diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],\n };\n }\n\n return {\n ok: true,\n diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],\n jsonSchema: generateJsonSchemaFromIR(ir, options),\n uiSchema: generateUiSchemaFromIR(ir),\n };\n}\n\nfunction formatValidationError(diagnostics: readonly ValidationDiagnostic[]): string {\n const lines = diagnostics.map((diagnostic) => {\n const primary = formatLocation(diagnostic.primaryLocation);\n const related =\n diagnostic.relatedLocations.length > 0\n ? ` [related: ${diagnostic.relatedLocations.map(formatLocation).join(\", \")}]`\n : \"\";\n return `${diagnostic.code}: ${diagnostic.message} (${primary})${related}`;\n });\n\n return `FormSpec validation failed:\\n${lines.map((line) => `- ${line}`).join(\"\\n\")}`;\n}\n\nfunction formatLocation(location: ValidationDiagnostic[\"primaryLocation\"]): string {\n return `${location.file}:${String(location.line)}:${String(location.column)}`;\n}\n\n/**\n * Shared options for schema generation flows that support custom extensions.\n *\n * @public\n */\nexport interface StaticSchemaGenerationOptions {\n /**\n * FormSpec project configuration. When provided, resolves `extensionRegistry`,\n * `vendorPrefix`, `enumSerialization`, and `metadata` from the config object.\n * Direct options take precedence over config values.\n */\n readonly config?: FormSpecConfig | undefined;\n /**\n * Registry used to resolve custom types, constraints, and annotations.\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly extensionRegistry?: ExtensionRegistry | undefined;\n /**\n * Vendor prefix for emitted extension keywords.\n * @defaultValue \"x-formspec\"\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\";\n /**\n * Metadata resolution policy for static schema generation.\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly metadata?: MetadataPolicyInput | undefined;\n /** Discriminator-specific schema generation behavior. */\n readonly discriminator?: DiscriminatorResolutionOptions | undefined;\n /**\n * Absolute path to the FormSpec config file (e.g., `formspec.config.ts`).\n *\n * When provided alongside a `config` that includes extensions, the build\n * pipeline includes the config file in the TypeScript program and extracts\n * `defineCustomType<T>()` type parameters. This enables symbol-based custom\n * type detection — the most precise resolution path, immune to import aliases\n * and name collisions.\n *\n * Obtain this from `loadFormSpecConfig()`:\n * ```typescript\n * const { config, configPath } = await loadFormSpecConfig();\n * await generateSchemas({ filePath, typeName, config, configPath, errorReporting: \"throw\" });\n * ```\n */\n readonly configPath?: string | undefined;\n}\n\n/**\n * Options for generating schemas from a decorated class.\n *\n * @public\n */\nexport interface GenerateFromClassOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file */\n filePath: string;\n /** Class name to analyze */\n className: string;\n}\n\n/**\n * Result of generating schemas from a decorated class.\n *\n * @public\n */\nexport interface GenerateFromClassResult {\n /** JSON Schema 2020-12 for validation */\n jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n uiSchema: UISchema;\n}\n\n/**\n * Options for generating schemas from a named type inside an existing TypeScript program.\n *\n * @public\n */\nexport interface GenerateSchemasFromProgramOptions extends StaticSchemaGenerationOptions {\n /** Existing TypeScript program supplied by the caller. */\n readonly program: ts.Program;\n /** Path to the TypeScript source file */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze */\n readonly typeName: string;\n /**\n * Controls whether error-severity diagnostics throw or are returned in the result.\n */\n readonly errorReporting: \"throw\" | \"diagnostics\";\n}\n\n/**\n * Generates JSON Schema and UI Schema from a decorated TypeScript class.\n *\n * This is a high-level entry point that handles the entire pipeline:\n * creating a TypeScript program, finding the class, analyzing it to IR,\n * and generating schemas — all in one call.\n *\n * @example\n * ```typescript\n * const result = generateSchemasFromClass({\n * filePath: \"./src/forms.ts\",\n * className: \"UserForm\",\n * });\n * console.log(result.jsonSchema);\n * ```\n *\n * @param options - File path, class name, and optional compiler options\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemasFromClass(\n options: GenerateFromClassOptions\n): GenerateFromClassResult {\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n const ctx = createProgramContext(options.filePath, additionalFiles);\n const classDecl = findClassByName(ctx.sourceFile, options.className);\n\n if (!classDecl) {\n throw new Error(`Class \"${options.className}\" not found in ${options.filePath}`);\n }\n\n const analysis = analyzeClassToIR(\n classDecl,\n ctx.checker,\n options.filePath,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n options.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n options.metadata,\n options.discriminator\n );\n return generateClassSchemas(\n analysis,\n { file: options.filePath },\n {\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n extensionRegistry: options.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix,\n }\n );\n}\n\n/**\n * Options for generating schemas from a named type (class, interface, or type alias).\n *\n * @public\n */\nexport interface GenerateSchemasOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze */\n readonly typeName: string;\n /**\n * Controls whether error-severity diagnostics throw or are returned in the result.\n */\n readonly errorReporting: \"throw\" | \"diagnostics\";\n}\n\ntype GenerateSchemasImplementationOptions = StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n readonly errorReporting?: \"throw\" | \"diagnostics\" | undefined;\n};\n\ntype GenerateSchemasFromProgramImplementationOptions = StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n readonly errorReporting?: \"throw\" | \"diagnostics\" | undefined;\n};\n\n/**\n * Generates JSON Schema and UI Schema from a named TypeScript\n * type — a decorated class, an interface with TSDoc tags, or a type alias.\n *\n * This is the recommended entry point. It automatically detects whether\n * the name resolves to a class, interface, or type alias and uses the\n * appropriate IR analysis pipeline.\n *\n * @example\n * ```typescript\n * const result = generateSchemas({\n * filePath: \"./src/config.ts\",\n * typeName: \"DiscountConfig\",\n * errorReporting: \"throw\",\n * });\n * ```\n */\n/**\n * Generates JSON Schema and UI Schema from a named type and throws when\n * generation reports error-severity diagnostics.\n *\n * @param options - File path, type name, and explicit throw-on-error reporting\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemas(\n options: GenerateSchemasOptions & { readonly errorReporting: \"throw\" }\n): GenerateFromClassResult;\n/**\n * Generates JSON Schema and UI Schema from a named type and returns structured\n * diagnostics instead of throwing on validation or analysis failures.\n *\n * @param options - File path, type name, and explicit diagnostics reporting\n * @returns Structured generation result with diagnostics\n *\n * @public\n */\nexport function generateSchemas(\n options: GenerateSchemasOptions & { readonly errorReporting: \"diagnostics\" }\n): DetailedClassSchemasResult;\n/**\n * Generates JSON Schema and UI Schema from a named type.\n *\n * @deprecated Pass `errorReporting` explicitly. Omitting it defaults to `\"throw\"` only for backward compatibility.\n * @param options - File path and type name\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\n/* eslint-disable @typescript-eslint/unified-signatures */\nexport function generateSchemas(\n options: StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n }\n): GenerateFromClassResult;\n/* eslint-enable @typescript-eslint/unified-signatures */\nexport function generateSchemas(\n options: GenerateSchemasImplementationOptions\n): GenerateFromClassResult | DetailedClassSchemasResult {\n const result = generateSchemasDetailedInternal(options);\n if (options.errorReporting === \"diagnostics\") {\n return result;\n }\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program supplied by the caller.\n *\n * This low-level entry point lets downstream tooling reuse a host-owned\n * `Program` for both FormSpec extraction and other TypeScript analysis.\n */\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and throws when generation reports error-severity diagnostics.\n *\n * @param options - Host program, file path, type name, and explicit throw-on-error reporting\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramOptions & { readonly errorReporting: \"throw\" }\n): GenerateFromClassResult;\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and returns structured diagnostics instead of throwing on\n * validation or analysis failures.\n *\n * @param options - Host program, file path, type name, and explicit diagnostics reporting\n * @returns Structured generation result with diagnostics\n *\n * @public\n */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramOptions & { readonly errorReporting: \"diagnostics\" }\n): DetailedClassSchemasResult;\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program.\n *\n * @deprecated Pass `errorReporting` explicitly. Omitting it defaults to `\"throw\"` only for backward compatibility.\n * @param options - Host program, file path, and type name\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\n/* eslint-disable @typescript-eslint/unified-signatures */\nexport function generateSchemasFromProgram(\n options: StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n }\n): GenerateFromClassResult;\n/* eslint-enable @typescript-eslint/unified-signatures */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramImplementationOptions\n): GenerateFromClassResult | DetailedClassSchemasResult {\n const result = generateSchemasFromProgramDetailedInternal(options);\n if (options.errorReporting === \"diagnostics\") {\n return result;\n }\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type and returns structured\n * diagnostics instead of throwing on validation or analysis failures.\n * @deprecated Use `generateSchemas({ ...options, errorReporting: \"diagnostics\" })` instead.\n *\n * @public\n */\nexport function generateSchemasDetailed(\n options: StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n }\n): DetailedClassSchemasResult {\n return generateSchemas({\n ...options,\n errorReporting: \"diagnostics\",\n });\n}\n\nfunction generateSchemasDetailedInternal(\n options: GenerateSchemasImplementationOptions\n): DetailedClassSchemasResult {\n let ctx: ProgramContext;\n try {\n // Include the config file in the program when provided so that the config\n // AST is available for symbol-based type-parameter extraction.\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n ctx = createProgramContext(options.filePath, additionalFiles);\n } catch (error) {\n return {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)],\n };\n }\n\n return generateSchemasFromDetailedProgramContext(\n ctx,\n options.filePath,\n options.typeName,\n options\n );\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and returns structured diagnostics instead of throwing on\n * validation or analysis failures.\n * @deprecated Use `generateSchemasFromProgram({ ...options, errorReporting: \"diagnostics\" })` instead.\n *\n * @public\n */\nexport function generateSchemasFromProgramDetailed(\n options: StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n }\n): DetailedClassSchemasResult {\n return generateSchemasFromProgram({\n ...options,\n errorReporting: \"diagnostics\",\n });\n}\n\nfunction generateSchemasFromProgramDetailedInternal(\n options: GenerateSchemasFromProgramImplementationOptions\n): DetailedClassSchemasResult {\n let ctx: ProgramContext;\n try {\n ctx = createProgramContextFromProgram(options.program, options.filePath);\n } catch (error) {\n return {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)],\n };\n }\n\n return generateSchemasFromDetailedProgramContext(\n ctx,\n options.filePath,\n options.typeName,\n options\n );\n}\n\n/**\n * Generates schemas for many targets and returns per-target diagnostics instead\n * of failing on the first problem.\n *\n * @public\n */\nexport function generateSchemasBatch(\n options: GenerateSchemasBatchOptions\n): readonly DetailedSchemaGenerationTargetResult[] {\n const contextCache = new Map<string, ProgramContext>();\n\n // Resolve options once. The symbol map is rebuilt whenever a new ts.Program is\n // encountered — ts.Symbol identity is program-specific, so a map built from one\n // program must not be used to look up symbols from a different program.\n const resolved = resolveOptions(options);\n let symbolMapProgram: ts.Program | undefined;\n\n return options.targets.map((target) => {\n let ctx: ProgramContext;\n try {\n const cacheKey = ts.sys.useCaseSensitiveFileNames\n ? target.filePath\n : target.filePath.toLowerCase();\n const cachedContext = contextCache.get(cacheKey);\n if (cachedContext === undefined) {\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n ctx = createProgramContext(target.filePath, additionalFiles);\n contextCache.set(cacheKey, ctx);\n } else {\n ctx = cachedContext;\n }\n } catch (error) {\n return withTarget(target, {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)],\n });\n }\n\n // Rebuild the symbol map whenever the program changes. ts.Symbol identity is\n // program-specific — a map seeded from one program cannot match symbols from\n // a different program, so we must re-walk the config AST for each new program.\n if (\n options.configPath !== undefined &&\n resolved.extensionRegistry !== undefined &&\n isMutableRegistry(resolved.extensionRegistry) &&\n ctx.program !== symbolMapProgram\n ) {\n const symbolMap = buildSymbolMapFromConfig(\n options.configPath,\n ctx.program,\n ctx.checker,\n resolved.extensionRegistry\n );\n resolved.extensionRegistry.setSymbolMap(symbolMap);\n symbolMapProgram = ctx.program;\n }\n\n return withTarget(\n target,\n generateSchemasFromResolvedOptions(\n ctx,\n target.filePath,\n target.typeName,\n resolved,\n options.discriminator\n )\n );\n });\n}\n\n/**\n * Generates schemas for many targets from an existing TypeScript program and\n * returns per-target diagnostics instead of failing on the first problem.\n *\n * @public\n */\nexport function generateSchemasBatchFromProgram(\n options: GenerateSchemasBatchFromProgramOptions\n): readonly DetailedSchemaGenerationTargetResult[] {\n return options.targets.map((target) => {\n let ctx: ProgramContext;\n try {\n ctx = createProgramContextFromProgram(options.program, target.filePath);\n } catch (error) {\n return withTarget(target, {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)],\n });\n }\n\n return withTarget(\n target,\n generateSchemasFromDetailedProgramContext(ctx, target.filePath, target.typeName, options)\n );\n });\n}\n\nfunction isMutableRegistry(reg: ExtensionRegistry): reg is MutableExtensionRegistry {\n return (\n \"setSymbolMap\" in reg && typeof (reg as MutableExtensionRegistry).setSymbolMap === \"function\"\n );\n}\n\n/**\n * Resolves the effective extension registry, vendor prefix, enum serialization,\n * and metadata from a `StaticSchemaGenerationOptions` object.\n *\n * Prefers explicit deprecated fields when present, falling back to the\n * `config` object. This is the migration bridge — once all callers use\n * `config`, the deprecated field reads can be removed.\n *\n * @internal\n */\nexport function resolveStaticOptions(options: StaticSchemaGenerationOptions): {\n extensionRegistry: ExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n} {\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const legacyRegistry = options.extensionRegistry;\n\n // Only construct the config registry if the deprecated field is absent and\n // extensions were actually configured. Treating an empty array as \"no\n // registry\" avoids building an empty registry (and emitting its debug log)\n // when callers pass a defaults-filled `ResolvedFormSpecConfig` that sets\n // `extensions: []` on behalf of users who never configured any.\n const configRegistry =\n legacyRegistry === undefined &&\n options.config?.extensions !== undefined &&\n options.config.extensions.length > 0\n ? createExtensionRegistry(options.config.extensions)\n : undefined;\n\n return {\n extensionRegistry: legacyRegistry ?? configRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix ?? options.config?.vendorPrefix,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization ?? options.config?.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata ?? options.config?.metadata,\n };\n}\n\nfunction resolveOptions(options: StaticSchemaGenerationOptions): {\n extensionRegistry: MutableExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n} {\n // Treat `extensions: []` as \"no registry\" — see `resolveStaticOptions`\n // above for the motivation (avoids building an empty registry when the\n // caller passes a defaults-filled `ResolvedFormSpecConfig`).\n const configRegistry =\n options.config?.extensions !== undefined && options.config.extensions.length > 0\n ? createExtensionRegistry(options.config.extensions)\n : undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const legacyRegistry = options.extensionRegistry;\n\n return {\n // When the caller provides the deprecated extensionRegistry field directly,\n // it is typed as the read-only ExtensionRegistry interface. We cast here\n // because the legacy path was introduced before MutableExtensionRegistry was\n // split out; callers using createExtensionRegistry() always get a mutable\n // registry, and this cast is safe for all registries produced by this module.\n extensionRegistry: (legacyRegistry as MutableExtensionRegistry | undefined) ?? configRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix ?? options.config?.vendorPrefix,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization ?? options.config?.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata ?? options.config?.metadata,\n };\n}\n\nfunction generateSchemasFromDetailedProgramContext(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n options: StaticSchemaGenerationOptions\n): DetailedClassSchemasResult {\n const resolved = resolveOptions(options);\n\n // If a configPath and extension registry are both available, build the\n // symbol map from the config AST and register it on the registry. This\n // enables the symbol-based detection path in the type resolver.\n if (\n options.configPath !== undefined &&\n resolved.extensionRegistry !== undefined &&\n isMutableRegistry(resolved.extensionRegistry)\n ) {\n const symbolMap = buildSymbolMapFromConfig(\n options.configPath,\n ctx.program,\n ctx.checker,\n resolved.extensionRegistry\n );\n resolved.extensionRegistry.setSymbolMap(symbolMap);\n }\n\n return generateSchemasFromResolvedOptions(\n ctx,\n filePath,\n typeName,\n resolved,\n options.discriminator\n );\n}\n\n/**\n * Inner implementation: generates schemas from a ProgramContext and pre-resolved options.\n *\n * Separated so that batch callers can resolve options and seed the symbol map once\n * outside the per-target loop, then call this directly without repeating that work.\n */\nfunction generateSchemasFromResolvedOptions(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n resolved: {\n extensionRegistry: MutableExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n },\n discriminator: DiscriminatorResolutionOptions | undefined\n): DetailedClassSchemasResult {\n const analysisResult: AnalyzeNamedTypeToIRDetailedResult =\n analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx,\n filePath,\n typeName,\n resolved.extensionRegistry,\n resolved.metadata,\n discriminator\n );\n if (!analysisResult.ok) {\n return {\n ok: false,\n diagnostics: analysisResult.diagnostics,\n };\n }\n\n return generateClassSchemasDetailed(\n analysisResult.analysis,\n { file: filePath },\n {\n extensionRegistry: resolved.extensionRegistry,\n metadata: resolved.metadata,\n enumSerialization: resolved.enumSerialization,\n vendorPrefix: resolved.vendorPrefix,\n }\n );\n}\n\nfunction withTarget(\n target: SchemaGenerationTarget,\n result: DetailedClassSchemasResult\n): DetailedSchemaGenerationTargetResult {\n return {\n filePath: target.filePath,\n typeName: target.typeName,\n ...result,\n };\n}\n\nfunction createProgramContextFailureDiagnostic(\n filePath: string,\n error: unknown\n): ValidationDiagnostic {\n return {\n code: \"PROGRAM_CONTEXT_FAILURE\",\n message: error instanceof Error ? error.message : String(error),\n severity: \"error\",\n primaryLocation: {\n surface: \"tsdoc\",\n file: filePath,\n line: 1,\n column: 0,\n },\n relatedLocations: [],\n };\n}\n","/**\n * TypeScript program setup for static analysis.\n *\n * Creates a TypeScript program with type checker from a source file,\n * using the project's tsconfig.json for compiler options.\n */\n\nimport * as ts from \"typescript\";\nimport * as path from \"node:path\";\nimport type { FieldNode, Provenance, TypeDefinition, TypeNode } from \"@formspec/core/internals\";\nimport type { ConstraintSemanticDiagnostic } from \"@formspec/analysis/internal\";\nimport {\n analyzeDeclarationRootInfo,\n analyzeClassToIR,\n createAnalyzerMetadataPolicy,\n getAnalyzableObjectLikePropertyName,\n analyzeInterfaceToIR,\n isResolvableObjectLikeAliasTypeNode,\n analyzeTypeAliasToIR,\n type DeclarationRootInfo,\n type DiscriminatorResolutionOptions,\n type IRClassAnalysis,\n resolveTypeNode,\n} from \"./class-analyzer.js\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\n\n/**\n * Result of creating a TypeScript program for analysis.\n */\nexport interface ProgramContext {\n /** The TypeScript program */\n program: ts.Program;\n /** Type checker for resolving types */\n checker: ts.TypeChecker;\n /** The source file being analyzed */\n sourceFile: ts.SourceFile;\n}\n\nexport type AnalyzeNamedTypeToIRDetailedResult =\n | { readonly ok: true; readonly analysis: IRClassAnalysis }\n | {\n readonly ok: false;\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n };\n\n/**\n * Resolves a source file and checker from an existing TypeScript program.\n *\n * @param program - Existing TypeScript program supplied by the host\n * @param filePath - Absolute or relative path to the TypeScript source file\n * @returns Program context with checker and source file\n */\nexport function createProgramContextFromProgram(\n program: ts.Program,\n filePath: string\n): ProgramContext {\n const absolutePath = path.resolve(filePath);\n const sourceFile = program.getSourceFile(absolutePath) ?? program.getSourceFile(filePath);\n\n if (!sourceFile) {\n throw new Error(`Could not find source file in provided program: ${absolutePath}`);\n }\n\n return {\n program,\n checker: program.getTypeChecker(),\n sourceFile,\n };\n}\n\n/**\n * Creates a TypeScript program for analyzing a source file.\n *\n * Looks for tsconfig.json in the file's directory or parent directories.\n * Falls back to default compiler options if no config is found.\n *\n * @param filePath - Absolute path to the TypeScript source file\n * @param additionalFiles - Optional additional files to include in the program\n * (e.g., the FormSpec config file for symbol-based custom type detection).\n * Duplicates are silently removed.\n * @returns Program context with checker and source file\n */\nexport function createProgramContext(\n filePath: string,\n additionalFiles?: readonly string[]\n): ProgramContext {\n const absolutePath = path.resolve(filePath);\n const fileDir = path.dirname(absolutePath);\n\n // Find tsconfig.json - using ts.sys.fileExists which has `this: void` requirement\n const configPath = ts.findConfigFile(fileDir, ts.sys.fileExists.bind(ts.sys), \"tsconfig.json\");\n\n let compilerOptions: ts.CompilerOptions;\n let fileNames: string[];\n\n if (configPath) {\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile.bind(ts.sys));\n if (configFile.error) {\n throw new Error(\n `Error reading tsconfig.json: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, \"\\n\")}`\n );\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPath)\n );\n\n if (parsed.errors.length > 0) {\n const errorMessages = parsed.errors\n .map((e) => ts.flattenDiagnosticMessageText(e.messageText, \"\\n\"))\n .join(\"\\n\");\n throw new Error(`Error parsing tsconfig.json: ${errorMessages}`);\n }\n\n compilerOptions = parsed.options;\n // Include the target file and any additional files in the program.\n // Use Set to eliminate duplicates.\n const normalizedAdditional = (additionalFiles ?? []).map((f) => path.resolve(f));\n fileNames = [...new Set([...parsed.fileNames, absolutePath, ...normalizedAdditional])];\n } else {\n // Fallback to default options\n compilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n declaration: true,\n };\n const normalizedAdditional = (additionalFiles ?? []).map((f) => path.resolve(f));\n fileNames = [...new Set([absolutePath, ...normalizedAdditional])];\n }\n\n const program = ts.createProgram(fileNames, compilerOptions);\n const sourceFile = program.getSourceFile(absolutePath);\n\n if (!sourceFile) {\n throw new Error(`Could not find source file: ${absolutePath}`);\n }\n\n return {\n program,\n checker: program.getTypeChecker(),\n sourceFile,\n };\n}\n\n/**\n * Generic AST node finder by name. Walks the source file tree and returns\n * the first node matching the predicate with the given name.\n */\nfunction findNodeByName<T extends ts.Node>(\n sourceFile: ts.SourceFile,\n name: string,\n predicate: (node: ts.Node) => node is T,\n getName: (node: T) => string | undefined\n): T | null {\n let result: T | null = null;\n\n function visit(node: ts.Node): void {\n if (result) return;\n\n if (predicate(node) && getName(node) === name) {\n result = node;\n return;\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return result;\n}\n\n/**\n * Finds a class declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param className - Name of the class to find\n * @returns The class declaration node, or null if not found\n */\nexport function findClassByName(\n sourceFile: ts.SourceFile,\n className: string\n): ts.ClassDeclaration | null {\n return findNodeByName(sourceFile, className, ts.isClassDeclaration, (n) => n.name?.text);\n}\n\n/**\n * Finds an interface declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param interfaceName - Name of the interface to find\n * @returns The interface declaration node, or null if not found\n */\nexport function findInterfaceByName(\n sourceFile: ts.SourceFile,\n interfaceName: string\n): ts.InterfaceDeclaration | null {\n return findNodeByName(sourceFile, interfaceName, ts.isInterfaceDeclaration, (n) => n.name.text);\n}\n\n/**\n * Finds a type alias declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param aliasName - Name of the type alias to find\n * @returns The type alias declaration node, or null if not found\n */\nexport function findTypeAliasByName(\n sourceFile: ts.SourceFile,\n aliasName: string\n): ts.TypeAliasDeclaration | null {\n return findNodeByName(sourceFile, aliasName, ts.isTypeAliasDeclaration, (n) => n.name.text);\n}\n\nfunction getResolvedObjectRootType(\n rootType: TypeNode,\n typeRegistry: Record<string, TypeDefinition>\n): Extract<TypeNode, { kind: \"object\" }> | null {\n if (rootType.kind === \"object\") {\n return rootType;\n }\n\n if (rootType.kind !== \"reference\") {\n return null;\n }\n\n const definition = typeRegistry[rootType.name];\n return definition?.type.kind === \"object\" ? definition.type : null;\n}\n\nfunction createResolvedObjectAliasAnalysis(\n name: string,\n rootType: TypeNode,\n typeRegistry: Record<string, TypeDefinition>,\n rootInfo: DeclarationRootInfo,\n diagnostics: readonly ConstraintSemanticDiagnostic[]\n): IRClassAnalysis | null {\n const resolvedRootType = getResolvedObjectRootType(rootType, typeRegistry);\n if (resolvedRootType === null) {\n return null;\n }\n\n const fields: FieldNode[] = resolvedRootType.properties.map((property) => ({\n kind: \"field\",\n name: property.name,\n ...(property.metadata !== undefined && { metadata: property.metadata }),\n type: property.type,\n required: !property.optional,\n constraints: property.constraints,\n annotations: property.annotations,\n provenance: property.provenance,\n }));\n\n return {\n name,\n ...(rootInfo.metadata !== undefined && { metadata: rootInfo.metadata }),\n fields,\n fieldLayouts: fields.map(() => ({})),\n typeRegistry,\n ...(rootInfo.annotations.length > 0 && { annotations: [...rootInfo.annotations] }),\n ...(diagnostics.length > 0 && { diagnostics: [...diagnostics] }),\n instanceMethods: [],\n staticMethods: [],\n };\n}\n\nfunction containsTypeReferenceInObjectLikeAlias(typeNode: ts.TypeNode): boolean {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return containsTypeReferenceInObjectLikeAlias(typeNode.type);\n }\n\n if (ts.isTypeReferenceNode(typeNode)) {\n return true;\n }\n\n return (\n ts.isIntersectionTypeNode(typeNode) &&\n typeNode.types.some((member) => containsTypeReferenceInObjectLikeAlias(member))\n );\n}\n\nfunction collectFallbackAliasMemberPropertyNames(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): readonly string[] | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return collectFallbackAliasMemberPropertyNames(typeNode.type, checker);\n }\n\n if (ts.isTypeLiteralNode(typeNode)) {\n const propertyNames: string[] = [];\n for (const member of typeNode.members) {\n if (!ts.isPropertySignature(member)) {\n continue;\n }\n\n const propertyName = getAnalyzableObjectLikePropertyName(member.name);\n if (propertyName !== null) {\n propertyNames.push(propertyName);\n }\n }\n\n return propertyNames;\n }\n\n if (ts.isTypeReferenceNode(typeNode)) {\n return checker\n .getTypeFromTypeNode(typeNode)\n .getProperties()\n .map((property) => property.getName());\n }\n\n return null;\n}\n\nfunction findFallbackAliasDuplicatePropertyNames(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): readonly string[] {\n if (!ts.isIntersectionTypeNode(typeNode)) {\n return [];\n }\n\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const member of typeNode.types) {\n const propertyNames = collectFallbackAliasMemberPropertyNames(member, checker);\n if (propertyNames === null) {\n continue;\n }\n\n for (const propertyName of propertyNames) {\n if (seen.has(propertyName)) {\n duplicates.add(propertyName);\n } else {\n seen.add(propertyName);\n }\n }\n }\n\n return [...duplicates].sort();\n}\n\n/**\n * Analyzes a named type (class, interface, or type alias) from a TypeScript\n * source file and returns an `IRClassAnalysis`.\n *\n * Tries each declaration kind in order: class → interface → type alias.\n * Throws if the name is not found or if the type alias analysis fails.\n *\n * @param filePath - Absolute or relative path to the TypeScript source file (resolved internally)\n * @param typeName - Name of the class, interface, or type alias to analyze\n * @param extensionRegistry - Optional extension registry for custom type handling\n * @returns IR analysis result\n */\nexport function analyzeNamedTypeToIR(\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const ctx = createProgramContext(filePath);\n return analyzeNamedTypeToIRFromProgramContext(\n ctx,\n filePath,\n typeName,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n}\n\n/**\n * Analyzes a named type from an existing program context and returns either an\n * `IRClassAnalysis` or structured diagnostics instead of throwing.\n */\nexport function analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): AnalyzeNamedTypeToIRDetailedResult {\n const analysisFilePath = path.resolve(filePath);\n\n const classDecl = findClassByName(ctx.sourceFile, typeName);\n if (classDecl !== null) {\n return {\n ok: true,\n analysis: analyzeClassToIR(\n classDecl,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n ),\n };\n }\n\n const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);\n if (interfaceDecl !== null) {\n return {\n ok: true,\n analysis: analyzeInterfaceToIR(\n interfaceDecl,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n ),\n };\n }\n\n const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);\n if (typeAlias !== null) {\n const result = analyzeTypeAliasToIR(\n typeAlias,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n if (result.ok) {\n return { ok: true, analysis: result.analysis };\n }\n\n const fallbackEligible =\n result.kind === \"not-object-like\" &&\n isResolvableObjectLikeAliasTypeNode(typeAlias.type) &&\n containsTypeReferenceInObjectLikeAlias(typeAlias.type);\n if (!fallbackEligible) {\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n result.kind === \"duplicate-properties\"\n ? \"DUPLICATE_ROOT_PROPERTIES\"\n : \"UNSUPPORTED_ROOT_TYPE\",\n result.error,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(\n typeAlias.type,\n ctx.checker\n );\n if (duplicatePropertyNames.length > 0) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"DUPLICATE_ROOT_PROPERTIES\",\n `Type alias \"${typeAlias.name.text}\" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(\", \")}`,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n const rootInfo = analyzeDeclarationRootInfo(\n typeAlias,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy\n );\n const diagnostics: ConstraintSemanticDiagnostic[] = [...rootInfo.diagnostics];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const rootType = resolveTypeNode(\n ctx.checker.getTypeAtLocation(typeAlias),\n ctx.checker,\n analysisFilePath,\n typeRegistry,\n new Set<ts.Type>(),\n typeAlias,\n createAnalyzerMetadataPolicy(metadataPolicy, discriminatorOptions),\n extensionRegistry,\n diagnostics\n );\n const fallbackAnalysis = createResolvedObjectAliasAnalysis(\n typeAlias.name.text,\n rootType,\n typeRegistry,\n rootInfo,\n diagnostics\n );\n if (fallbackAnalysis !== null) {\n return { ok: true, analysis: fallbackAnalysis };\n }\n\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"UNSUPPORTED_ROOT_TYPE\",\n result.error,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"TYPE_NOT_FOUND\",\n `Type \"${typeName}\" not found as a class, interface, or type alias in ${analysisFilePath}`,\n makeFileProvenance(analysisFilePath)\n ),\n ],\n };\n}\n\n/**\n * Analyzes a named type from an existing program context and returns an `IRClassAnalysis`.\n */\nexport function analyzeNamedTypeToIRFromProgramContext(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const result = analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx,\n filePath,\n typeName,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n if (result.ok) {\n return result.analysis;\n }\n\n throw new Error(result.diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n}\n\nfunction makeProgramDiagnostic(\n code: string,\n message: string,\n primaryLocation: Provenance\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation,\n relatedLocations: [],\n };\n}\n\nfunction makeNodeProvenance(node: ts.Node, filePath: string): Provenance {\n const sourceFile = node.getSourceFile();\n const position = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return {\n surface: \"tsdoc\",\n file: filePath,\n line: position.line + 1,\n column: position.character,\n length: node.getWidth(),\n };\n}\n\nfunction makeFileProvenance(filePath: string): Provenance {\n return {\n surface: \"tsdoc\",\n file: filePath,\n line: 1,\n column: 0,\n };\n}\n","/**\n * Class analyzer for extracting fields, types, and JSDoc constraints.\n *\n * Produces `IRClassAnalysis` containing `FieldNode[]` and `typeRegistry`\n * directly from class, interface, or type alias declarations.\n * All downstream generation routes through the canonical FormIR.\n */\n\nimport * as ts from \"typescript\";\nimport {\n analyzeMetadataForNodeWithChecker,\n parseCommentBlock,\n type ConstraintSemanticDiagnostic,\n type ParsedCommentTag,\n} from \"@formspec/analysis/internal\";\nimport type {\n FieldNode,\n TypeNode,\n EnumTypeNode,\n EnumMember,\n ConstraintNode,\n AnnotationNode,\n Provenance,\n ObjectProperty,\n RecordTypeNode,\n TypeDefinition,\n JsonValue,\n ResolvedMetadata,\n ResolvedScalarMetadata,\n} from \"@formspec/core/internals\";\nimport {\n extractJSDocConstraintNodes,\n extractJSDocAnnotationNodes,\n extractDefaultValueAnnotation,\n extractJSDocParseResult,\n} from \"./jsdoc-constraints.js\";\nimport { extractDisplayNameMetadata } from \"./tsdoc-parser.js\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport {\n customTypeIdFromLookup,\n resolveCustomTypeFromTsType,\n} from \"../extensions/resolve-custom-type.js\";\nimport {\n extractTypeNodeFromSource,\n getTypeAliasDeclarationFromTypeReference,\n} from \"../extensions/ts-type-utils.js\";\nimport { _isIntegerBrandedType } from \"./builtin-brands.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\nimport { getDeclarationMetadataPolicy, normalizeMetadataPolicy } from \"../metadata/index.js\";\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard for ts.ObjectType — checks that the TypeFlags.Object bit is set.\n */\nfunction isObjectType(type: ts.Type): type is ts.ObjectType {\n return !!(type.flags & ts.TypeFlags.Object);\n}\n\nfunction isIntersectionType(type: ts.Type): type is ts.IntersectionType {\n return !!(type.flags & ts.TypeFlags.Intersection);\n}\n\nexport function isResolvableObjectLikeAliasTypeNode(typeNode: ts.TypeNode): boolean {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return isResolvableObjectLikeAliasTypeNode(typeNode.type);\n }\n\n if (ts.isTypeLiteralNode(typeNode) || ts.isTypeReferenceNode(typeNode)) {\n return true;\n }\n\n return (\n ts.isIntersectionTypeNode(typeNode) &&\n typeNode.types.length > 0 &&\n typeNode.types.every((member) => isResolvableObjectLikeAliasTypeNode(member))\n );\n}\n\nfunction isSemanticallyPlainObjectLikeType(type: ts.Type, checker: ts.TypeChecker): boolean {\n if (isIntersectionType(type)) {\n return (\n type.types.length > 0 &&\n type.types.every((member) => isSemanticallyPlainObjectLikeType(member, checker))\n );\n }\n\n return (\n isObjectType(type) &&\n checker.getSignaturesOfType(type, ts.SignatureKind.Call).length === 0 &&\n checker.getSignaturesOfType(type, ts.SignatureKind.Construct).length === 0 &&\n !checker.isArrayType(type) &&\n !checker.isTupleType(type)\n );\n}\n\n/**\n * Type guard for ts.TypeReference — checks ObjectFlags.Reference on top of ObjectType.\n * The internal `as` cast is isolated inside this guard and is required because\n * TypeScript's public API does not expose objectFlags on ts.Type directly.\n */\nfunction isTypeReference(type: ts.Type): type is ts.TypeReference {\n // as cast is isolated inside type guard\n return (\n !!(type.flags & ts.TypeFlags.Object) &&\n !!((type as ts.ObjectType).objectFlags & ts.ObjectFlags.Reference)\n );\n}\n\n/**\n * Placeholder used while a named object type is still being expanded.\n *\n * The object identity matters: final empty-object schemas are distinct\n * instances, so we can tell an in-progress registry entry from a real one.\n */\nconst RESOLVING_TYPE_PLACEHOLDER: TypeNode = {\n kind: \"object\",\n properties: [],\n additionalProperties: true,\n};\n\nfunction makeParseOptions(\n extensionRegistry: ExtensionRegistry | undefined,\n fieldType?: TypeNode,\n checker?: ts.TypeChecker,\n subjectType?: ts.Type,\n hostType?: ts.Type\n): import(\"./tsdoc-parser.js\").ParseTSDocOptions | undefined {\n if (\n extensionRegistry === undefined &&\n fieldType === undefined &&\n checker === undefined &&\n subjectType === undefined &&\n hostType === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(extensionRegistry !== undefined && { extensionRegistry }),\n ...(fieldType !== undefined && { fieldType }),\n ...(checker !== undefined && { checker }),\n ...(subjectType !== undefined && { subjectType }),\n ...(hostType !== undefined && { hostType }),\n };\n}\n\n// =============================================================================\n// IR OUTPUT TYPES\n// =============================================================================\n\n/**\n * Layout metadata extracted from `@Group` and `@ShowWhen` TSDoc tags.\n * One entry per field, in the same order as `fields`.\n */\nexport interface FieldLayoutMetadata {\n /** Group label from `@Group(\"label\")`, or undefined if ungrouped. */\n readonly groupLabel?: string;\n /** ShowWhen condition from `@ShowWhen({ field, value })`, or undefined if always visible. */\n readonly showWhen?: { readonly field: string; readonly value: JsonValue };\n}\n\n/**\n * Result of analyzing a class/interface/type alias into canonical IR.\n */\nexport interface IRClassAnalysis {\n /** Type name */\n readonly name: string;\n /** Root-level metadata for the analyzed declaration. */\n readonly metadata?: ResolvedMetadata;\n /** Analyzed fields as canonical IR FieldNodes */\n readonly fields: readonly FieldNode[];\n /** Layout metadata per field (same order/length as `fields`). */\n readonly fieldLayouts: readonly FieldLayoutMetadata[];\n /** Named type definitions referenced by fields */\n readonly typeRegistry: Record<string, TypeDefinition>;\n /** Root-level metadata for the analyzed declaration. */\n readonly annotations?: readonly AnnotationNode[];\n /** Extraction-time diagnostics surfaced before IR validation. */\n readonly diagnostics?: readonly ConstraintSemanticDiagnostic[];\n /** Instance methods (retained for downstream method-schema generation) */\n readonly instanceMethods: readonly MethodInfo[];\n /** Static methods */\n readonly staticMethods: readonly MethodInfo[];\n}\n\nexport type AnalyzeTypeAliasToIRFailureKind = \"duplicate-properties\" | \"not-object-like\";\n\n/**\n * Result of analyzing a type alias into IR — either success or error.\n */\nexport type AnalyzeTypeAliasToIRResult =\n | { readonly ok: true; readonly analysis: IRClassAnalysis }\n | {\n readonly ok: false;\n readonly kind: AnalyzeTypeAliasToIRFailureKind;\n readonly error: string;\n };\n\nexport interface DeclarationRootInfo {\n readonly metadata?: ResolvedMetadata;\n readonly annotations: readonly AnnotationNode[];\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n}\n\n/**\n * Discriminator-specific schema generation options.\n *\n * @public\n */\nexport interface DiscriminatorResolutionOptions {\n /**\n * Optional prefix applied only to metadata-derived discriminator values.\n *\n * Literal discriminator identities taken directly from a bound type remain\n * unchanged.\n */\n readonly apiNamePrefix?: string | undefined;\n}\n\ninterface DiscriminatorDirective {\n readonly fieldName: string;\n readonly typeParameterName: string;\n readonly provenance: Provenance;\n}\n\ninterface AnalyzerMetadataPolicy {\n readonly raw: MetadataPolicyInput | undefined;\n readonly normalized: ReturnType<typeof normalizeMetadataPolicy>;\n readonly discriminator: DiscriminatorResolutionOptions | undefined;\n}\n\nexport function createAnalyzerMetadataPolicy(\n input?: MetadataPolicyInput,\n discriminator?: DiscriminatorResolutionOptions\n): AnalyzerMetadataPolicy {\n return {\n raw: input,\n normalized: normalizeMetadataPolicy(input),\n discriminator,\n };\n}\n\n/**\n * Diagnostic codes eligible for deduplication by `deduplicateDiagnostics`.\n *\n * Only setup diagnostics are safe to dedup by `code + message` because every\n * copy shares the same `primaryLocation` (the registry-level\n * `{surface:\"extension\", line:1, column:0}` anchor). Per-field diagnostics —\n * e.g., two fields producing the same `INVALID_TAG_PLACEMENT` message at\n * different file positions — must not be merged because their\n * `primaryLocation` values differ and losing one would silently hide a\n * legitimate per-field error.\n */\nconst DEDUPLICATABLE_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set([\n \"SYNTHETIC_SETUP_FAILURE\",\n \"UNSUPPORTED_CUSTOM_TYPE_OVERRIDE\",\n]);\n\n/**\n * Removes duplicate setup diagnostics from an accumulated array, leaving\n * non-setup diagnostics unchanged.\n *\n * Phase 4 Slice C: when an extension registry has setup failures, each field\n * node in a class/interface calls {@link parseTSDocTags} independently, and\n * each call returns the same setup diagnostic (anchored at the extension\n * registration site). Without deduplication, an N-field declaration would\n * produce N identical setup diagnostics. We deduplicate by `code + message`\n * (`\\0`-separated to prevent collisions between a code value that matches a\n * message prefix and an actual message) because all copies of a setup\n * diagnostic share the same `primaryLocation` provenance.\n *\n * Dedup is restricted to {@link DEDUPLICATABLE_DIAGNOSTIC_CODES} so that\n * per-field diagnostics with identical messages but distinct locations are\n * always retained — otherwise the helper would silently drop legitimate\n * errors on sibling fields that happen to share a diagnostic code+message.\n *\n * TODO: root fix — instead of deduplicating after accumulation, inject setup\n * diagnostics ONCE at the class/interface/type-alias entry in\n * `analyzeClassToIR` / `analyzeInterfaceToIR` / `analyzeTypeAliasToIR`,\n * before iterating fields. When `extensionRegistry.setupDiagnostics` is\n * non-empty, emit them once and pass `undefined` as the extension registry to\n * per-field `parseTSDocTags` calls so they perform no setup-diag re-emission.\n * That eliminates the need for this deduplication pass entirely.\n * Tracked in\n * `docs/refactors/phase-4-slice-c-deduplicate-diagnostics-root-fix.md`.\n */\nexport function deduplicateDiagnostics(\n diagnostics: readonly ConstraintSemanticDiagnostic[]\n): readonly ConstraintSemanticDiagnostic[] {\n if (diagnostics.length <= 1) return diagnostics;\n const seen = new Set<string>();\n return diagnostics.filter((d) => {\n if (!DEDUPLICATABLE_DIAGNOSTIC_CODES.has(d.code)) return true;\n // `\\0` separator prevents collisions where a code string is a prefix of a\n // message string (e.g., code = \"FOO\", message = \"BAR\" must not collide\n // with code = \"FOO\\0BAR\", message = \"\").\n const key = `${d.code}\\0${d.message}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction resolveNodeMetadata(\n metadataPolicy: AnalyzerMetadataPolicy,\n declarationKind: \"type\" | \"field\" | \"method\",\n logicalName: string,\n node: ts.Node,\n checker: ts.TypeChecker,\n extensionRegistry?: ExtensionRegistry,\n buildContext?: unknown\n): ResolvedMetadata | undefined {\n const analysis = analyzeMetadataForNodeWithChecker({\n checker,\n node,\n logicalName,\n metadata: metadataPolicy.raw,\n extensions: extensionRegistry?.extensions,\n ...(buildContext !== undefined && { buildContext }),\n });\n const resolvedMetadata = analysis?.resolvedMetadata;\n const declarationPolicy = getDeclarationMetadataPolicy(\n metadataPolicy.normalized,\n declarationKind\n );\n\n if (\n resolvedMetadata?.apiName === undefined &&\n declarationPolicy.apiName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.displayName === undefined &&\n declarationPolicy.displayName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.apiNamePlural === undefined &&\n declarationPolicy.apiName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.displayNamePlural === undefined &&\n declarationPolicy.displayName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n\n return resolvedMetadata;\n}\n\n// =============================================================================\n// HERITAGE-BASED ANNOTATION INHERITANCE (issue #367)\n// =============================================================================\n\n/**\n * Type-level annotation kinds that should be inherited from base types onto\n * derived types when the derived type does not declare its own value.\n *\n * Scope (issue #367): only `@format` is inherited today. Other type-level\n * annotations (e.g., `@description`, `@remarks`) are intentionally not\n * inherited here to keep the change surface-narrow; broader inheritance can\n * be considered as a follow-up once the semantics are confirmed.\n */\nconst INHERITABLE_TYPE_ANNOTATION_KINDS: ReadonlySet<AnnotationNode[\"annotationKind\"]> = new Set<\n AnnotationNode[\"annotationKind\"]\n>([\"format\"]);\n\n/**\n * Returns the string payload carried by an inheritable annotation, or\n * `undefined` for annotation kinds where presence alone is the signal.\n * Used to decide whether a locally-declared annotation counts as an\n * override (empty/whitespace-only payloads do not — see\n * {@link isOverridingInheritableAnnotation}).\n */\nfunction getInheritableAnnotationStringValue(annotation: AnnotationNode): string | undefined {\n if (annotation.annotationKind === \"format\") return annotation.value;\n return undefined;\n}\n\n/**\n * Returns `true` when a locally-declared annotation should suppress\n * heritage inheritance for its kind. An annotation whose string payload is\n * empty or whitespace-only (`/** @format * /`) is not treated as an\n * override — the base-declared value still flows through.\n */\nfunction isOverridingInheritableAnnotation(annotation: AnnotationNode): boolean {\n const value = getInheritableAnnotationStringValue(annotation);\n if (value === undefined) return true;\n return value.trim().length > 0;\n}\n\n/**\n * Walks base declarations reachable from a derived declaration and returns\n * any inheritable type-level annotations that the derived declaration does\n * not already specify.\n *\n * Supports three entry shapes:\n * - **Class / interface** — walks `extends` clauses (issue #367).\n * - **Interface extends a type alias** — crosses the alias node to reach\n * annotations on a deeper object-shaped ancestor (issue #376).\n * - **Type alias whose body is a type reference** — walks the alias\n * derivation chain (`type Foo = Bar`), following through alias-of-alias\n * and alias-of-interface cases (issue #374).\n *\n * The walk is breadth-first across reachable bases. A seen-set on\n * declarations prevents infinite loops on pathological self-referential\n * chains. Annotations already present on the derived type (matched by\n * `annotationKind`) always win — only missing kinds are filled in from the\n * base chain. When multiple bases provide the same kind, the first found\n * wins (earliest in the `extends` clause list, nearest ancestor first).\n */\nfunction collectInheritedTypeAnnotations(\n derivedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n existingAnnotations: readonly AnnotationNode[],\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined\n): AnnotationNode[] {\n // A local annotation only suppresses heritage inheritance when it carries a\n // meaningful payload. Empty/whitespace-only `@format` must fall through to\n // the base-declared value. See issue #367 review discussion.\n const existingKinds = new Set<AnnotationNode[\"annotationKind\"]>(\n existingAnnotations.filter(isOverridingInheritableAnnotation).map((a) => a.annotationKind)\n );\n const needed = new Set<AnnotationNode[\"annotationKind\"]>();\n for (const kind of INHERITABLE_TYPE_ANNOTATION_KINDS) {\n if (!existingKinds.has(kind)) needed.add(kind);\n }\n if (needed.size === 0) return [];\n\n type HeritageBearingDecl =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n const inherited: AnnotationNode[] = [];\n const seen = new Set<ts.Node>([derivedDecl]);\n const queue: HeritageBearingDecl[] = [];\n\n const resolveSymbolTarget = (sym: ts.Symbol): ts.Symbol => {\n if ((sym.flags & ts.SymbolFlags.Alias) === 0) return sym;\n try {\n return checker.getAliasedSymbol(sym);\n } catch {\n // TypeScript can throw when resolving certain alias chains (e.g.,\n // cyclic or partially resolved aliases). Fall back to the original\n // symbol — worst case we miss an inheritance step, not a fatal error.\n return sym;\n }\n };\n\n const isObjectShapedTypeAlias = (alias: ts.TypeAliasDeclaration): boolean => {\n // An interface can only legally extend an object-shaped alias (the TS\n // compiler rejects `interface X extends StringAlias`), but we guard here\n // so a misuse higher in the chain cannot pull in annotations from a\n // primitive-typed alias whose semantics do not match. The check uses\n // the alias's resolved type, not its syntactic RHS, so aliases of\n // aliases-of-interfaces are covered.\n const type = checker.getTypeFromTypeNode(alias.type);\n if ((type.flags & ts.TypeFlags.Object) !== 0) return true;\n if (type.isIntersection()) return true;\n return false;\n };\n\n // `fromTypeAliasRhs` differentiates two enqueue contexts:\n // - false: reached from an interface/class `extends` clause. Type-alias\n // candidates must be object-shaped (TS compiler restriction).\n // - true: reached from a type alias's own RHS (alias-of-alias or\n // alias-of-interface). Primitive-typed chains are valid (issue #374:\n // `type WorkEmail = BaseEmail = string`).\n const enqueueCandidate = (baseDecl: ts.Declaration, fromTypeAliasRhs: boolean): void => {\n if (seen.has(baseDecl)) return;\n if (ts.isClassDeclaration(baseDecl) || ts.isInterfaceDeclaration(baseDecl)) {\n seen.add(baseDecl);\n queue.push(baseDecl);\n return;\n }\n if (ts.isTypeAliasDeclaration(baseDecl)) {\n if (!fromTypeAliasRhs && !isObjectShapedTypeAlias(baseDecl)) return;\n seen.add(baseDecl);\n queue.push(baseDecl);\n }\n };\n\n const enqueueBasesOf = (decl: HeritageBearingDecl): void => {\n if (ts.isTypeAliasDeclaration(decl)) {\n // Type aliases have no heritage clauses. Instead, follow the alias's\n // RHS when it resolves to another named type. This unifies the\n // alias-chain walk (#374) with the interface-extends-alias mid-chain\n // case (#376) under a single traversal.\n const rhs = decl.type;\n if (!ts.isTypeReferenceNode(rhs)) return;\n const sym = checker.getSymbolAtLocation(rhs.typeName);\n if (!sym) return;\n const target = resolveSymbolTarget(sym);\n for (const baseDecl of target.declarations ?? []) {\n enqueueCandidate(baseDecl, /*fromTypeAliasRhs*/ true);\n }\n return;\n }\n\n const heritageClauses = decl.heritageClauses;\n if (!heritageClauses) return;\n for (const clause of heritageClauses) {\n // Only follow `extends`. `implements` does NOT propagate type-level\n // annotations: authors use `implements` to assert structural\n // conformance, not to adopt the interface's metadata. Following it\n // would silently merge annotations across unrelated nominal types.\n if (clause.token !== ts.SyntaxKind.ExtendsKeyword) continue;\n for (const typeExpr of clause.types) {\n const sym = checker.getSymbolAtLocation(typeExpr.expression);\n if (!sym) continue;\n const target = resolveSymbolTarget(sym);\n for (const baseDecl of target.declarations ?? []) {\n enqueueCandidate(baseDecl, /*fromTypeAliasRhs*/ false);\n }\n }\n }\n };\n\n enqueueBasesOf(derivedDecl);\n\n // Index-pointer traversal (vs `queue.shift()`) keeps the BFS O(n) for deep\n // heritage graphs — array shift is O(n) in V8.\n for (let queueIndex = 0; queueIndex < queue.length && needed.size > 0; queueIndex++) {\n const baseDecl = queue[queueIndex];\n if (baseDecl === undefined) continue;\n // Use the base declaration's own source file for provenance / pos-mapping.\n // The BFS may cross file boundaries, so the derived type's file is not\n // the right reference point for annotations parsed off a base declaration.\n const baseFile = baseDecl.getSourceFile().fileName;\n const baseAnnotations = extractJSDocAnnotationNodes(\n baseDecl,\n baseFile,\n makeParseOptions(extensionRegistry)\n );\n for (const annotation of baseAnnotations) {\n if (!needed.has(annotation.annotationKind)) continue;\n // Skip empty-payload annotations on the base as well — they cannot\n // meaningfully fill an inherited slot.\n if (!isOverridingInheritableAnnotation(annotation)) continue;\n inherited.push(annotation);\n needed.delete(annotation.annotationKind);\n }\n // Continue up the chain if we still need kinds.\n if (needed.size > 0) {\n enqueueBasesOf(baseDecl);\n }\n }\n\n return inherited;\n}\n\n/**\n * Extracts type-level annotations from a named declaration (class, interface,\n * or type alias), applying inheritance where applicable (issues #367, #374,\n * #376). Any inheritable annotation kind absent from the local declaration\n * is filled in by walking `extends` clauses and type-alias RHS chains via\n * {@link collectInheritedTypeAnnotations}.\n */\nfunction extractNamedTypeAnnotations(\n namedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file: string,\n extensionRegistry: ExtensionRegistry | undefined\n): AnnotationNode[] {\n const local = extractJSDocAnnotationNodes(namedDecl, file, makeParseOptions(extensionRegistry));\n const inherited = collectInheritedTypeAnnotations(namedDecl, local, checker, extensionRegistry);\n if (inherited.length === 0) return [...local];\n return [...local, ...inherited];\n}\n\nexport function analyzeDeclarationRootInfo(\n declaration: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput\n): DeclarationRootInfo {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(metadataPolicy);\n const declarationType = checker.getTypeAtLocation(declaration);\n const logicalName = ts.isClassDeclaration(declaration)\n ? (declaration.name?.text ?? \"AnonymousClass\")\n : declaration.name.text;\n const docResult = extractJSDocParseResult(\n declaration,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, declarationType, declarationType)\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n logicalName,\n declaration,\n checker,\n extensionRegistry,\n {\n checker,\n declaration,\n subjectType: declarationType,\n hostType: declarationType,\n }\n );\n\n return {\n ...(metadata !== undefined && { metadata }),\n annotations: docResult.annotations,\n diagnostics: docResult.diagnostics,\n };\n}\n\n// =============================================================================\n// IR ANALYSIS — PUBLIC API\n// =============================================================================\n\n/**\n * Analyzes a class declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeClassToIR(\n classDecl: ts.ClassDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = classDecl.name?.text ?? \"AnonymousClass\";\n const fields: FieldNode[] = [];\n const fieldLayouts: FieldLayoutMetadata[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const classType = checker.getTypeAtLocation(classDecl);\n const classDoc = extractJSDocParseResult(\n classDecl,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, classType, classType)\n );\n // Issue #367: type-level annotations (e.g., @format) declared on a base\n // class flow to derived classes unless the derived class overrides them.\n const inheritedClassAnnotations = collectInheritedTypeAnnotations(\n classDecl,\n classDoc.annotations,\n checker,\n extensionRegistry\n );\n const annotations: AnnotationNode[] = [...classDoc.annotations, ...inheritedClassAnnotations];\n diagnostics.push(...classDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n const instanceMethods: MethodInfo[] = [];\n const staticMethods: MethodInfo[] = [];\n\n for (const member of classDecl.members) {\n if (ts.isPropertyDeclaration(member)) {\n const fieldNode = analyzeFieldToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n classType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n fieldLayouts.push({});\n }\n } else if (ts.isMethodDeclaration(member)) {\n const methodInfo = analyzeMethod(member, checker);\n if (methodInfo) {\n const isStatic = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);\n if (isStatic) {\n staticMethods.push(methodInfo);\n } else {\n instanceMethods.push(methodInfo);\n }\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n classDecl,\n classType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n classDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: classDecl,\n subjectType: classType,\n hostType: classType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts,\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods,\n staticMethods,\n };\n}\n\n/**\n * Analyzes an interface declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeInterfaceToIR(\n interfaceDecl: ts.InterfaceDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = interfaceDecl.name.text;\n const fields: FieldNode[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const interfaceType = checker.getTypeAtLocation(interfaceDecl);\n const interfaceDoc = extractJSDocParseResult(\n interfaceDecl,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, interfaceType, interfaceType)\n );\n // Issue #367: type-level annotations (e.g., @format) declared on a base\n // interface flow to derived interfaces unless the derived interface\n // overrides them.\n const inheritedInterfaceAnnotations = collectInheritedTypeAnnotations(\n interfaceDecl,\n interfaceDoc.annotations,\n checker,\n extensionRegistry\n );\n const annotations: AnnotationNode[] = [\n ...interfaceDoc.annotations,\n ...inheritedInterfaceAnnotations,\n ];\n diagnostics.push(...interfaceDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n\n for (const member of interfaceDecl.members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n interfaceType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n interfaceDecl,\n interfaceType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const fieldLayouts: FieldLayoutMetadata[] = specializedFields.map(() => ({}));\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n interfaceDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: interfaceDecl,\n subjectType: interfaceType,\n hostType: interfaceType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts,\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods: [],\n staticMethods: [],\n };\n}\n\n/**\n * Analyzes a type alias declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeTypeAliasToIR(\n typeAlias: ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): AnalyzeTypeAliasToIRResult {\n const members = getObjectLikeTypeAliasMembers(typeAlias.type);\n if (members === null) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- enum reverse mapping can be undefined for compiler-internal kinds\n const kindDesc = ts.SyntaxKind[typeAlias.type.kind] ?? \"unknown\";\n return {\n ok: false,\n kind: \"not-object-like\",\n error: `Type alias \"${typeAlias.name.text}\" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`,\n };\n }\n\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = typeAlias.name.text;\n const duplicatePropertyNames = findDuplicateObjectLikeTypeAliasPropertyNames(members);\n if (duplicatePropertyNames.length > 0) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n return {\n ok: false,\n kind: \"duplicate-properties\",\n error: `Type alias \"${name}\" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(\", \")}`,\n };\n }\n\n const fields: FieldNode[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const aliasType = checker.getTypeAtLocation(typeAlias);\n const typeAliasDoc = extractJSDocParseResult(\n typeAlias,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, aliasType, aliasType)\n );\n const annotations = [...typeAliasDoc.annotations];\n diagnostics.push(...typeAliasDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n\n for (const member of members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n aliasType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n typeAlias,\n aliasType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n typeAlias,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: typeAlias,\n subjectType: aliasType,\n hostType: aliasType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n ok: true,\n analysis: {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts: specializedFields.map(() => ({})),\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods: [],\n staticMethods: [],\n },\n };\n}\n\n// =============================================================================\n// DISCRIMINATOR HELPERS\n// =============================================================================\n\ntype DiscriminatorDeclarationNode =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\ninterface ResolvedDiscriminatorProperty {\n readonly declaration: ts.Declaration | undefined;\n readonly type: ts.Type;\n readonly optional: boolean;\n}\n\nfunction makeAnalysisDiagnostic(\n code: string,\n message: string,\n primaryLocation: Provenance,\n relatedLocations: readonly Provenance[] = []\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation,\n relatedLocations,\n };\n}\n\nfunction getLeadingParsedTags(node: ts.Node): readonly ParsedCommentTag[] {\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n if (commentRanges === undefined) {\n return [];\n }\n\n const parsedTags: ParsedCommentTag[] = [];\n for (const range of commentRanges) {\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) {\n continue;\n }\n const commentText = sourceText.slice(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) {\n continue;\n }\n parsedTags.push(...parseCommentBlock(commentText, { offset: range.pos }).tags);\n }\n\n return parsedTags;\n}\n\nfunction resolveDiscriminatorProperty(\n node: DiscriminatorDeclarationNode,\n checker: ts.TypeChecker,\n fieldName: string\n): ResolvedDiscriminatorProperty | null {\n const subjectType = checker.getTypeAtLocation(node);\n const propertySymbol = subjectType.getProperty(fieldName);\n if (propertySymbol === undefined) {\n return null;\n }\n\n const declaration =\n propertySymbol.valueDeclaration ??\n propertySymbol.declarations?.find(\n (candidate) => ts.isPropertyDeclaration(candidate) || ts.isPropertySignature(candidate)\n ) ??\n propertySymbol.declarations?.[0];\n\n return {\n declaration,\n type: checker.getTypeOfSymbolAtLocation(propertySymbol, declaration ?? node),\n optional:\n !!(propertySymbol.flags & ts.SymbolFlags.Optional) ||\n (declaration !== undefined &&\n \"questionToken\" in declaration &&\n declaration.questionToken !== undefined),\n };\n}\n\nfunction isLocalTypeParameterName(\n node: DiscriminatorDeclarationNode,\n typeParameterName: string\n): boolean {\n return (\n node.typeParameters?.some((typeParameter) => typeParameter.name.text === typeParameterName) ??\n false\n );\n}\n\nfunction isNullishSemanticType(type: ts.Type): boolean {\n if (\n type.flags &\n (ts.TypeFlags.Null |\n ts.TypeFlags.Undefined |\n ts.TypeFlags.Void |\n ts.TypeFlags.Unknown |\n ts.TypeFlags.Any)\n ) {\n return true;\n }\n\n return type.isUnion() && type.types.some((member) => isNullishSemanticType(member));\n}\n\nfunction isStringLikeSemanticType(\n type: ts.Type,\n checker: ts.TypeChecker,\n seen = new Set<ts.Type>()\n): boolean {\n if (seen.has(type)) {\n return false;\n }\n seen.add(type);\n\n if (type.flags & ts.TypeFlags.StringLike) {\n return true;\n }\n\n if (type.isUnion()) {\n return (\n type.types.length > 0 &&\n type.types.every((member) => isStringLikeSemanticType(member, checker, seen))\n );\n }\n\n const baseConstraint = checker.getBaseConstraintOfType(type);\n if (baseConstraint !== undefined && baseConstraint !== type) {\n return isStringLikeSemanticType(baseConstraint, checker, seen);\n }\n\n return false;\n}\n\nfunction getObjectLikeTypeAliasMembers(typeNode: ts.TypeNode): readonly ts.TypeElement[] | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return getObjectLikeTypeAliasMembers(typeNode.type);\n }\n\n if (ts.isTypeLiteralNode(typeNode)) {\n return [...typeNode.members];\n }\n\n if (ts.isIntersectionTypeNode(typeNode)) {\n const members: ts.TypeElement[] = [];\n for (const intersectionMember of typeNode.types) {\n const resolvedMembers = getObjectLikeTypeAliasMembers(intersectionMember);\n if (resolvedMembers === null) {\n return null;\n }\n members.push(...resolvedMembers);\n }\n return members;\n }\n\n return null;\n}\n\nfunction extractDiscriminatorDirective(\n node: DiscriminatorDeclarationNode,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[]\n): DiscriminatorDirective | null {\n const discriminatorTags = getLeadingParsedTags(node).filter(\n (tag) => tag.normalizedTagName === \"discriminator\"\n );\n if (discriminatorTags.length === 0) {\n return null;\n }\n\n const [firstTag, ...duplicateTags] = discriminatorTags;\n for (const _duplicateTag of duplicateTags) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"DUPLICATE_TAG\",\n 'Duplicate \"@discriminator\" tag. Only one discriminator declaration is allowed per declaration.',\n provenanceForNode(node, file)\n )\n );\n }\n\n if (firstTag === undefined) {\n return null;\n }\n\n const firstTarget = firstTag.target;\n if (firstTarget?.path === null || firstTarget?.valid !== true) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" requires a direct path target like \":kind\".',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n if (firstTarget.path.segments.length !== 1) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" only supports direct property targets in v1; nested paths are out of scope.',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n const typeParameterName = firstTag.argumentText.trim();\n if (!/^[A-Za-z_$][\\w$]*$/u.test(typeParameterName)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" requires a local type parameter name as its source operand.',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n return {\n fieldName: firstTarget.path.segments[0] ?? firstTarget.rawText,\n typeParameterName,\n provenance: provenanceForNode(node, file),\n };\n}\n\nfunction validateDiscriminatorDirective(\n node: DiscriminatorDeclarationNode,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[]\n): DiscriminatorDirective | null {\n const directive = extractDiscriminatorDirective(node, file, diagnostics);\n if (directive === null) {\n return null;\n }\n\n if (!isLocalTypeParameterName(node, directive.typeParameterName)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n `Tag \"@discriminator\" references \"${directive.typeParameterName}\", but the source operand must be a type parameter declared on the same declaration.`,\n directive.provenance\n )\n );\n return null;\n }\n\n const property = resolveDiscriminatorProperty(node, checker, directive.fieldName);\n if (property === null) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"UNKNOWN_PATH_TARGET\",\n `Tag \"@discriminator\" targets \"${directive.fieldName}\", but no direct property with that name exists on this declaration.`,\n directive.provenance\n )\n );\n return null;\n }\n\n if (property.optional) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must be required; optional discriminator fields are not supported.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n if (isNullishSemanticType(property.type)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must not be nullable.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n if (!isStringLikeSemanticType(property.type, checker)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must be string-like.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n return directive;\n}\n\nfunction getConcreteTypeArgumentForDiscriminator(\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n typeParameterName: string\n): ts.Type | null {\n const typeParameterIndex =\n node.typeParameters?.findIndex(\n (typeParameter) => typeParameter.name.text === typeParameterName\n ) ?? -1;\n if (typeParameterIndex < 0) {\n return null;\n }\n\n const referenceTypeArguments =\n (isTypeReference(subjectType) ? subjectType.typeArguments : undefined) ??\n (subjectType as ts.Type & { aliasTypeArguments?: readonly ts.Type[] }).aliasTypeArguments;\n if (referenceTypeArguments?.[typeParameterIndex] !== undefined) {\n return referenceTypeArguments[typeParameterIndex] ?? null;\n }\n\n const localTypeParameter = node.typeParameters?.[typeParameterIndex];\n return localTypeParameter === undefined ? null : checker.getTypeAtLocation(localTypeParameter);\n}\n\nfunction resolveLiteralDiscriminatorPropertyValue(\n boundType: ts.Type,\n propertyName: string,\n checker: ts.TypeChecker,\n provenance: Provenance,\n diagnostics: ConstraintSemanticDiagnostic[]\n): string | null | undefined {\n const propertySymbol = boundType.getProperty(propertyName);\n if (propertySymbol === undefined) {\n return undefined;\n }\n\n const declaration = propertySymbol.valueDeclaration ?? propertySymbol.declarations?.[0];\n const anchorNode = declaration ?? boundType.symbol.declarations?.[0] ?? null;\n const resolvedAnchorNode = anchorNode ?? resolveNamedDiscriminatorDeclaration(boundType, checker);\n if (resolvedAnchorNode === null) {\n return undefined;\n }\n const propertyType = checker.getTypeOfSymbolAtLocation(propertySymbol, resolvedAnchorNode);\n\n if (propertyType.isStringLiteral()) {\n return propertyType.value;\n }\n\n if (propertyType.isUnion()) {\n const nonNullMembers = propertyType.types.filter(\n (member) => !(member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n if (nonNullMembers.length > 0 && nonNullMembers.every((member) => member.isStringLiteral())) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution for union-valued identity properties is out of scope for v1.\",\n provenance\n )\n );\n return null;\n }\n }\n\n return undefined;\n}\n\nfunction getDiscriminatorIdentityPropertyNames(fieldName: string): readonly string[] {\n return fieldName === \"object\" ? [\"object\"] : [fieldName, \"object\"];\n}\n\nfunction resolveDiscriminatorApiName(\n boundType: ts.Type,\n checker: ts.TypeChecker,\n metadataPolicy: AnalyzerMetadataPolicy\n): ResolvedScalarMetadata | undefined {\n const declaration = resolveNamedDiscriminatorDeclaration(boundType, checker);\n if (declaration === null) {\n return undefined;\n }\n\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n getDiscriminatorLogicalName(boundType, declaration, checker),\n declaration,\n checker,\n undefined,\n {\n checker,\n declaration,\n subjectType: boundType,\n }\n );\n return metadata?.apiName;\n}\n\nfunction applyDiscriminatorApiNamePrefix(\n value: string,\n discriminatorOptions: DiscriminatorResolutionOptions | undefined\n): string {\n const prefix = discriminatorOptions?.apiNamePrefix;\n return prefix === undefined || prefix === \"\" ? value : `${prefix}${value}`;\n}\n\nfunction resolveNamedDiscriminatorDeclaration(\n type: ts.Type,\n checker: ts.TypeChecker,\n seen = new Set<ts.Type>()\n): ts.Declaration | null {\n if (seen.has(type)) {\n return null;\n }\n seen.add(type);\n\n const symbol = type.aliasSymbol ?? type.getSymbol();\n if (symbol !== undefined) {\n const aliased =\n symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : undefined;\n const targetSymbol = aliased ?? symbol;\n const declaration = targetSymbol.declarations?.find(\n (candidate) =>\n ts.isClassDeclaration(candidate) ||\n ts.isInterfaceDeclaration(candidate) ||\n ts.isTypeAliasDeclaration(candidate) ||\n ts.isEnumDeclaration(candidate)\n );\n if (declaration !== undefined) {\n if (\n ts.isTypeAliasDeclaration(declaration) &&\n ts.isTypeReferenceNode(declaration.type) &&\n checker.getTypeFromTypeNode(declaration.type) !== type\n ) {\n return resolveNamedDiscriminatorDeclaration(\n checker.getTypeFromTypeNode(declaration.type),\n checker,\n seen\n );\n }\n return declaration;\n }\n }\n\n return null;\n}\n\nfunction resolveDiscriminatorValue(\n boundType: ts.Type | null,\n fieldName: string,\n checker: ts.TypeChecker,\n provenance: Provenance,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): string | null {\n if (boundType === null) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution failed because no concrete type argument is available for the referenced type parameter.\",\n provenance\n )\n );\n return null;\n }\n\n if (boundType.isStringLiteral()) {\n return boundType.value;\n }\n\n if (boundType.isUnion()) {\n const nonNullMembers = boundType.types.filter(\n (member) => !(member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n if (nonNullMembers.every((member) => member.isStringLiteral())) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution for unions of string literals is out of scope for v1.\",\n provenance\n )\n );\n return null;\n }\n }\n\n for (const identityPropertyName of getDiscriminatorIdentityPropertyNames(fieldName)) {\n const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(\n boundType,\n identityPropertyName,\n checker,\n provenance,\n diagnostics\n );\n if (literalIdentityValue === null) {\n return null;\n }\n if (literalIdentityValue !== undefined) {\n return literalIdentityValue;\n }\n }\n\n const apiName = resolveDiscriminatorApiName(boundType, checker, metadataPolicy);\n if (apiName?.source === \"explicit\") {\n return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);\n }\n if (apiName?.source === \"inferred\") {\n return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);\n }\n\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution could not derive a JSON-facing discriminator value from the referenced type argument.\",\n provenance\n )\n );\n return null;\n}\n\nfunction getDeclarationName(node: ts.Declaration): string {\n if (\n ts.isClassDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isEnumDeclaration(node)\n ) {\n return node.name?.text ?? \"anonymous\";\n }\n\n return \"anonymous\";\n}\n\nfunction getResolvedTypeArguments(type: ts.Type): readonly ts.Type[] {\n return (\n (isTypeReference(type) ? type.typeArguments : undefined) ??\n (type as ts.Type & { aliasTypeArguments?: readonly ts.Type[] }).aliasTypeArguments ??\n []\n );\n}\n\nfunction getDiscriminatorLogicalName(\n type: ts.Type,\n declaration: ts.Declaration,\n checker: ts.TypeChecker\n): string {\n const baseName = getDeclarationName(declaration);\n const typeArguments = getResolvedTypeArguments(type);\n return typeArguments.length === 0\n ? baseName\n : buildInstantiatedReferenceName(baseName, typeArguments, checker);\n}\n\nfunction applyDeclarationDiscriminatorToFields(\n fields: readonly FieldNode[],\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): FieldNode[] {\n const directive = validateDiscriminatorDirective(node, checker, file, diagnostics);\n if (directive === null) {\n return [...fields];\n }\n\n const discriminatorValue = resolveDiscriminatorValue(\n getConcreteTypeArgumentForDiscriminator(\n node,\n subjectType,\n checker,\n directive.typeParameterName\n ),\n directive.fieldName,\n checker,\n directive.provenance,\n diagnostics,\n metadataPolicy\n );\n if (discriminatorValue === null) {\n return [...fields];\n }\n\n return fields.map((field) =>\n field.name === directive.fieldName\n ? {\n ...field,\n type: {\n kind: \"enum\",\n members: [{ value: discriminatorValue }],\n },\n }\n : field\n );\n}\n\nfunction buildInstantiatedReferenceName(\n baseName: string,\n typeArguments: readonly ts.Type[],\n checker: ts.TypeChecker\n): string {\n const renderedArguments = typeArguments\n .map((typeArgument) =>\n checker\n .typeToString(typeArgument)\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n )\n .filter((value) => value !== \"\");\n\n return renderedArguments.length === 0 ? baseName : `${baseName}__${renderedArguments.join(\"__\")}`;\n}\n\nfunction extractReferenceTypeArguments(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode: ts.Node | undefined,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry: ExtensionRegistry | undefined,\n diagnostics: ConstraintSemanticDiagnostic[] | undefined\n): readonly { readonly tsType: ts.Type; readonly typeNode: TypeNode }[] {\n const sourceTypeNode =\n sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (sourceTypeNode === undefined) {\n return [];\n }\n\n const unwrapParentheses = (typeNode: ts.TypeNode): ts.TypeNode =>\n ts.isParenthesizedTypeNode(typeNode) ? unwrapParentheses(typeNode.type) : typeNode;\n\n const directTypeNode = unwrapParentheses(sourceTypeNode);\n const referenceTypeNode = ts.isTypeReferenceNode(directTypeNode)\n ? directTypeNode\n : (() => {\n const resolvedTypeNode = resolveAliasedTypeNode(directTypeNode, checker);\n return ts.isTypeReferenceNode(resolvedTypeNode) ? resolvedTypeNode : null;\n })();\n if (referenceTypeNode?.typeArguments === undefined) {\n return [];\n }\n\n return referenceTypeNode.typeArguments.map((argumentNode) => {\n const argumentType = checker.getTypeFromTypeNode(argumentNode);\n\n // If the type argument is a named type declared outside the current\n // analysis root file, emit a synthetic opaque reference TypeNode\n // instead of recursing into its declaration. This preserves the name\n // for buildInstantiatedReferenceName while avoiding stack overflows on\n // deeply-nested types (e.g. Stripe.Customer) used as phantom parameters\n // (e.g. Ref<T>). Note: this path does NOT populate typeRegistry —\n // callers that need a resolved $defs entry must get it via the parent\n // type's property walk.\n const baseSymbol = argumentType.aliasSymbol ?? argumentType.getSymbol();\n const argumentSymbol =\n baseSymbol !== undefined && baseSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(baseSymbol)\n : baseSymbol;\n const argumentDecl = argumentSymbol?.declarations?.[0];\n if (argumentDecl !== undefined && argumentDecl.getSourceFile().fileName !== file) {\n const argumentName = argumentSymbol?.getName() ?? baseSymbol?.getName();\n if (argumentName !== undefined) {\n return {\n tsType: argumentType,\n typeNode: {\n kind: \"reference\",\n name: argumentName,\n typeArguments: [],\n },\n };\n }\n }\n\n return {\n tsType: argumentType,\n typeNode: resolveTypeNode(\n argumentType,\n checker,\n file,\n typeRegistry,\n visiting,\n argumentNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n ),\n };\n });\n}\n\nfunction applyDiscriminatorToObjectProperties(\n properties: readonly ObjectProperty[],\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): readonly ObjectProperty[] {\n const directive = validateDiscriminatorDirective(node, checker, file, diagnostics);\n if (directive === null) {\n return properties;\n }\n\n const discriminatorValue = resolveDiscriminatorValue(\n getConcreteTypeArgumentForDiscriminator(\n node,\n subjectType,\n checker,\n directive.typeParameterName\n ),\n directive.fieldName,\n checker,\n directive.provenance,\n diagnostics,\n metadataPolicy\n );\n if (discriminatorValue === null) {\n return properties;\n }\n\n return properties.map((property) =>\n property.name === directive.fieldName\n ? {\n ...property,\n type: {\n kind: \"enum\",\n members: [{ value: discriminatorValue }],\n },\n }\n : property\n );\n}\n\n// =============================================================================\n// IR FIELD ANALYSIS — PRIVATE\n// =============================================================================\n\n/**\n * Analyzes a class property declaration into a canonical IR FieldNode.\n */\nfunction analyzeFieldToIR(\n prop: ts.PropertyDeclaration,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n diagnostics: ConstraintSemanticDiagnostic[],\n hostType: ts.Type,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry?: ExtensionRegistry\n): FieldNode | null {\n if (!ts.isIdentifier(prop.name)) {\n return null;\n }\n\n const name = prop.name.text;\n const tsType = checker.getTypeAtLocation(prop);\n const optional = prop.questionToken !== undefined;\n const provenance = provenanceForNode(prop, file);\n\n // Resolve ts.Type → TypeNode\n let type = resolveTypeNode(\n tsType,\n checker,\n file,\n typeRegistry,\n visiting,\n prop,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n\n // Collect constraints\n const constraints: ConstraintNode[] = [];\n\n // Inherit constraints from type alias declarations (lower precedence)\n if (prop.type && !shouldEmitPrimitiveAliasDefinition(prop.type, checker)) {\n constraints.push(\n ...extractTypeAliasConstraintNodes(prop.type, checker, file, extensionRegistry)\n );\n }\n\n // Extract JSDoc constraints\n const docResult = extractJSDocParseResult(\n prop,\n file,\n makeParseOptions(extensionRegistry, type, checker, tsType, hostType)\n );\n constraints.push(...docResult.constraints);\n diagnostics.push(...docResult.diagnostics);\n\n // Collect annotations\n let annotations: AnnotationNode[] = [];\n\n // JSDoc annotations (@displayName, @deprecated, summary, @remarks)\n annotations.push(...docResult.annotations);\n\n // Default value annotation\n const defaultAnnotation = extractDefaultValueAnnotation(prop.initializer, file);\n if (defaultAnnotation && !annotations.some((a) => a.annotationKind === \"defaultValue\")) {\n annotations.push(defaultAnnotation);\n }\n\n ({ type, annotations } = applyEnumMemberDisplayNames(type, annotations));\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"field\",\n name,\n prop,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: prop,\n subjectType: tsType,\n hostType,\n }\n );\n\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: !optional,\n constraints,\n annotations,\n provenance,\n };\n}\n\n/**\n * Analyzes an interface/type-alias property signature into a canonical IR FieldNode.\n */\nfunction analyzeInterfacePropertyToIR(\n prop: ts.PropertySignature,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n diagnostics: ConstraintSemanticDiagnostic[],\n hostType: ts.Type,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry?: ExtensionRegistry\n): FieldNode | null {\n const name = getAnalyzableObjectLikePropertyName(prop.name);\n if (name === null) {\n return null;\n }\n const tsType = checker.getTypeAtLocation(prop);\n const optional = prop.questionToken !== undefined;\n const provenance = provenanceForNode(prop, file);\n\n // Resolve ts.Type → TypeNode\n let type = resolveTypeNode(\n tsType,\n checker,\n file,\n typeRegistry,\n visiting,\n prop,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n\n // Collect constraints\n const constraints: ConstraintNode[] = [];\n\n // Inherit constraints from type alias declarations\n if (prop.type && !shouldEmitPrimitiveAliasDefinition(prop.type, checker)) {\n constraints.push(\n ...extractTypeAliasConstraintNodes(prop.type, checker, file, extensionRegistry)\n );\n }\n\n // JSDoc constraints\n const docResult = extractJSDocParseResult(\n prop,\n file,\n makeParseOptions(extensionRegistry, type, checker, tsType, hostType)\n );\n constraints.push(...docResult.constraints);\n diagnostics.push(...docResult.diagnostics);\n\n // Collect annotations\n let annotations: AnnotationNode[] = [];\n\n // JSDoc annotations (@displayName, @deprecated, summary, @remarks)\n annotations.push(...docResult.annotations);\n\n ({ type, annotations } = applyEnumMemberDisplayNames(type, annotations));\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"field\",\n name,\n prop,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: prop,\n subjectType: tsType,\n hostType,\n }\n );\n\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: !optional,\n constraints,\n annotations,\n provenance,\n };\n}\n\nfunction findDuplicateObjectLikeTypeAliasPropertyNames(\n members: readonly ts.TypeElement[]\n): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const member of members) {\n if (!ts.isPropertySignature(member)) {\n continue;\n }\n\n const name = getAnalyzableObjectLikePropertyName(member.name);\n if (name === null) {\n continue;\n }\n\n if (seen.has(name)) {\n duplicates.add(name);\n continue;\n }\n\n seen.add(name);\n }\n\n return [...duplicates].sort();\n}\n\nexport function getAnalyzableObjectLikePropertyName(name: ts.PropertyName): string | null {\n if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n\n return null;\n}\n\n/**\n * Rewrites enum-member display-name annotations into EnumMember.displayName\n * values and strips those annotations from the field-level annotation list.\n *\n * The TSDoc surface uses `@displayName :value Label` for enum member labels.\n * Plain `@displayName Label` annotations remain as field-level titles.\n */\nfunction applyEnumMemberDisplayNames(\n type: TypeNode,\n annotations: readonly AnnotationNode[]\n): { type: TypeNode; annotations: AnnotationNode[] } {\n if (\n !annotations.some(\n (annotation) =>\n annotation.annotationKind === \"displayName\" && annotation.value.trim().startsWith(\":\")\n )\n ) {\n return { type, annotations: [...annotations] };\n }\n\n const consumed = new Set<AnnotationNode>();\n const nextType = rewriteEnumDisplayNames(type, annotations, consumed);\n\n if (consumed.size === 0) {\n return { type, annotations: [...annotations] };\n }\n\n return {\n type: nextType,\n annotations: annotations.filter((annotation) => !consumed.has(annotation)),\n };\n}\n\nfunction rewriteEnumDisplayNames(\n type: TypeNode,\n annotations: readonly AnnotationNode[],\n consumed: Set<AnnotationNode>\n): TypeNode {\n switch (type.kind) {\n case \"enum\":\n return applyEnumMemberDisplayNamesToEnum(type, annotations, consumed);\n\n case \"union\": {\n return {\n ...type,\n members: type.members.map((member) =>\n rewriteEnumDisplayNames(member, annotations, consumed)\n ),\n };\n }\n\n default:\n return type;\n }\n}\n\nfunction applyEnumMemberDisplayNamesToEnum(\n type: EnumTypeNode,\n annotations: readonly AnnotationNode[],\n consumed: Set<AnnotationNode>\n): EnumTypeNode {\n const displayNames = new Map<string, string>();\n\n for (const annotation of annotations) {\n if (annotation.annotationKind !== \"displayName\") continue;\n\n const parsed = parseEnumMemberDisplayName(annotation.value);\n if (!parsed) continue;\n\n // Once parsed as a member-target display name, never let it fall back to a\n // field-level title, even if the target value does not exist.\n consumed.add(annotation);\n\n const member = type.members.find((m) => String(m.value) === parsed.value);\n if (!member) continue;\n\n displayNames.set(String(member.value), parsed.label);\n }\n\n if (displayNames.size === 0) {\n return type;\n }\n\n return {\n ...type,\n members: type.members.map((member) => {\n const displayName = displayNames.get(String(member.value));\n return displayName !== undefined ? { ...member, displayName } : member;\n }),\n };\n}\n\nfunction parseEnumMemberDisplayName(value: string): { value: string; label: string } | null {\n const trimmed = value.trim();\n const match = /^:([^\\s]+)\\s+([\\s\\S]+)$/.exec(trimmed);\n if (!match?.[1] || !match[2]) return null;\n\n const label = match[2].trim();\n if (label === \"\") return null;\n\n return { value: match[1], label };\n}\n\n// =============================================================================\n// TYPE RESOLUTION — ts.Type → TypeNode\n// =============================================================================\n\n/**\n * Resolves a TypeScript type to a canonical IR TypeNode.\n */\nexport function resolveTypeNode(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n // Unified custom-type resolution: tries name → symbol → brand in sequence,\n // strips nullish unions, and returns the first match. Shared with\n // `tsdoc-parser.ts`'s path-target broadening check.\n const customTypeLookup = resolveCustomTypeFromTsType(\n type,\n checker,\n extensionRegistry,\n sourceNode\n );\n if (customTypeLookup !== null) {\n return {\n kind: \"custom\",\n typeId: customTypeIdFromLookup(customTypeLookup),\n payload: null,\n };\n }\n const primitiveAlias = tryResolveNamedPrimitiveAlias(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n if (primitiveAlias) {\n return primitiveAlias;\n }\n\n // --- Integer-branded types (must check before Number) ---\n if (_isIntegerBrandedType(type)) {\n return { kind: \"primitive\", primitiveKind: \"integer\" };\n }\n\n // --- Primitives ---\n if (type.flags & ts.TypeFlags.String) {\n return { kind: \"primitive\", primitiveKind: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return { kind: \"primitive\", primitiveKind: \"number\" };\n }\n if (type.flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n return { kind: \"primitive\", primitiveKind: \"bigint\" };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { kind: \"primitive\", primitiveKind: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n if (type.flags & ts.TypeFlags.Undefined) {\n // Undefined maps to null for nullable semantics in JSON Schema\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n if (type.flags & ts.TypeFlags.Void) {\n // Void (e.g. `Promise<void>` return types) maps to null — matches the\n // treatment of `undefined` and avoids collisions with actual `string` types.\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n\n // --- String literal ---\n if (type.isStringLiteral()) {\n return {\n kind: \"enum\",\n members: [{ value: type.value }],\n };\n }\n\n // --- Number literal ---\n if (type.isNumberLiteral()) {\n return {\n kind: \"enum\",\n members: [{ value: type.value }],\n };\n }\n\n // --- Union types ---\n if (type.isUnion()) {\n return resolveUnionType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n // --- Array types ---\n if (checker.isArrayType(type)) {\n return resolveArrayType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n if (isIntersectionType(type)) {\n const sourceTypeNode =\n sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n const resolvedSourceTypeNode =\n sourceTypeNode === undefined ? undefined : resolveAliasedTypeNode(sourceTypeNode, checker);\n if (\n resolvedSourceTypeNode !== undefined &&\n getObjectLikeTypeAliasMembers(resolvedSourceTypeNode) !== null\n ) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n if (\n resolvedSourceTypeNode !== undefined &&\n isResolvableObjectLikeAliasTypeNode(resolvedSourceTypeNode) &&\n isSemanticallyPlainObjectLikeType(type, checker)\n ) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n }\n\n // --- Object types ---\n if (isObjectType(type)) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n // --- Fallback: treat any/unknown/unresolved types as string ---\n // This includes `any`, `unknown`, type parameters (e.g. `payload: T` inside\n // `Envelope<T>` when walking the declaration), conditional types, indexed\n // access types, and other patterns the analyzer cannot represent in the\n // canonical IR. Promise-unwrapping failures (see `unwrapPromiseType` in\n // `packages/build/src/generators/discovered-schema.ts`) are caught separately\n // to surface the most common cause of silent data loss.\n return { kind: \"primitive\", primitiveKind: \"string\" };\n}\n\nfunction tryResolveNamedPrimitiveAlias(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode | null {\n if (\n !(\n type.flags &\n (ts.TypeFlags.String |\n ts.TypeFlags.Number |\n ts.TypeFlags.BigInt |\n ts.TypeFlags.BigIntLiteral |\n ts.TypeFlags.Boolean |\n ts.TypeFlags.Null)\n ) &&\n !_isIntegerBrandedType(type)\n ) {\n return null;\n }\n\n const aliasDecl =\n type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration) ??\n getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (!aliasDecl) {\n return null;\n }\n\n const aliasName = aliasDecl.name.text;\n if (!typeRegistry[aliasName]) {\n const aliasType = checker.getTypeFromTypeNode(aliasDecl.type);\n const constraints = [\n ...extractJSDocConstraintNodes(aliasDecl, file, makeParseOptions(extensionRegistry)),\n ...extractTypeAliasConstraintNodes(aliasDecl.type, checker, file, extensionRegistry),\n ];\n // Issue #374: collect inheritable annotations (e.g., @format) from the\n // type-alias derivation chain so that `type WorkEmail = BaseEmail` inherits\n // `@format email` from `BaseEmail`.\n const localAnnotations = extractJSDocAnnotationNodes(\n aliasDecl,\n file,\n makeParseOptions(extensionRegistry)\n );\n const inheritedAnnotations = collectInheritedTypeAnnotations(\n aliasDecl,\n localAnnotations,\n checker,\n extensionRegistry\n );\n const annotations = [...localAnnotations, ...inheritedAnnotations];\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n aliasName,\n aliasDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: aliasDecl,\n subjectType: aliasType,\n }\n );\n typeRegistry[aliasName] = {\n name: aliasName,\n ...(metadata !== undefined && { metadata }),\n type: resolveAliasedPrimitiveTarget(\n aliasType,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n ),\n ...(constraints.length > 0 && { constraints }),\n ...(annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(aliasDecl, file),\n };\n }\n\n return { kind: \"reference\", name: aliasName, typeArguments: [] };\n}\n\nfunction getReferencedTypeAliasDeclaration(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): ts.TypeAliasDeclaration | undefined {\n const typeNode =\n sourceNode &&\n (ts.isPropertyDeclaration(sourceNode) ||\n ts.isPropertySignature(sourceNode) ||\n ts.isParameter(sourceNode))\n ? sourceNode.type\n : undefined;\n if (!typeNode || !ts.isTypeReferenceNode(typeNode)) {\n return undefined;\n }\n\n return getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n}\n\n/**\n * Attempts to recover the original type alias name and declaration for a type\n * that may have lost its `aliasSymbol` due to TypeScript synthesizing a wrapper\n * union (e.g. `Currency | undefined` for an optional property `currency?: Currency`).\n *\n * First tries the standard `getNamedTypeName` / `getNamedTypeDeclaration` lookup.\n * When that fails (returns null), falls back to inspecting the source node's type\n * annotation via `getReferencedTypeAliasDeclaration`.\n *\n * The caller decides what to do with the recovered declaration — this function\n * does NOT filter by whether the alias's underlying type is a union, object, or\n * anything else. That keeps the helper generic and lets callers apply their own\n * constraints.\n *\n * Returns `{ typeName, namedDecl }` on success, or `null` if no alias can be found.\n */\nfunction resolveNamedTypeWithSourceRecovery(\n type: ts.Type,\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): {\n typeName: string;\n namedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n} | null {\n const typeName = getNamedTypeName(type);\n const namedDecl = getNamedTypeDeclaration(type);\n\n if (typeName !== null && namedDecl !== undefined) {\n return { typeName, namedDecl };\n }\n\n if (sourceNode === undefined) {\n return null;\n }\n\n const refAliasDecl = getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (refAliasDecl === undefined) {\n return null;\n }\n\n return { typeName: refAliasDecl.name.text, namedDecl: refAliasDecl };\n}\n\nfunction shouldEmitPrimitiveAliasDefinition(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): boolean {\n if (!ts.isTypeReferenceNode(typeNode)) {\n return false;\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (!aliasDecl) {\n return false;\n }\n\n const resolved = checker.getTypeFromTypeNode(aliasDecl.type);\n return !!(\n resolved.flags &\n (ts.TypeFlags.String |\n ts.TypeFlags.Number |\n ts.TypeFlags.BigInt |\n ts.TypeFlags.BigIntLiteral |\n ts.TypeFlags.Boolean |\n ts.TypeFlags.Null)\n );\n}\n\nfunction resolveAliasedPrimitiveTarget(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[],\n visitedAliases: Set<ts.TypeAliasDeclaration> = new Set<ts.TypeAliasDeclaration>()\n): TypeNode {\n const nestedAliasDecl = type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration);\n if (nestedAliasDecl !== undefined && !visitedAliases.has(nestedAliasDecl)) {\n visitedAliases.add(nestedAliasDecl);\n return resolveAliasedPrimitiveTarget(\n checker.getTypeFromTypeNode(nestedAliasDecl.type),\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n diagnostics,\n visitedAliases\n );\n }\n\n if (_isIntegerBrandedType(type)) {\n return { kind: \"primitive\", primitiveKind: \"integer\" };\n }\n if (type.flags & ts.TypeFlags.String) {\n return { kind: \"primitive\", primitiveKind: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return { kind: \"primitive\", primitiveKind: \"number\" };\n }\n if (type.flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n return { kind: \"primitive\", primitiveKind: \"bigint\" };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { kind: \"primitive\", primitiveKind: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n\n return resolveTypeNode(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n undefined,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n}\n\nfunction resolveUnionType(\n type: ts.UnionType,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n // Recovery for optional properties: TypeScript synthesizes e.g. `Currency | undefined`\n // for `currency?: Currency`, or `Address | undefined` for `addr?: Address`. The\n // synthesized wrapper union loses the `aliasSymbol` from the original alias, so\n // `getNamedTypeName` returns null and the type gets inlined at every usage site\n // instead of being deduplicated into `$defs`.\n //\n // We use the centralized helper to fall back to the source node's type annotation.\n // We then accept the recovery only when the alias's underlying type is a union or an\n // object shape — both cases that `resolveUnionType` handles. Primitive-alias cases\n // (plain primitive flags) and branded intersection types (e.g. `Integer`) are excluded\n // because they are handled by `tryResolveNamedPrimitiveAlias` on a per-member basis.\n // See `resolveNamedTypeWithSourceRecovery` for the fallback mechanism.\n const recovered = resolveNamedTypeWithSourceRecovery(type, sourceNode, checker);\n let typeName: string | null = null;\n let namedDecl:\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration\n | undefined;\n if (recovered !== null) {\n const recoveredAliasDecl = ts.isTypeAliasDeclaration(recovered.namedDecl)\n ? recovered.namedDecl\n : undefined;\n if (recoveredAliasDecl !== undefined) {\n const aliasUnderlyingType = checker.getTypeFromTypeNode(recoveredAliasDecl.type);\n // Accept recovery only for non-generic union or object-shape aliases.\n // - Generic aliases (e.g. `Ref<T>`) are excluded because recovering the raw alias\n // name loses type arguments, which would produce an incorrect $ref.\n // - Primitive-alias and branded intersection types (e.g. `Integer`) are excluded\n // because `tryResolveNamedPrimitiveAlias` handles them on a per-member basis.\n const isNonGeneric =\n recoveredAliasDecl.typeParameters === undefined ||\n recoveredAliasDecl.typeParameters.length === 0;\n if (isNonGeneric && (aliasUnderlyingType.isUnion() || isObjectType(aliasUnderlyingType))) {\n typeName = recovered.typeName;\n namedDecl = recovered.namedDecl;\n }\n } else {\n // Non-alias declarations (interfaces, classes): always accept since these\n // have proper symbol-based names and are not primitive aliases.\n typeName = recovered.typeName;\n namedDecl = recovered.namedDecl;\n }\n }\n\n if (typeName && typeName in typeRegistry) {\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n }\n\n const allTypes = type.types;\n const unionMemberTypeNodes = extractUnionMemberTypeNodes(sourceNode, checker);\n const nonNullSourceNodes = unionMemberTypeNodes.filter(\n (memberTypeNode) => !isNullishTypeNode(resolveAliasedTypeNode(memberTypeNode, checker))\n );\n const nonNullTypes = allTypes.filter(\n (memberType) => !(memberType.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n const nonNullMembers = nonNullTypes.map((memberType, index) => ({\n memberType,\n sourceNode:\n nonNullSourceNodes.length === nonNullTypes.length ? nonNullSourceNodes[index] : undefined,\n }));\n const hasNull = allTypes.some((t) => t.flags & ts.TypeFlags.Null);\n const memberDisplayNames = new Map<string, string>();\n if (namedDecl) {\n for (const [value, label] of extractDisplayNameMetadata(namedDecl).memberDisplayNames) {\n memberDisplayNames.set(value, label);\n }\n }\n if (sourceNode) {\n for (const [value, label] of extractDisplayNameMetadata(sourceNode).memberDisplayNames) {\n memberDisplayNames.set(value, label);\n }\n }\n\n const registerNamed = (result: TypeNode): TypeNode => {\n if (!typeName) {\n return result;\n }\n // If the inner resolution (e.g. resolveObjectType on a recursive alias) already\n // finalized a proper body under this name, don't overwrite it with the reference\n // node we synthesized here — that would destroy the real `$defs` entry and leave\n // a dangling self-reference like `{ \"Tree\": { \"$ref\": \"#/$defs/Tree\" } }`.\n const existing = typeRegistry[typeName];\n if (existing !== undefined && existing.type !== RESOLVING_TYPE_PLACEHOLDER) {\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n }\n const annotations = namedDecl\n ? extractNamedTypeAnnotations(namedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n namedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n typeName,\n namedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: namedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[typeName] = {\n name: typeName,\n ...(metadata !== undefined && { metadata }),\n type: result,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(namedDecl ?? sourceNode, file),\n };\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n };\n\n const applyMemberLabels = (members: readonly (string | number)[]): EnumMember[] =>\n members.map((value) => {\n const displayName = memberDisplayNames.get(String(value));\n return displayName !== undefined ? { value, displayName } : { value };\n });\n\n const isBooleanUnion =\n nonNullTypes.length === 2 && nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral);\n\n if (isBooleanUnion) {\n const boolNode: TypeNode = { kind: \"primitive\", primitiveKind: \"boolean\" };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [boolNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : boolNode;\n return registerNamed(result);\n }\n\n const allStringLiterals = nonNullTypes.every((t) => t.isStringLiteral());\n if (allStringLiterals && nonNullTypes.length > 0) {\n const stringTypes = nonNullTypes.filter((t): t is ts.StringLiteralType => t.isStringLiteral());\n const enumNode: TypeNode = {\n kind: \"enum\",\n members: applyMemberLabels(stringTypes.map((t) => t.value)),\n };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [enumNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : enumNode;\n return registerNamed(result);\n }\n\n const allNumberLiterals = nonNullTypes.every((t) => t.isNumberLiteral());\n if (allNumberLiterals && nonNullTypes.length > 0) {\n const numberTypes = nonNullTypes.filter((t): t is ts.NumberLiteralType => t.isNumberLiteral());\n const enumNode: TypeNode = {\n kind: \"enum\",\n members: applyMemberLabels(numberTypes.map((t) => t.value)),\n };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [enumNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : enumNode;\n return registerNamed(result);\n }\n\n if (nonNullMembers.length === 1 && nonNullMembers[0]) {\n const inner = resolveTypeNode(\n nonNullMembers[0].memberType,\n checker,\n file,\n typeRegistry,\n visiting,\n nonNullMembers[0].sourceNode ?? sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [inner, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : inner;\n return registerNamed(result);\n }\n\n const members = nonNullMembers.map(({ memberType, sourceNode: memberSourceNode }) =>\n resolveTypeNode(\n memberType,\n checker,\n file,\n typeRegistry,\n visiting,\n memberSourceNode ?? sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n )\n );\n if (hasNull) {\n members.push({ kind: \"primitive\", primitiveKind: \"null\" });\n }\n return registerNamed({ kind: \"union\", members });\n}\n\nfunction resolveArrayType(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n const typeArgs = isTypeReference(type) ? type.typeArguments : undefined;\n const elementType = typeArgs?.[0];\n const elementSourceNode = extractArrayElementTypeNode(sourceNode, checker);\n\n const items = elementType\n ? resolveTypeNode(\n elementType,\n checker,\n file,\n typeRegistry,\n visiting,\n elementSourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n )\n : ({ kind: \"primitive\", primitiveKind: \"string\" } satisfies TypeNode);\n\n return { kind: \"array\", items };\n}\n\n/**\n * Returns a `RecordTypeNode` if `type` is a pure dictionary type (string index\n * signature with no named properties), or `null` otherwise.\n *\n * This handles both `Record<string, T>` (a mapped/aliased type) and inline\n * `{ [k: string]: T }` index signature types per spec 003 §2.5.\n */\nfunction tryResolveRecordType(\n type: ts.ObjectType,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): RecordTypeNode | null {\n // Only types with no named properties qualify as pure dictionaries.\n if (type.getProperties().length > 0) {\n return null;\n }\n const indexInfo = checker.getIndexInfoOfType(type, ts.IndexKind.String);\n if (!indexInfo) {\n return null;\n }\n\n const valueType = resolveTypeNode(\n indexInfo.type,\n checker,\n file,\n typeRegistry,\n visiting,\n undefined,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n return { kind: \"record\", valueType };\n}\n\nfunction typeNodeContainsReference(type: TypeNode, targetName: string): boolean {\n switch (type.kind) {\n case \"reference\":\n return type.name === targetName;\n case \"array\":\n return typeNodeContainsReference(type.items, targetName);\n case \"record\":\n return typeNodeContainsReference(type.valueType, targetName);\n case \"union\":\n return type.members.some((member) => typeNodeContainsReference(member, targetName));\n case \"object\":\n return type.properties.some((property) =>\n typeNodeContainsReference(property.type, targetName)\n );\n case \"primitive\":\n case \"enum\":\n case \"dynamic\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Determines which resolved object properties are emitted into the Canonical IR.\n * Properties starting with `__` are excluded — they are reserved for phantom/brand type markers\n * (e.g., `__type` in `Ref<T>`) that carry type information at the TypeScript level but must not\n * appear in generated JSON Schema. This also excludes symbol-keyed properties, which TypeScript\n * represents internally with `__@`-prefixed names. The declaration-name checks below handle\n * other computed, private, or otherwise unsupported property name forms.\n */\nfunction shouldEmitResolvedObjectProperty(\n property: ts.Symbol,\n declaration: ts.Declaration | undefined\n): boolean {\n if (property.name.startsWith(\"__\")) {\n return false;\n }\n\n if (declaration !== undefined && \"name\" in declaration && declaration.name !== undefined) {\n const name = declaration.name as ts.PropertyName;\n if (ts.isComputedPropertyName(name) || ts.isPrivateIdentifier(name)) {\n return false;\n }\n\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name) && !ts.isNumericLiteral(name)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * If `sourceNode` carries a type annotation that is a \"pass-through\" type\n * alias whose identity should be preserved in `$defs`, returns the alias's\n * name and declaration. Returns `undefined` otherwise.\n *\n * A pass-through alias is one whose body is a `TypeReference` (`type Foo =\n * Bar`) rather than a structural type (type literal, intersection, etc.).\n * Structural aliases are already handled via the normal registration path.\n *\n * Identity preservation is gated on the alias carrying an **inheritable\n * type-level annotation** (either locally or inherited through the alias\n * chain) — today that means `@format` (issue #374). Aliases with only\n * path-targeted constraints like `@minimum :field N` (issue #364) collapse\n * to the base type so sibling-keyword composition works against the base's\n * `$defs` entry.\n */\nfunction getPassThroughTypeAliasFromSourceNode(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined,\n resolvedTypeName: string | undefined\n): { aliasName: string; aliasDecl: ts.TypeAliasDeclaration } | undefined {\n const aliasDecl = getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (!aliasDecl) return undefined;\n\n const aliasName = aliasDecl.name.text;\n // Skip if the alias name already matches the resolved type name — no wrapping needed.\n if (aliasName === resolvedTypeName) return undefined;\n\n // Only treat as pass-through if the alias body is itself a type reference\n // (not a structural type like `type Foo = { ... }` or `type Foo = A & B`).\n if (!ts.isTypeReferenceNode(aliasDecl.type)) return undefined;\n\n // Preserve alias identity only when the alias carries an inheritable\n // type-level annotation (local or inherited). Aliases that carry only\n // path-targeted constraints must collapse to the base so #364's $ref +\n // sibling composition still resolves against the base's $defs entry.\n if (!hasInheritableTypeAnnotation(aliasDecl, checker, extensionRegistry)) {\n return undefined;\n }\n\n return { aliasName, aliasDecl };\n}\n\n/**\n * Returns `true` when `aliasDecl` carries an inheritable type-level\n * annotation (currently only `@format`), either locally or reachable through\n * the alias / heritage chain. Used to decide whether a pass-through alias\n * warrants its own `$defs` entry (issue #374) or should collapse to the\n * base type (issue #364 sibling-keyword composition).\n */\nfunction hasInheritableTypeAnnotation(\n aliasDecl: ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined\n): boolean {\n const file = aliasDecl.getSourceFile().fileName;\n const local = extractJSDocAnnotationNodes(aliasDecl, file, makeParseOptions(extensionRegistry));\n for (const annotation of local) {\n if (!INHERITABLE_TYPE_ANNOTATION_KINDS.has(annotation.annotationKind)) continue;\n if (!isOverridingInheritableAnnotation(annotation)) continue;\n return true;\n }\n const inherited = collectInheritedTypeAnnotations(aliasDecl, local, checker, extensionRegistry);\n for (const annotation of inherited) {\n if (INHERITABLE_TYPE_ANNOTATION_KINDS.has(annotation.annotationKind)) return true;\n }\n return false;\n}\n\nfunction resolveObjectType(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n const collectedDiagnostics = diagnostics ?? [];\n const typeName = getNamedTypeName(type);\n const namedTypeName = typeName ?? undefined;\n const namedDecl = getNamedTypeDeclaration(type);\n\n // Issue #374: if the source node carries a \"pass-through\" type alias\n // (e.g. `type PositiveMonetaryAmount = MonetaryAmount`) that carries an\n // inheritable type-level annotation (e.g. `@format`) either locally or\n // via its alias chain, prefer the alias name and declaration as the\n // registry identity. This preserves alias identity in `$defs` and lets\n // annotation inheritance flow from the chain (see\n // `extractNamedTypeAnnotations`). Aliases with only path-targeted\n // constraints intentionally collapse to the base so issue #364's\n // $ref + sibling-keyword composition resolves against the base's\n // $defs entry.\n const passThroughAlias = getPassThroughTypeAliasFromSourceNode(\n sourceNode,\n checker,\n extensionRegistry,\n namedTypeName\n );\n const effectiveTypeName = passThroughAlias?.aliasName ?? namedTypeName;\n const effectiveNamedDecl = passThroughAlias?.aliasDecl ?? namedDecl;\n const referenceTypeArguments = extractReferenceTypeArguments(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n );\n const instantiatedTypeName =\n effectiveTypeName !== undefined && referenceTypeArguments.length > 0\n ? buildInstantiatedReferenceName(\n effectiveTypeName,\n referenceTypeArguments.map((argument) => argument.tsType),\n checker\n )\n : undefined;\n const registryTypeName = instantiatedTypeName ?? effectiveTypeName;\n const shouldRegisterNamedType =\n registryTypeName !== undefined &&\n !(registryTypeName === \"Record\" && effectiveNamedDecl?.getSourceFile().fileName !== file);\n const clearNamedTypeRegistration = (): void => {\n if (registryTypeName === undefined || !shouldRegisterNamedType) {\n return;\n }\n Reflect.deleteProperty(typeRegistry, registryTypeName);\n };\n\n if (visiting.has(type)) {\n // Recursive object expansion is deferred through the named-type registry.\n // Anonymous cycles still collapse to a closed empty object sentinel.\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n return { kind: \"object\", properties: [], additionalProperties: false };\n }\n\n // Seed the registry with a placeholder before traversing children so any\n // recursive property reference can resolve to a stable `$ref`.\n if (\n registryTypeName !== undefined &&\n shouldRegisterNamedType &&\n !typeRegistry[registryTypeName]\n ) {\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n type: RESOLVING_TYPE_PLACEHOLDER,\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n }\n\n visiting.add(type);\n\n // Detect previously resolved named types before walking the object body.\n if (\n registryTypeName !== undefined &&\n shouldRegisterNamedType &&\n typeRegistry[registryTypeName]?.type !== undefined\n ) {\n if (typeRegistry[registryTypeName].type !== RESOLVING_TYPE_PLACEHOLDER) {\n visiting.delete(type);\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n }\n\n // Detect pure dictionary types (Record<string, T> or { [k: string]: T })\n // after the recursion guard/placeholder setup so recursive records can point\n // back at the named type instead of collapsing to an empty object.\n const recordNode = isObjectType(type)\n ? tryResolveRecordType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n )\n : null;\n if (recordNode) {\n visiting.delete(type);\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n const isRecursiveRecord = typeNodeContainsReference(recordNode.valueType, registryTypeName);\n if (!isRecursiveRecord) {\n clearNamedTypeRegistration();\n return recordNode;\n }\n const annotations = effectiveNamedDecl\n ? extractNamedTypeAnnotations(effectiveNamedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n effectiveNamedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n registryTypeName,\n effectiveNamedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: effectiveNamedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n ...(metadata !== undefined && { metadata }),\n type: recordNode,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n return recordNode;\n }\n\n const properties: ObjectProperty[] = [];\n\n // Get FieldInfo-level analysis from named type declarations for constraint propagation\n const fieldInfoMap = getNamedTypeFieldNodeInfoMap(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n collectedDiagnostics,\n extensionRegistry\n );\n\n for (const prop of type.getProperties()) {\n const declaration = prop.valueDeclaration ?? prop.declarations?.[0];\n if (!declaration) continue;\n if (!shouldEmitResolvedObjectProperty(prop, declaration)) continue;\n\n const propType = checker.getTypeOfSymbolAtLocation(prop, declaration);\n const optional = !!(prop.flags & ts.SymbolFlags.Optional);\n const propTypeNode = resolveTypeNode(\n propType,\n checker,\n file,\n typeRegistry,\n visiting,\n declaration,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n );\n\n // Get constraints and annotations from the declaration if available\n const fieldNodeInfo = fieldInfoMap?.get(prop.name);\n const inlineFieldNodeInfo =\n fieldNodeInfo === undefined\n ? ts.isPropertySignature(declaration)\n ? analyzeInterfacePropertyToIR(\n declaration,\n checker,\n file,\n typeRegistry,\n visiting,\n collectedDiagnostics,\n type,\n metadataPolicy,\n extensionRegistry\n )\n : ts.isPropertyDeclaration(declaration)\n ? analyzeFieldToIR(\n declaration,\n checker,\n file,\n typeRegistry,\n visiting,\n collectedDiagnostics,\n type,\n metadataPolicy,\n extensionRegistry\n )\n : null\n : null;\n const resolvedFieldNodeInfo = fieldNodeInfo ?? inlineFieldNodeInfo;\n const resolvedPropertyType = inlineFieldNodeInfo?.type ?? propTypeNode;\n\n properties.push({\n name: prop.name,\n ...(resolvedFieldNodeInfo?.metadata !== undefined && {\n metadata: resolvedFieldNodeInfo.metadata,\n }),\n type: resolvedPropertyType,\n optional,\n constraints: resolvedFieldNodeInfo?.constraints ?? [],\n annotations: resolvedFieldNodeInfo?.annotations ?? [],\n provenance: resolvedFieldNodeInfo?.provenance ?? provenanceForFile(file),\n });\n }\n\n visiting.delete(type);\n\n const objectNode: TypeNode = {\n kind: \"object\",\n properties:\n effectiveNamedDecl !== undefined &&\n (ts.isClassDeclaration(effectiveNamedDecl) ||\n ts.isInterfaceDeclaration(effectiveNamedDecl) ||\n ts.isTypeAliasDeclaration(effectiveNamedDecl))\n ? applyDiscriminatorToObjectProperties(\n properties,\n effectiveNamedDecl,\n type,\n checker,\n file,\n collectedDiagnostics,\n metadataPolicy\n )\n : properties,\n additionalProperties: true,\n };\n\n // Register named types\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n const annotations = effectiveNamedDecl\n ? extractNamedTypeAnnotations(effectiveNamedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n effectiveNamedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n registryTypeName,\n effectiveNamedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: effectiveNamedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n ...(metadata !== undefined && { metadata }),\n type: objectNode,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n\n return objectNode;\n}\n\n// =============================================================================\n// NAMED TYPE FIELD INFO MAP — for nested constraint propagation\n// =============================================================================\n\ninterface FieldNodeInfo {\n readonly metadata?: ResolvedMetadata;\n readonly constraints: readonly ConstraintNode[];\n readonly annotations: readonly AnnotationNode[];\n readonly provenance: Provenance;\n}\n\n/**\n * Builds a map from property name to constraint/annotation info for named types.\n * This enables propagating TSDoc constraints from nested type declarations.\n */\nfunction getNamedTypeFieldNodeInfoMap(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy,\n diagnostics: ConstraintSemanticDiagnostic[],\n extensionRegistry?: ExtensionRegistry\n): Map<string, FieldNodeInfo> | null {\n const symbols = [type.getSymbol(), type.aliasSymbol].filter(\n (s): s is ts.Symbol => s?.declarations != null && s.declarations.length > 0\n );\n\n for (const symbol of symbols) {\n const declarations = symbol.declarations;\n if (!declarations) continue;\n\n // Try class declaration\n const classDecl = declarations.find(ts.isClassDeclaration);\n if (classDecl) {\n const map = new Map<string, FieldNodeInfo>();\n const hostType = checker.getTypeAtLocation(classDecl);\n for (const member of classDecl.members) {\n if (ts.isPropertyDeclaration(member) && ts.isIdentifier(member.name)) {\n const fieldNode = analyzeFieldToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n hostType,\n metadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n map.set(fieldNode.name, {\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n constraints: [...fieldNode.constraints],\n annotations: [...fieldNode.annotations],\n provenance: fieldNode.provenance,\n });\n }\n }\n }\n return map;\n }\n\n // Try interface declaration\n const interfaceDecl = declarations.find(ts.isInterfaceDeclaration);\n if (interfaceDecl) {\n return buildFieldNodeInfoMap(\n interfaceDecl.members,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n checker.getTypeAtLocation(interfaceDecl),\n diagnostics,\n extensionRegistry\n );\n }\n\n // Try type alias with type literal body\n const typeAliasDecl = declarations.find(ts.isTypeAliasDeclaration);\n const typeAliasMembers =\n typeAliasDecl === undefined ? null : getObjectLikeTypeAliasMembers(typeAliasDecl.type);\n if (typeAliasDecl && typeAliasMembers !== null) {\n return buildFieldNodeInfoMap(\n typeAliasMembers,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n checker.getTypeAtLocation(typeAliasDecl),\n diagnostics,\n extensionRegistry\n );\n }\n }\n\n return null;\n}\n\nfunction extractArrayElementTypeNode(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): ts.TypeNode | undefined {\n const typeNode = sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (typeNode === undefined) {\n return undefined;\n }\n const resolvedTypeNode = resolveAliasedTypeNode(typeNode, checker);\n if (ts.isArrayTypeNode(resolvedTypeNode)) {\n return resolvedTypeNode.elementType;\n }\n if (\n ts.isTypeReferenceNode(resolvedTypeNode) &&\n ts.isIdentifier(resolvedTypeNode.typeName) &&\n resolvedTypeNode.typeName.text === \"Array\" &&\n resolvedTypeNode.typeArguments?.[0]\n ) {\n return resolvedTypeNode.typeArguments[0];\n }\n return undefined;\n}\n\nfunction extractUnionMemberTypeNodes(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): readonly ts.TypeNode[] {\n const typeNode = sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (!typeNode) {\n return [];\n }\n const resolvedTypeNode = resolveAliasedTypeNode(typeNode, checker);\n return ts.isUnionTypeNode(resolvedTypeNode) ? [...resolvedTypeNode.types] : [];\n}\n\nfunction resolveAliasedTypeNode(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker,\n visited: Set<ts.TypeAliasDeclaration> = new Set<ts.TypeAliasDeclaration>()\n): ts.TypeNode {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return resolveAliasedTypeNode(typeNode.type, checker, visited);\n }\n\n if (!ts.isTypeReferenceNode(typeNode) || !ts.isIdentifier(typeNode.typeName)) {\n return typeNode;\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (aliasDecl === undefined || visited.has(aliasDecl)) {\n return typeNode;\n }\n\n visited.add(aliasDecl);\n return resolveAliasedTypeNode(aliasDecl.type, checker, visited);\n}\n\nfunction isNullishTypeNode(typeNode: ts.TypeNode): boolean {\n if (\n typeNode.kind === ts.SyntaxKind.NullKeyword ||\n typeNode.kind === ts.SyntaxKind.UndefinedKeyword\n ) {\n return true;\n }\n\n return (\n ts.isLiteralTypeNode(typeNode) &&\n (typeNode.literal.kind === ts.SyntaxKind.NullKeyword ||\n typeNode.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n );\n}\n\nfunction buildFieldNodeInfoMap(\n members: readonly ts.TypeElement[],\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy,\n hostType: ts.Type,\n diagnostics: ConstraintSemanticDiagnostic[],\n extensionRegistry?: ExtensionRegistry\n): Map<string, FieldNodeInfo> {\n const map = new Map<string, FieldNodeInfo>();\n for (const member of members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n hostType,\n metadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n map.set(fieldNode.name, {\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n constraints: [...fieldNode.constraints],\n annotations: [...fieldNode.annotations],\n provenance: fieldNode.provenance,\n });\n }\n }\n }\n return map;\n}\n\n// =============================================================================\n// TYPE ALIAS CONSTRAINT PROPAGATION\n// =============================================================================\n\n/** Maximum depth for transitive type alias constraint propagation. */\nconst MAX_ALIAS_CHAIN_DEPTH = 8;\n\n/**\n * Given a type node referencing a type alias, extracts IR ConstraintNodes\n * from the alias declaration's JSDoc tags.\n *\n * Follows alias chains transitively: if `type Percentage = Integer` and\n * `type Integer = number`, constraints from both `Percentage` and `Integer`\n * are collected. Constraints from closer aliases appear first in the result\n * (higher precedence). Recursion is capped at {@link MAX_ALIAS_CHAIN_DEPTH}\n * levels; exceeding the limit throws to surface pathological alias chains.\n */\nfunction extractTypeAliasConstraintNodes(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker,\n file: string,\n extensionRegistry?: ExtensionRegistry,\n depth = 0\n): ConstraintNode[] {\n if (!ts.isTypeReferenceNode(typeNode)) return [];\n\n if (depth >= MAX_ALIAS_CHAIN_DEPTH) {\n const aliasName = typeNode.typeName.getText();\n throw new Error(\n `Type alias chain exceeds maximum depth of ${String(MAX_ALIAS_CHAIN_DEPTH)} ` +\n `at alias \"${aliasName}\" in ${file}. ` +\n `Simplify the alias chain or check for circular references.`\n );\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (!aliasDecl) return [];\n\n // Don't extract from object type aliases\n if (ts.isTypeLiteralNode(aliasDecl.type)) return [];\n\n const aliasFieldType = resolveTypeNode(\n checker.getTypeAtLocation(aliasDecl.type),\n checker,\n file,\n {},\n new Set<ts.Type>(),\n aliasDecl.type,\n undefined,\n extensionRegistry\n );\n const constraints = extractJSDocConstraintNodes(\n aliasDecl,\n file,\n makeParseOptions(extensionRegistry, aliasFieldType)\n );\n\n // Transitively follow alias chains (e.g., Percentage → Integer → number)\n // Constraints from parent aliases are appended after the immediate alias's\n // constraints, giving the immediate alias higher precedence.\n constraints.push(\n ...extractTypeAliasConstraintNodes(aliasDecl.type, checker, file, extensionRegistry, depth + 1)\n );\n\n return constraints;\n}\n\n// =============================================================================\n// PROVENANCE HELPERS\n// =============================================================================\n\nfunction provenanceForNode(node: ts.Node, file: string): Provenance {\n const sourceFile = node.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n };\n}\n\nfunction provenanceForFile(file: string): Provenance {\n return { surface: \"tsdoc\", file, line: 0, column: 0 };\n}\n\nfunction provenanceForDeclaration(node: ts.Node | undefined, file: string): Provenance {\n if (!node) {\n return provenanceForFile(file);\n }\n return provenanceForNode(node, file);\n}\n\n// =============================================================================\n// NAMED TYPE HELPERS\n// =============================================================================\n\n/**\n * Extracts a stable type name from a ts.Type when it originates from\n * a named declaration (class, interface, or type alias).\n */\nfunction getNamedTypeName(type: ts.Type): string | null {\n const symbol = type.getSymbol();\n if (symbol?.declarations) {\n const decl = symbol.declarations[0];\n if (\n decl &&\n (ts.isClassDeclaration(decl) ||\n ts.isInterfaceDeclaration(decl) ||\n ts.isTypeAliasDeclaration(decl))\n ) {\n const name = ts.isClassDeclaration(decl) ? decl.name?.text : decl.name.text;\n if (name) return name;\n }\n }\n\n const aliasSymbol = type.aliasSymbol;\n if (aliasSymbol?.declarations) {\n const aliasDecl = aliasSymbol.declarations.find(ts.isTypeAliasDeclaration);\n if (aliasDecl) {\n return aliasDecl.name.text;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the declaration that defines a named type, if available.\n */\nfunction getNamedTypeDeclaration(\n type: ts.Type\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | undefined {\n const symbol = type.getSymbol();\n if (symbol?.declarations) {\n const decl = symbol.declarations[0];\n if (\n decl &&\n (ts.isClassDeclaration(decl) ||\n ts.isInterfaceDeclaration(decl) ||\n ts.isTypeAliasDeclaration(decl))\n ) {\n return decl;\n }\n }\n\n const aliasSymbol = type.aliasSymbol;\n if (aliasSymbol?.declarations) {\n return aliasSymbol.declarations.find(ts.isTypeAliasDeclaration);\n }\n\n return undefined;\n}\n\n// =============================================================================\n// SHARED OUTPUT TYPES\n// =============================================================================\n\n/**\n * Analyzed method information.\n */\nexport interface MethodInfo {\n /** Method name */\n name: string;\n /** Method parameters */\n parameters: ParameterInfo[];\n /** Return type node */\n returnTypeNode: ts.TypeNode | undefined;\n /** Resolved return type */\n returnType: ts.Type;\n}\n\n/**\n * Analyzed parameter information.\n */\nexport interface ParameterInfo {\n /** Parameter name */\n name: string;\n /** TypeScript type node */\n typeNode: ts.TypeNode | undefined;\n /** Resolved type */\n type: ts.Type;\n /** If this is InferSchema<typeof X>, the export name X */\n formSpecExportName: string | null;\n /** Whether the parameter is optional (has ? or default value) */\n optional: boolean;\n}\n\n// =============================================================================\n// SHARED HELPERS\n// =============================================================================\n\n/**\n * Analyzes a method declaration to extract method info.\n * Shared between IR and legacy paths.\n */\nfunction analyzeMethod(method: ts.MethodDeclaration, checker: ts.TypeChecker): MethodInfo | null {\n if (!ts.isIdentifier(method.name)) {\n return null;\n }\n\n const name = method.name.text;\n const parameters: ParameterInfo[] = [];\n\n for (const param of method.parameters) {\n if (ts.isIdentifier(param.name)) {\n const paramInfo = analyzeParameter(param, checker);\n parameters.push(paramInfo);\n }\n }\n\n const returnTypeNode = method.type;\n const signature = checker.getSignatureFromDeclaration(method);\n const returnType = signature\n ? checker.getReturnTypeOfSignature(signature)\n : checker.getTypeAtLocation(method);\n\n return { name, parameters, returnTypeNode, returnType };\n}\n\nfunction analyzeParameter(param: ts.ParameterDeclaration, checker: ts.TypeChecker): ParameterInfo {\n const name = ts.isIdentifier(param.name) ? param.name.text : \"param\";\n const typeNode = param.type;\n const type = checker.getTypeAtLocation(param);\n const formSpecExportName = detectFormSpecReference(typeNode);\n const optional = param.questionToken !== undefined || param.initializer !== undefined;\n\n return { name, typeNode, type, formSpecExportName, optional };\n}\n\nfunction detectFormSpecReference(typeNode: ts.TypeNode | undefined): string | null {\n if (!typeNode) return null;\n\n if (!ts.isTypeReferenceNode(typeNode)) return null;\n\n const typeName = ts.isIdentifier(typeNode.typeName)\n ? typeNode.typeName.text\n : ts.isQualifiedName(typeNode.typeName)\n ? typeNode.typeName.right.text\n : null;\n\n if (typeName !== \"InferSchema\" && typeName !== \"InferFormSchema\") return null;\n\n const typeArg = typeNode.typeArguments?.[0];\n if (!typeArg || !ts.isTypeQueryNode(typeArg)) return null;\n\n if (ts.isIdentifier(typeArg.exprName)) {\n return typeArg.exprName.text;\n }\n\n if (ts.isQualifiedName(typeArg.exprName)) {\n return typeArg.exprName.right.text;\n }\n\n return null;\n}\n","/**\n * JSDoc constraint and annotation extractor.\n *\n * Extracts constraints and annotation tags from JSDoc comments on\n * class/interface fields and returns canonical IR nodes directly:\n * - {@link ConstraintNode} for set-influencing tags (@minimum, @pattern, etc.)\n * - {@link AnnotationNode} for value-influencing tags (@displayName, etc.)\n *\n * The IR extraction path uses the official `@microsoft/tsdoc` parser for\n * all canonical tags.\n *\n * Supported constraints correspond to the built-in FormSpec constraint tags\n * (e.g., `@minimum`, `@maximum`, `@pattern`).\n */\n\nimport * as ts from \"typescript\";\nimport type { ConstraintNode, AnnotationNode, JsonValue } from \"@formspec/core/internals\";\nimport {\n parseTSDocTags,\n hasDeprecatedTagTSDoc,\n type ParseTSDocOptions,\n type TSDocParseResult,\n} from \"./tsdoc-parser.js\";\n\n// =============================================================================\n// IR API — uses @microsoft/tsdoc for structured parsing\n// =============================================================================\n\nexport function extractJSDocParseResult(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): TSDocParseResult {\n return parseTSDocTags(node, file, options);\n}\n\n/**\n * Extracts constraints from JSDoc comments on a TypeScript AST node and returns\n * canonical {@link ConstraintNode} objects.\n *\n * Uses the official `@microsoft/tsdoc` parser for structured tag extraction.\n * Constraints are registered as custom block tags in the TSDoc configuration.\n *\n * @param node - The AST node to inspect for JSDoc tags\n * @param file - Absolute path to the source file for provenance\n * @returns Canonical constraint nodes for each valid constraint tag\n */\nexport function extractJSDocConstraintNodes(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): ConstraintNode[] {\n const result = extractJSDocParseResult(node, file, options);\n return [...result.constraints];\n}\n\n/**\n * Extracts canonical annotation tags from a node and returns\n * {@link AnnotationNode} objects.\n *\n * @param node - The AST node to inspect for annotation tags\n * @param file - Absolute path to the source file for provenance\n * @returns Canonical annotation nodes\n */\nexport function extractJSDocAnnotationNodes(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): AnnotationNode[] {\n const result = extractJSDocParseResult(node, file, options);\n return [...result.annotations];\n}\n\n/**\n * Checks if a node has a TSDoc `@deprecated` tag.\n *\n * Uses the TSDoc parser for structured detection.\n */\nexport function hasDeprecatedTag(node: ts.Node): boolean {\n return hasDeprecatedTagTSDoc(node);\n}\n\n/**\n * Extracts a default value from a property initializer and returns a\n * {@link DefaultValueAnnotationNode} if present.\n *\n * Only extracts literal values (strings, numbers, booleans, null).\n */\nexport function extractDefaultValueAnnotation(\n initializer: ts.Expression | undefined,\n file = \"\"\n): AnnotationNode | null {\n if (!initializer) return null;\n\n let value: JsonValue | undefined;\n\n if (ts.isStringLiteral(initializer)) {\n value = initializer.text;\n } else if (ts.isNumericLiteral(initializer)) {\n value = Number(initializer.text);\n } else if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n value = true;\n } else if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n value = false;\n } else if (initializer.kind === ts.SyntaxKind.NullKeyword) {\n value = null;\n } else if (ts.isPrefixUnaryExpression(initializer)) {\n if (\n initializer.operator === ts.SyntaxKind.MinusToken &&\n ts.isNumericLiteral(initializer.operand)\n ) {\n value = -Number(initializer.operand.text);\n }\n }\n\n if (value === undefined) return null;\n\n const sourceFile = initializer.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(initializer.getStart());\n\n return {\n kind: \"annotation\",\n annotationKind: \"defaultValue\",\n value,\n provenance: {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n },\n };\n}\n","/**\n * TSDoc-based structured tag parser.\n *\n * Bridges the TypeScript compiler AST with the official `@microsoft/tsdoc`\n * parser to extract constraint and annotation tags from JSDoc comments\n * on class/interface/type-alias properties.\n *\n * The parser recognises two categories of tags:\n *\n * 1. **Constraint tags** (all alphanumeric, TSDoc-compliant):\n * `@minimum`, `@maximum`, `@exclusiveMinimum`, `@exclusiveMaximum`,\n * `@multipleOf`, `@minLength`, `@maxLength`, `@minItems`, `@maxItems`,\n * `@uniqueItems`, `@pattern`, `@enumOptions`, `@const`\n * — Parsed via TSDocParser as custom block tags.\n * Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).\n *\n * 2. **Metadata and annotation tags** (`@apiName`, `@displayName`,\n * `@format`, `@placeholder`):\n * These are parsed as structured custom block tags so summary extraction\n * stops at recognized FormSpec tags. `@displayName`, `@format`, and\n * `@placeholder` also map onto annotation IR nodes, while `@apiName`\n * remains metadata-only and is resolved separately by the class analyzer.\n *\n * The `@deprecated` tag is a standard TSDoc block tag, parsed structurally.\n *\n * Description and remarks extraction (spec 002 §2.3):\n * - Summary text (bare text before the first block tag) → `description` annotation\n * - `@remarks` block → `remarks` annotation (separate channel)\n * - `@description` is NOT supported (not a standard TSDoc tag)\n *\n * **Fallback strategy**: TSDoc treats `{` / `}` as inline tag delimiters and\n * `@` as a tag prefix, so content containing these characters (e.g. JSON\n * objects in `@EnumOptions`, regex patterns with `@` in `@Pattern`) gets\n * mangled by the TSDoc parser. The shared comment syntax parser is the\n * primary source for these payloads; the TS compiler's `ts.getJSDocTags()`\n * API remains as a fallback when a raw payload cannot be recovered from the\n * shared parse.\n */\n\nimport * as ts from \"typescript\";\nimport {\n checkSyntheticTagApplication,\n choosePreferredPayloadText,\n extractPathTarget as extractSharedPathTarget,\n getTagDefinition,\n hasTypeSemanticCapability,\n normalizeFormSpecTagName,\n stripNullishUnion,\n parseConstraintTagValue,\n parseDefaultValueTagValue,\n parseTagSyntax,\n parseUnifiedComment,\n resolveDeclarationPlacement,\n resolvePathTargetType,\n TAGS_REQUIRING_RAW_TEXT,\n type ConstraintSemanticDiagnostic,\n type FormSpecValueKind,\n type ParsedCommentTag,\n type SemanticCapability,\n} from \"@formspec/analysis/internal\";\nimport {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n isBuiltinConstraintName,\n} from \"@formspec/core/internals\";\nimport {\n type ConstraintNode,\n type AnnotationNode,\n type Provenance,\n type PathTarget,\n type TypeNode,\n} from \"@formspec/core/internals\";\nimport { noopLogger } from \"@formspec/core\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport {\n customTypeIdFromLookup,\n resolveCustomTypeFromTsType,\n} from \"../extensions/resolve-custom-type.js\";\nimport { _isIntegerBrandedType } from \"./builtin-brands.js\";\nimport {\n _emitSetupDiagnostics,\n _mapSetupDiagnosticCode,\n getBuildLogger,\n getBroadeningLogger,\n getSyntheticLogger,\n getTypedParserLogger,\n extractEffectiveArgumentText,\n mapTypedParserDiagnosticCode,\n parseTagArgument,\n describeTypeKind,\n elapsedMicros,\n nowMicros,\n logTagApplication,\n type ConstraintValidatorRoleOutcome,\n} from \"@formspec/analysis/internal\";\n\nfunction sharedTagValueOptions(options?: ParseTSDocOptions) {\n return {\n ...(options?.extensionRegistry !== undefined ? { registry: options.extensionRegistry } : {}),\n ...(options?.fieldType !== undefined ? { fieldType: options.fieldType } : {}),\n };\n}\n\nconst SYNTHETIC_TYPE_FORMAT_FLAGS =\n ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope;\n\nfunction getExtensionTypeNames(registry: ExtensionRegistry | undefined): ReadonlySet<string> {\n if (registry === undefined) {\n return new Set();\n }\n return new Set(\n registry.extensions.flatMap((ext) =>\n (ext.types ?? []).flatMap((t) => t.tsTypeNames ?? [t.typeName])\n )\n );\n}\n\nfunction collectImportedNames(sourceFile: ts.SourceFile): ReadonlySet<string> {\n const importedNames = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (ts.isImportDeclaration(statement) && statement.importClause !== undefined) {\n const clause = statement.importClause;\n if (clause.name !== undefined) {\n importedNames.add(clause.name.text);\n }\n if (clause.namedBindings !== undefined) {\n if (ts.isNamedImports(clause.namedBindings)) {\n for (const specifier of clause.namedBindings.elements) {\n importedNames.add(specifier.name.text);\n }\n } else if (ts.isNamespaceImport(clause.namedBindings)) {\n importedNames.add(clause.namedBindings.name.text);\n }\n }\n continue;\n }\n\n if (ts.isImportEqualsDeclaration(statement)) {\n importedNames.add(statement.name.text);\n }\n }\n\n return importedNames;\n}\n\nfunction isNonReferenceIdentifier(node: ts.Identifier): boolean {\n const parent = node.parent;\n\n if (\n (ts.isBindingElement(parent) ||\n ts.isClassDeclaration(parent) ||\n ts.isEnumDeclaration(parent) ||\n ts.isEnumMember(parent) ||\n ts.isFunctionDeclaration(parent) ||\n ts.isFunctionExpression(parent) ||\n ts.isImportClause(parent) ||\n ts.isImportEqualsDeclaration(parent) ||\n ts.isImportSpecifier(parent) ||\n ts.isInterfaceDeclaration(parent) ||\n ts.isMethodDeclaration(parent) ||\n ts.isMethodSignature(parent) ||\n ts.isModuleDeclaration(parent) ||\n ts.isNamespaceExport(parent) ||\n ts.isNamespaceImport(parent) ||\n ts.isParameter(parent) ||\n ts.isPropertyDeclaration(parent) ||\n ts.isPropertySignature(parent) ||\n ts.isSetAccessorDeclaration(parent) ||\n ts.isGetAccessorDeclaration(parent) ||\n ts.isTypeAliasDeclaration(parent) ||\n ts.isTypeParameterDeclaration(parent) ||\n ts.isVariableDeclaration(parent)) &&\n parent.name === node\n ) {\n return true;\n }\n\n if (\n (ts.isPropertyAssignment(parent) || ts.isPropertyAccessExpression(parent)) &&\n parent.name === node\n ) {\n return true;\n }\n\n if (ts.isQualifiedName(parent) && parent.right === node) {\n return true;\n }\n\n return false;\n}\n\nfunction astReferencesImportedName(root: ts.Node, importedNames: ReadonlySet<string>): boolean {\n if (importedNames.size === 0) {\n return false;\n }\n\n let found = false;\n\n const visit = (node: ts.Node): void => {\n if (found) return;\n\n if (ts.isIdentifier(node) && importedNames.has(node.text) && !isNonReferenceIdentifier(node)) {\n found = true;\n return;\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(root);\n return found;\n}\n\n/**\n * Returns the member list for declarations that have object-like members:\n * interface declarations and type alias declarations with a type-literal body.\n * Returns `undefined` for all other node shapes.\n */\nfunction getObjectMembers(\n statement: ts.InterfaceDeclaration | ts.TypeAliasDeclaration\n): ts.NodeArray<ts.TypeElement> | undefined {\n if (ts.isInterfaceDeclaration(statement)) {\n return statement.members;\n }\n if (ts.isTypeLiteralNode(statement.type)) {\n return statement.type.members;\n }\n return undefined;\n}\n\n/**\n * Rewrites a declaration so that members whose type annotations reference an\n * imported name have their type replaced with `unknown`. This preserves the\n * declaration in the synthetic program so the checker can resolve sibling\n * members that use non-imported types.\n *\n * Handles both interface declarations and type alias declarations whose body\n * is a type literal (e.g. `type Foo = { bar: ImportedType; baz: string }`).\n *\n * Without this, an interface like `{ year: Integer; vin: string }` where\n * `Integer` is imported would be entirely excluded from supporting\n * declarations, preventing the synthetic checker from knowing that `vin` is\n * a string — causing spurious TYPE_MISMATCH errors on constraint tags like\n * `@minLength`.\n */\nfunction rewriteImportedMemberTypes(\n statement: ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n importedNames: ReadonlySet<string>\n): string | null {\n const members = getObjectMembers(statement);\n if (members === undefined) {\n return null;\n }\n\n const replacements: { start: number; end: number }[] = [];\n\n for (const member of members) {\n // Only property signatures have rewritable type annotations. If a\n // non-property member (method signature, index signature, etc.)\n // references an imported name, we can't safely rewrite it — return\n // null to fall back to excluding the whole declaration.\n if (!ts.isPropertySignature(member)) {\n if (astReferencesImportedName(member, importedNames)) {\n return null;\n }\n continue;\n }\n\n const typeAnnotation = member.type;\n if (typeAnnotation === undefined) continue;\n\n if (astReferencesImportedName(typeAnnotation, importedNames)) {\n replacements.push({\n start: typeAnnotation.getStart(sourceFile),\n end: typeAnnotation.getEnd(),\n });\n }\n }\n\n if (replacements.length === 0) {\n return statement.getText(sourceFile);\n }\n\n // Apply replacements in reverse order to preserve offsets.\n // getText(sourceFile) and getStart(sourceFile) use the same base, so\n // subtracting stmtStart from absolute positions yields correct offsets.\n const stmtStart = statement.getStart(sourceFile);\n let result = statement.getText(sourceFile);\n for (const { start, end } of [...replacements].reverse()) {\n result = result.slice(0, start - stmtStart) + \"unknown\" + result.slice(end - stmtStart);\n }\n return result;\n}\n\nfunction buildSupportingDeclarations(\n sourceFile: ts.SourceFile,\n extensionTypeNames: ReadonlySet<string>\n): readonly string[] {\n const importedNames = collectImportedNames(sourceFile);\n\n // Filter out extension-registered type names: the synthetic program provides\n // type aliases for these, so declarations referencing them are safe to include.\n const importedNamesToSkip = new Set(\n [...importedNames].filter((name) => !extensionTypeNames.has(name))\n );\n\n const result: string[] = [];\n\n for (const statement of sourceFile.statements) {\n // Always exclude imports and re-exports\n if (ts.isImportDeclaration(statement)) continue;\n if (ts.isImportEqualsDeclaration(statement)) continue;\n if (ts.isExportDeclaration(statement) && statement.moduleSpecifier !== undefined) continue;\n\n if (!astReferencesImportedName(statement, importedNamesToSkip)) {\n result.push(statement.getText(sourceFile));\n continue;\n }\n\n // For interface and type-literal-bodied type alias declarations that\n // reference imports, rewrite imported member types to `unknown` instead\n // of dropping the whole declaration. Returns null when a non-property\n // member references an import (method/index signatures), in which case\n // we fall back to excluding the whole declaration.\n if (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) {\n const rewritten = rewriteImportedMemberTypes(statement, sourceFile, importedNamesToSkip);\n if (rewritten !== null) {\n result.push(rewritten);\n }\n }\n }\n\n return result;\n}\n\nfunction pushUniqueCompilerDiagnostics(\n target: ConstraintSemanticDiagnostic[],\n additions: readonly ConstraintSemanticDiagnostic[]\n): void {\n for (const diagnostic of additions) {\n if (\n (diagnostic.code === \"UNSUPPORTED_CUSTOM_TYPE_OVERRIDE\" ||\n diagnostic.code === \"SYNTHETIC_SETUP_FAILURE\") &&\n target.some(\n (existing) => existing.code === diagnostic.code && existing.message === diagnostic.message\n )\n ) {\n continue;\n }\n target.push(diagnostic);\n }\n}\n\n/**\n * Runs the full constraint tag processing pipeline for a single tag: compiler\n * diagnostics check → constraint value parse → push to output arrays.\n *\n * If compiler diagnostics are found the constraint is skipped and diagnostics\n * are accumulated instead. Returns without mutating outputs if the tag produces\n * no usable constraint node.\n */\nfunction processConstraintTag(\n tagName: string,\n text: string,\n parsedTag: ParsedCommentTag | null,\n provenance: Provenance,\n node: ts.Node,\n sourceFile: ts.SourceFile,\n supportingDeclarations: readonly string[],\n options: ParseTSDocOptions | undefined,\n constraints: ConstraintNode[],\n diagnostics: ConstraintSemanticDiagnostic[]\n): void {\n const compilerDiagnostics = buildCompilerBackedConstraintDiagnostics(\n node,\n sourceFile,\n tagName,\n parsedTag,\n text,\n provenance,\n supportingDeclarations,\n options\n );\n if (compilerDiagnostics.length > 0) {\n pushUniqueCompilerDiagnostics(diagnostics, compilerDiagnostics);\n return;\n }\n const constraintNode = parseConstraintTagValue(\n tagName,\n text,\n provenance,\n sharedTagValueOptions(options)\n );\n if (constraintNode) {\n constraints.push(constraintNode);\n }\n}\n\nfunction renderSyntheticArgumentExpression(\n valueKind: FormSpecValueKind | null,\n argumentText: string\n): string | null {\n const trimmed = argumentText.trim();\n if (trimmed === \"\") {\n return null;\n }\n\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n // Pass Infinity, -Infinity, and NaN through as TS identifiers (not quoted\n // strings). The typed parser (Phase 2) accepts these values; the snapshot\n // path has always passed them through as identifiers. Aligning the build\n // path with the snapshot path normalises the §3 Infinity/NaN divergence.\n if (trimmed === \"Infinity\" || trimmed === \"-Infinity\" || trimmed === \"NaN\") {\n return trimmed;\n }\n return Number.isFinite(Number(trimmed)) ? trimmed : JSON.stringify(trimmed);\n case \"string\":\n return JSON.stringify(argumentText);\n case \"json\":\n try {\n JSON.parse(trimmed);\n return `(${trimmed})`;\n } catch {\n return JSON.stringify(trimmed);\n }\n case \"boolean\":\n return trimmed === \"true\" || trimmed === \"false\" ? trimmed : JSON.stringify(trimmed);\n case \"condition\":\n return \"undefined as unknown as FormSpecCondition\";\n case null:\n return null;\n default: {\n return String(valueKind);\n }\n }\n}\n\nfunction getArrayElementType(type: ts.Type, checker: ts.TypeChecker): ts.Type | null {\n if (!checker.isArrayType(type)) {\n return null;\n }\n\n return checker.getTypeArguments(type as ts.TypeReference)[0] ?? null;\n}\n\nfunction supportsConstraintCapability(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability | undefined\n): boolean {\n if (capability === undefined) {\n return true;\n }\n\n if (hasTypeSemanticCapability(type, checker, capability)) {\n return true;\n }\n\n if (capability === \"string-like\") {\n const itemType = getArrayElementType(type, checker);\n return itemType !== null && hasTypeSemanticCapability(itemType, checker, capability);\n }\n\n return false;\n}\n\nconst MAX_HINT_CANDIDATES = 5;\nconst MAX_HINT_DEPTH = 3;\n\nfunction stripHintNullishUnion(type: ts.Type): ts.Type {\n if (!type.isUnion()) {\n return type;\n }\n const nonNullish = type.types.filter(\n (member) => (member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0\n );\n if (nonNullish.length === 1 && nonNullish[0] !== undefined) {\n return nonNullish[0];\n }\n return type;\n}\n\nfunction isCallableType(type: ts.Type): boolean {\n return type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n}\n\nfunction isUserEmittableHintProperty(property: ts.Symbol, declaration: ts.Declaration): boolean {\n if (property.name.startsWith(\"__\")) {\n return false;\n }\n if (\"name\" in declaration && declaration.name !== undefined) {\n const name = declaration.name as ts.PropertyName;\n if (ts.isComputedPropertyName(name) || ts.isPrivateIdentifier(name)) {\n return false;\n }\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name) && !ts.isNumericLiteral(name)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Collects user-declared subfields whose type satisfies the constraint\n * `capability`. Only descends into object-like types — never traverses into\n * primitives' intrinsic properties (e.g. would not surface `string.length`\n * on a `string` subfield), into function/call-signature types (which would\n * surface `Function.prototype` members like `length`, `name`, `apply`), or\n * through synthetic property names like `__brand` / computed / private ones.\n * Nullish unions are stripped so `Foo | null` can still surface candidates\n * declared on `Foo`. Terminal matches use `supportsConstraintCapability` so\n * the hint aligns with the capability rules used by the TYPE_MISMATCH\n * diagnostic (for example, `string[]` satisfies `string-like`).\n */\nfunction collectObjectSubfieldCandidates(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability\n): readonly string[] {\n const out: string[] = [];\n const visit = (current: ts.Type, prefix: readonly string[], depth: number): void => {\n if (depth > MAX_HINT_DEPTH) {\n return;\n }\n const stripped = stripHintNullishUnion(current);\n if (isCallableType(stripped)) {\n return;\n }\n if (!hasTypeSemanticCapability(stripped, checker, \"object-like\")) {\n return;\n }\n for (const property of stripped.getProperties()) {\n const declaration = property.valueDeclaration ?? property.declarations?.[0];\n if (declaration === undefined) {\n continue;\n }\n if (!isUserEmittableHintProperty(property, declaration)) {\n continue;\n }\n const propertyType = checker.getTypeOfSymbolAtLocation(property, declaration);\n const path = [...prefix, property.name];\n if (supportsConstraintCapability(propertyType, checker, capability)) {\n out.push(path.join(\".\"));\n continue;\n }\n const strippedPropertyType = stripHintNullishUnion(propertyType);\n if (\n !isCallableType(strippedPropertyType) &&\n hasTypeSemanticCapability(strippedPropertyType, checker, \"object-like\")\n ) {\n visit(strippedPropertyType, path, depth + 1);\n }\n }\n };\n visit(type, [], 0);\n return out;\n}\n\nfunction buildPathTargetHint(\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability,\n tagName: string,\n argumentText: string | undefined\n): string | null {\n // Only suggest path targeting when the subject is itself an object — for\n // primitive mismatches (e.g. `@minimum` on a `string`), the user almost\n // certainly meant a different constraint, not a path target.\n if (!hasTypeSemanticCapability(subjectType, checker, \"object-like\")) {\n return null;\n }\n\n const candidates = collectObjectSubfieldCandidates(subjectType, checker, capability);\n const primary = candidates[0];\n if (primary === undefined) {\n return null;\n }\n\n const argText = argumentText?.trim() ?? \"\";\n const renderExample = (path: string): string =>\n argText === \"\" ? `@${tagName} :${path}` : `@${tagName} :${path} ${argText}`;\n\n if (candidates.length === 1) {\n return `Hint: use a path target to constrain a subfield, e.g. ${renderExample(primary)}`;\n }\n\n const shown = candidates.slice(0, MAX_HINT_CANDIDATES);\n const overflow = candidates.length > MAX_HINT_CANDIDATES ? \", …\" : \"\";\n return `Hint: use a path target to constrain a subfield (candidates: ${shown.join(\", \")}${overflow}), e.g. ${renderExample(primary)}`;\n}\n\nfunction makeDiagnostic(\n code: string,\n message: string,\n provenance: Provenance\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation: provenance,\n relatedLocations: [],\n };\n}\n\nfunction placementLabel(\n placement: NonNullable<ReturnType<typeof resolveDeclarationPlacement>>\n): string {\n switch (placement) {\n case \"class\":\n return \"class declarations\";\n case \"class-field\":\n return \"class fields\";\n case \"class-method\":\n return \"class methods\";\n case \"interface\":\n return \"interface declarations\";\n case \"interface-field\":\n return \"interface fields\";\n case \"type-alias\":\n return \"type aliases\";\n case \"type-alias-field\":\n return \"type-alias properties\";\n case \"variable\":\n return \"variables\";\n case \"function\":\n return \"functions\";\n case \"function-parameter\":\n return \"function parameters\";\n case \"method-parameter\":\n return \"method parameters\";\n default: {\n const exhaustive: never = placement;\n return String(exhaustive);\n }\n }\n}\n\nfunction capabilityLabel(capability: string | undefined): string {\n switch (capability) {\n case \"numeric-comparable\":\n return \"number\";\n case \"string-like\":\n return \"string\";\n case \"array-like\":\n return \"array\";\n case \"enum-member-addressable\":\n return \"enum\";\n case \"json-like\":\n return \"JSON-compatible\";\n case \"object-like\":\n return \"object\";\n case \"condition-like\":\n return \"conditional\";\n case undefined:\n return \"compatible\";\n default:\n return capability;\n }\n}\n\nfunction getBroadenedCustomTypeId(fieldType: TypeNode | undefined): string | undefined {\n if (fieldType?.kind === \"custom\") {\n return fieldType.typeId;\n }\n\n if (fieldType?.kind !== \"union\") {\n return undefined;\n }\n\n const customMembers = fieldType.members.filter(\n (member): member is Extract<TypeNode, { kind: \"custom\" }> => member.kind === \"custom\"\n );\n if (customMembers.length !== 1) {\n return undefined;\n }\n\n const nonCustomMembers = fieldType.members.filter((member) => member.kind !== \"custom\");\n const allOtherMembersAreNull = nonCustomMembers.every(\n (member) => member.kind === \"primitive\" && member.primitiveKind === \"null\"\n );\n const customMember = customMembers[0];\n return allOtherMembersAreNull && customMember !== undefined ? customMember.typeId : undefined;\n}\n\nfunction hasBuiltinConstraintBroadening(tagName: string, options?: ParseTSDocOptions): boolean {\n const broadenedTypeId = getBroadenedCustomTypeId(options?.fieldType);\n return (\n broadenedTypeId !== undefined &&\n options?.extensionRegistry?.findBuiltinConstraintBroadening(broadenedTypeId, tagName) !==\n undefined\n );\n}\n\nfunction buildCompilerBackedConstraintDiagnostics(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n tagName: string,\n parsedTag: ParsedCommentTag | null,\n rawText: string,\n provenance: Provenance,\n supportingDeclarations: readonly string[],\n options?: ParseTSDocOptions\n): readonly ConstraintSemanticDiagnostic[] {\n if (!isBuiltinConstraintName(tagName)) {\n return [];\n }\n\n const checker = options?.checker;\n const subjectType = options?.subjectType;\n if (checker === undefined || subjectType === undefined) {\n return [];\n }\n\n const placement = resolveDeclarationPlacement(node);\n if (placement === null) {\n return [];\n }\n\n const definition = getTagDefinition(tagName, options?.extensionRegistry?.extensions);\n if (definition === null) {\n return [];\n }\n\n // §8.3b — gather structured-log context only when logging is enabled.\n // `placement` is narrowed to non-null above; capture it in a typed constant\n // so TypeScript can see the narrowed type inside the `emit` closure below.\n const nonNullPlacement: NonNullable<ReturnType<typeof resolveDeclarationPlacement>> = placement;\n const log = getBuildLogger();\n const broadeningLog = getBroadeningLogger();\n const syntheticLog = getSyntheticLogger();\n const typedParserLog = getTypedParserLogger();\n const logsEnabled = log !== noopLogger || broadeningLog !== noopLogger;\n const syntheticTraceEnabled = syntheticLog !== noopLogger;\n const typedParserTraceEnabled = typedParserLog !== noopLogger;\n const logStart = logsEnabled ? nowMicros() : 0;\n const subjectTypeKind = logsEnabled ? describeTypeKind(subjectType, checker) : \"\";\n\n /**\n * Emits the §8.3b structured log entry and returns the supplied diagnostic\n * array unchanged. All early returns in this function go through this helper.\n *\n * Broadening-bypass outcomes are additionally emitted on the `:broadening`\n * sub-namespace so they are separately filterable.\n */\n function emit(\n outcome: ConstraintValidatorRoleOutcome,\n result: readonly ConstraintSemanticDiagnostic[]\n ): readonly ConstraintSemanticDiagnostic[] {\n if (!logsEnabled) {\n return result;\n }\n const entry = {\n consumer: \"build\" as const,\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind,\n roleOutcome: outcome,\n elapsedMicros: elapsedMicros(logStart),\n };\n logTagApplication(log, entry);\n if (outcome === \"bypass\" || outcome === \"D1\" || outcome === \"D2\") {\n logTagApplication(broadeningLog, entry);\n }\n return result;\n }\n\n if (!definition.placements.includes(placement)) {\n return emit(\"A-reject\", [\n makeDiagnostic(\n \"INVALID_TAG_PLACEMENT\",\n `Tag \"@${tagName}\" is not allowed on ${placementLabel(placement)}.`,\n provenance\n ),\n ]);\n }\n\n const target = parsedTag?.target ?? null;\n\n // Resolve the type the capability check should run against: the path-target\n // destination for `:foo` constraints, otherwise the field's own type.\n let evaluatedType: ts.Type = subjectType;\n let targetLabel = node.getText(sourceFile);\n if (target !== null) {\n if (target.kind !== \"path\") {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNSUPPORTED_TARGETING_SYNTAX\",\n `Tag \"@${tagName}\" does not support ${target.kind} targeting syntax.`,\n provenance\n ),\n ]);\n }\n\n if (!target.valid || target.path === null) {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNSUPPORTED_TARGETING_SYNTAX\",\n `Tag \"@${tagName}\" has invalid path targeting syntax.`,\n provenance\n ),\n ]);\n }\n\n const resolution = resolvePathTargetType(subjectType, checker, target.path.segments);\n if (resolution.kind === \"missing-property\") {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNKNOWN_PATH_TARGET\",\n `Target \"${target.rawText}\": path-targeted constraint \"${tagName}\" references unknown path segment \"${resolution.segment}\"`,\n provenance\n ),\n ]);\n }\n\n if (resolution.kind === \"unresolvable\") {\n const actualType = checker.typeToString(resolution.type, node, SYNTHETIC_TYPE_FORMAT_FLAGS);\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"TYPE_MISMATCH\",\n `Target \"${target.rawText}\": path-targeted constraint \"${tagName}\" is invalid because type \"${actualType}\" cannot be traversed`,\n provenance\n ),\n ]);\n }\n\n evaluatedType = resolution.type;\n targetLabel = target.rawText;\n }\n\n // Unified broadening check:\n // - Direct field (`target === null`): uses the IR-layer `FieldType`\n // carried on `options.fieldType`. This is the pre-existing path.\n // - Path target (`target !== null`): no IR is available for the\n // path-resolved sub-type, so resolve the custom type from the raw\n // `ts.Type` via the shared extension-registry resolver and look up\n // broadening by `(customTypeId, tagName)`.\n //\n // Both variants answer the same question — \"is `tagName` broadened onto\n // the type we're about to validate?\" — and short-circuit the capability\n // check below in favour of the IR-layer validator which understands\n // extension-defined constraint semantics.\n const hasBroadening = ((): boolean => {\n if (target === null) {\n if (\n _isIntegerBrandedType(stripNullishUnion(subjectType)) &&\n definition.capabilities.includes(\"numeric-comparable\")\n ) {\n return true;\n }\n return hasBuiltinConstraintBroadening(tagName, options);\n }\n const registry = options?.extensionRegistry;\n if (registry === undefined) return false;\n const resolved = resolveCustomTypeFromTsType(evaluatedType, checker, registry);\n return (\n resolved !== null &&\n registry.findBuiltinConstraintBroadening(customTypeIdFromLookup(resolved), tagName) !==\n undefined\n );\n })();\n\n if (!hasBroadening) {\n const requiredCapability = definition.capabilities[0];\n if (\n requiredCapability !== undefined &&\n !supportsConstraintCapability(evaluatedType, checker, requiredCapability)\n ) {\n const actualType = checker.typeToString(evaluatedType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);\n const baseMessage = `Target \"${targetLabel}\": constraint \"${tagName}\" is only valid on ${capabilityLabel(requiredCapability)} targets, but field type is \"${actualType}\"`;\n // Path-target hints only apply to direct-field mismatches — the hint\n // suggests \"did you mean a sub-path?\" which is nonsensical when the\n // user is already path-targeting.\n const hint =\n target === null\n ? buildPathTargetHint(\n subjectType,\n checker,\n requiredCapability,\n tagName,\n parsedTag?.argumentText\n )\n : null;\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"TYPE_MISMATCH\",\n hint === null ? baseMessage : `${baseMessage}. ${hint}`,\n provenance\n ),\n ]);\n }\n }\n\n // §4 Phase 2 — Role C: validate argument literal via the typed parser BEFORE\n // the synthetic-checker call. The typed parser is the new gatekeeper for\n // argument-shape validity (is `10.5` a valid `@minLength` arg? is `[]` a valid\n // `@enumOptions` arg?). Roles A/B/D1/D2 remain the synthetic checker's\n // responsibility until Phase 4.\n //\n // IMPORTANT: the typed-parser call is guarded by `if (!hasBroadening)` so that\n // broadened fields (D1/D2) bypass Role C entirely. Without this guard a broadened\n // field whose argument the typed parser would reject (e.g. a non-JSON @enumOptions\n // arg on a Decimal path-target) would spuriously emit INVALID_TAG_ARGUMENT instead\n // of being silently bypassed as Role D1/D2 requires.\n //\n // Behaviour (non-broadened path):\n // - ok: false → emit C-reject with the typed parser's code + message; skip synthetic.\n // - ok: true (including raw-string-fallback for @const) → proceed to synthetic.\n // The raw-string-fallback is a successful parse; the downstream IR compatibility\n // check (semantic-targets.ts:~1255-1298) owns the final decision for @const.\n if (hasBroadening) {\n return emit(\"bypass\", []);\n }\n\n // §4 Phase 4B — use shared extractEffectiveArgumentText so both consumers\n // derive argument text identically. Extracts the argument from rawText (the\n // canonical post-choosePreferredPayloadText string), which for\n // TAGS_REQUIRING_RAW_TEXT may have been selected via the compiler-API\n // fallback. Re-parsing from rawText applies path-target prefix stripping and\n // canonicalisation consistently with the snapshot consumer.\n // Computed after the bypass check so broadened fields skip this work entirely.\n const effectiveArgumentText = extractEffectiveArgumentText(tagName, rawText, parsedTag);\n\n const typedParseResult = parseTagArgument(tagName, effectiveArgumentText, \"build\");\n\n if (!typedParseResult.ok) {\n // §8.3 — emit typed-parser trace log when enabled.\n if (typedParserTraceEnabled) {\n typedParserLog.trace(\"typed-parser C-reject\", {\n consumer: \"build\",\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind: subjectTypeKind !== \"\" ? subjectTypeKind : \"-\",\n roleOutcome: \"C-reject\",\n diagnosticCode: typedParseResult.diagnostic.code,\n });\n }\n // Map the typed-parser diagnostic code to a ConstraintSemanticDiagnostic code.\n // UNKNOWN_TAG is structurally unreachable here: parseTagArgument is only called\n // after the tag was resolved via getTagDefinition above. If it fires, it's a bug.\n // mapTypedParserDiagnosticCode provides an exhaustive switch shared with the\n // snapshot consumer — avoids the Lesson 3 silent-ternary-collapse pitfall.\n const mappedCode = mapTypedParserDiagnosticCode(typedParseResult.diagnostic.code, tagName);\n return emit(\"C-reject\", [\n makeDiagnostic(mappedCode, typedParseResult.diagnostic.message, provenance),\n ]);\n }\n\n // Typed parser accepted the argument. Log at trace level before falling through\n // to the synthetic checker (which handles Roles A/B/D1/D2 until Phase 4).\n if (typedParserTraceEnabled) {\n typedParserLog.trace(\"typed-parser C-pass\", {\n consumer: \"build\",\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind: subjectTypeKind !== \"\" ? subjectTypeKind : \"-\",\n roleOutcome: \"C-pass\",\n valueKind: typedParseResult.value.kind,\n });\n }\n\n const argumentExpression = renderSyntheticArgumentExpression(\n definition.valueKind,\n effectiveArgumentText\n );\n // NOTE (Phase 2): the `requiresArgument && argumentExpression === null` guard\n // that previously lived here was removed because it is dead code after Phase 2.\n // For every `requiresArgument: true` tag, the typed parser returns ok: false\n // (MISSING_TAG_ARGUMENT) when the argument text is empty, so the C-reject\n // branch above fires before this point can be reached. The guard was labelled\n // \"A-pass\" which was misleading — it represented \"typed-parser-passed-but-\n // rendering-returned-null\", not a true Role-A miss. Dead branch confirmed by\n // exhaustive analysis of parseTagArgument return values for all tag families.\n\n const subjectTypeText = checker.typeToString(subjectType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);\n const hostType = options?.hostType ?? subjectType;\n const hostTypeText = checker.typeToString(hostType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);\n\n // §8.3b — trace-level log before the synthetic program is invoked.\n if (syntheticTraceEnabled) {\n syntheticLog.trace(\"invoking synthetic checker\", {\n consumer: \"build\",\n tag: tagName,\n placement,\n subjectTypeKind,\n subjectTypeText,\n });\n }\n\n const result = checkSyntheticTagApplication({\n tagName,\n placement,\n hostType: hostTypeText,\n subjectType: subjectTypeText,\n ...(target?.kind === \"path\" ? { target: { kind: \"path\" as const, text: target.rawText } } : {}),\n ...(argumentExpression !== null ? { argumentExpression } : {}),\n supportingDeclarations,\n ...(options?.extensionRegistry !== undefined\n ? {\n extensions: options.extensionRegistry.extensions.map((extension) => ({\n extensionId: extension.extensionId,\n ...(extension.constraintTags !== undefined\n ? {\n constraintTags: extension.constraintTags.map((tag) => ({ tagName: tag.tagName })),\n }\n : {}),\n ...(extension.metadataSlots !== undefined\n ? {\n metadataSlots: extension.metadataSlots,\n }\n : {}),\n ...(extension.types !== undefined\n ? {\n customTypes: extension.types.map((t) => ({\n tsTypeNames: t.tsTypeNames ?? [t.typeName],\n })),\n }\n : {}),\n })),\n }\n : {}),\n });\n\n if (result.diagnostics.length === 0) {\n // \"D-pass\": the synthetic batch produced no diagnostics for this application.\n // This is distinct from \"C-pass\" (typed-parser accepted the argument at Role C\n // before the batch ran). \"D-pass\" means the synthetic checker found nothing wrong.\n return emit(\"D-pass\", []);\n }\n\n const setupDiagnostic = result.diagnostics.find((diagnostic) => diagnostic.kind !== \"typescript\");\n if (setupDiagnostic !== undefined) {\n return emit(\"C-reject\", [\n makeDiagnostic(\n _mapSetupDiagnosticCode(setupDiagnostic.kind),\n setupDiagnostic.message,\n provenance\n ),\n ]);\n }\n\n const expectedLabel =\n definition.valueKind === null ? \"compatible argument\" : capabilityLabel(definition.valueKind);\n return emit(\"C-reject\", [\n makeDiagnostic(\n \"TYPE_MISMATCH\",\n `Tag \"@${tagName}\" received an invalid argument for ${expectedLabel}.`,\n provenance\n ),\n ]);\n}\n\nconst parseResultCache = new Map<string, TSDocParseResult>();\n\nfunction getExtensionTagNames(options?: ParseTSDocOptions): readonly string[] {\n return [\n ...(options?.extensionRegistry?.extensions.flatMap((extension) =>\n (extension.constraintTags ?? []).map((tag) => normalizeFormSpecTagName(tag.tagName))\n ) ?? []),\n ...(options?.extensionRegistry?.extensions.flatMap((extension) =>\n (extension.metadataSlots ?? []).map((slot) => normalizeFormSpecTagName(slot.tagName))\n ) ?? []),\n ].sort();\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Result of parsing a single JSDoc comment attached to a TS AST node.\n */\nexport interface TSDocParseResult {\n /** Constraint IR nodes extracted from custom block tags. */\n readonly constraints: readonly ConstraintNode[];\n /** Annotation IR nodes extracted from canonical TSDoc block tags. */\n readonly annotations: readonly AnnotationNode[];\n /** Compiler-backed extraction diagnostics for invalid tag applications. */\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n}\n\n/**\n * Optional extension-aware parsing inputs for TSDoc extraction.\n */\nexport interface ParseTSDocOptions {\n /**\n * Extension registry used to resolve custom tags and custom-type-specific\n * broadening of built-in constraint tags.\n */\n readonly extensionRegistry?: ExtensionRegistry;\n /**\n * Effective field/type node for the declaration being parsed. Required when\n * built-in tags may broaden onto a custom type.\n */\n readonly fieldType?: TypeNode;\n /** Type checker used for compiler-backed placement and type validation. */\n readonly checker?: ts.TypeChecker;\n /** The declaration type that the parsed tag applies to. */\n readonly subjectType?: ts.Type;\n /** Optional enclosing host type for future cross-field signature checks. */\n readonly hostType?: ts.Type;\n}\n\n/**\n * Display-name metadata extracted from a node's JSDoc tags.\n *\n * The root display name is returned separately from member-target labels so\n * callers can apply the former to the enclosing type/form and the latter to\n * enum members.\n */\nexport interface DisplayNameMetadata {\n readonly displayName?: string;\n readonly memberDisplayNames: ReadonlyMap<string, string>;\n}\n\nfunction getExtensionRegistryCacheKey(registry: ExtensionRegistry | undefined): string {\n if (registry === undefined) {\n return \"\";\n }\n\n return registry.extensions\n .map((extension) =>\n JSON.stringify({\n extensionId: extension.extensionId,\n typeNames: extension.types?.map((type) => type.typeName) ?? [],\n constraintTags:\n extension.constraintTags?.map((tag) => normalizeFormSpecTagName(tag.tagName)) ?? [],\n metadataSlots:\n extension.metadataSlots?.map((slot) => ({\n tagName: normalizeFormSpecTagName(slot.tagName),\n declarationKinds: [...slot.declarationKinds].sort(),\n allowBare: slot.allowBare !== false,\n qualifiers: (slot.qualifiers ?? [])\n .map((qualifier) => ({\n qualifier: qualifier.qualifier,\n ...(qualifier.sourceQualifier !== undefined\n ? { sourceQualifier: qualifier.sourceQualifier }\n : {}),\n }))\n .sort((left, right) => left.qualifier.localeCompare(right.qualifier)),\n })) ?? [],\n })\n )\n .join(\"|\");\n}\n\nfunction getParseCacheKey(\n node: ts.Node,\n file: string,\n options: ParseTSDocOptions | undefined\n): string {\n const sourceFile = node.getSourceFile();\n const checker = options?.checker;\n return JSON.stringify({\n file,\n sourceFile: sourceFile.fileName,\n sourceText: sourceFile.text,\n start: node.getFullStart(),\n end: node.getEnd(),\n fieldType: options?.fieldType ?? null,\n subjectType:\n checker !== undefined && options?.subjectType !== undefined\n ? checker.typeToString(options.subjectType, node, SYNTHETIC_TYPE_FORMAT_FLAGS)\n : null,\n hostType:\n checker !== undefined && options?.hostType !== undefined\n ? checker.typeToString(options.hostType, node, SYNTHETIC_TYPE_FORMAT_FLAGS)\n : null,\n extensions: getExtensionRegistryCacheKey(options?.extensionRegistry),\n });\n}\n\n/**\n * Parses the JSDoc comment attached to a TypeScript AST node using the\n * unified comment parser and returns canonical IR constraint and annotation\n * nodes.\n *\n * For constraint tags (`@minimum`, `@pattern`, `@enumOptions`, etc.),\n * the unified parser provides aligned span and TSDoc block information.\n * Canonical annotation tags (`@displayName`) are also parsed structurally.\n * Summary text and `@remarks` are extracted as separate annotation nodes.\n *\n * @param node - The TS AST node to inspect (PropertyDeclaration, PropertySignature, etc.)\n * @param file - Absolute source file path for provenance\n * @returns Parsed constraint and annotation nodes\n */\nexport function parseTSDocTags(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): TSDocParseResult {\n const cacheKey = getParseCacheKey(node, file, options);\n const cached = parseResultCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n // §4 Phase 4 Slice C — when the registry has setup failures, emit them ONCE\n // per parseTSDocTags call (anchored at the extension registration site) and\n // skip all further tag parsing for this node.\n //\n // Rationale for the early-return: an invalid registry means constraint types\n // cannot be resolved, so placement validation and summary-text extraction\n // for every field in the class would be based on incomplete type information.\n // Surfacing only the setup diagnostic — rather than potentially spurious\n // placement errors — keeps the user's feedback loop focused on fixing the\n // broken extension configuration first. See test\n // \"parseTSDocTags silent-drop: only setup diagnostics surface when registry\n // has setup failures\" in tsdoc-parser-setup-diagnostic-silent-drop.test.ts.\n const setupDiags = options?.extensionRegistry?.setupDiagnostics;\n if (setupDiags !== undefined && setupDiags.length > 0) {\n const result: TSDocParseResult = {\n constraints: [],\n annotations: [],\n diagnostics: _emitSetupDiagnostics(setupDiags, file),\n };\n parseResultCache.set(cacheKey, result);\n return result;\n }\n\n const constraints: ConstraintNode[] = [];\n const annotations: AnnotationNode[] = [];\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n let displayName: string | undefined;\n let placeholder: string | undefined;\n let displayNameProvenance: Provenance | undefined;\n let placeholderProvenance: Provenance | undefined;\n\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n\n // Collect extension-registered type names so we don't skip declarations\n // that reference them (the synthetic program provides aliases for these).\n const extensionTypeNames = getExtensionTypeNames(options?.extensionRegistry);\n\n const supportingDeclarations = buildSupportingDeclarations(sourceFile, extensionTypeNames);\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n\n // TS compiler API fallback for TAGS_REQUIRING_RAW_TEXT: handles tags that\n // the regex parser misses (e.g. malformed or unusual comment syntax).\n const rawTextFallbacks = collectRawTextFallbacks(node, file);\n\n const extensionTagNames = getExtensionTagNames(options);\n\n if (commentRanges) {\n for (const range of commentRanges) {\n // Only parse /** ... */ comments (kind 3 = MultiLineCommentTrivia)\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) {\n continue;\n }\n const commentText = sourceText.substring(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) {\n continue;\n }\n\n const extensions = options?.extensionRegistry?.extensions;\n const unified = parseUnifiedComment(commentText, {\n offset: range.pos,\n extensionTagNames,\n ...(extensions !== undefined ? { extensions } : {}),\n });\n\n for (const tag of unified.tags) {\n const tagName = tag.normalizedTagName;\n\n if (tagName === \"displayName\" || tagName === \"format\" || tagName === \"placeholder\") {\n const text = tag.resolvedPayloadText;\n if (text === \"\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n switch (tagName) {\n case \"displayName\":\n if (!isMemberTargetDisplayName(text) && displayName === undefined) {\n displayName = text;\n displayNameProvenance = provenance;\n }\n break;\n\n case \"format\":\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"format\",\n value: text,\n provenance,\n });\n break;\n\n case \"placeholder\":\n if (placeholder === undefined) {\n placeholder = text;\n placeholderProvenance = provenance;\n }\n break;\n }\n continue;\n }\n\n if (TAGS_REQUIRING_RAW_TEXT.has(tagName)) {\n // Consume corresponding compiler-API fallback entry (aligning by tag order).\n // Use choosePreferredPayloadText to handle multi-line payloads: the\n // regex parser's span may only capture the first line (e.g. `{`), while\n // the TS compiler API provides the full content for multi-line payloads.\n const fallback = rawTextFallbacks.get(tagName)?.shift();\n const text = choosePreferredPayloadText(tag.resolvedPayloadText, fallback?.text ?? \"\");\n if (text === \"\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n if (tagName === \"defaultValue\") {\n annotations.push(parseDefaultValueTagValue(text, provenance));\n continue;\n }\n\n processConstraintTag(\n tagName,\n text,\n tag,\n provenance,\n node,\n sourceFile,\n supportingDeclarations,\n options,\n constraints,\n diagnostics\n );\n continue;\n }\n\n // Regular constraint tag (not requiring raw text)\n const text = tag.resolvedPayloadText;\n const expectedType = isBuiltinConstraintName(tagName)\n ? BUILTIN_CONSTRAINT_DEFINITIONS[tagName]\n : undefined;\n if (text === \"\" && expectedType !== \"boolean\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n processConstraintTag(\n tagName,\n text,\n tag,\n provenance,\n node,\n sourceFile,\n supportingDeclarations,\n options,\n constraints,\n diagnostics\n );\n }\n\n // Extract @deprecated from the unified parse result\n if (unified.isDeprecated) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"deprecated\",\n ...(unified.deprecationMessage !== \"\" && { message: unified.deprecationMessage }),\n provenance: provenanceForComment(range, sourceFile, file, \"deprecated\"),\n });\n }\n\n // Summary text → description annotation (spec 002 §2.3)\n if (unified.summaryText !== \"\") {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"description\",\n value: unified.summaryText,\n provenance: provenanceForComment(range, sourceFile, file, \"summary\"),\n });\n }\n\n // @remarks → separate remarks annotation (spec 002 §2.3)\n if (unified.remarksText !== \"\") {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"remarks\",\n value: unified.remarksText,\n provenance: provenanceForComment(range, sourceFile, file, \"remarks\"),\n });\n }\n }\n }\n\n if (displayName !== undefined && displayNameProvenance !== undefined) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"displayName\",\n value: displayName,\n provenance: displayNameProvenance,\n });\n }\n\n if (placeholder !== undefined && placeholderProvenance !== undefined) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"placeholder\",\n value: placeholder,\n provenance: placeholderProvenance,\n });\n }\n\n // Process orphaned TS compiler API fallbacks: tags found by ts.getJSDocTags()\n // that were not matched by the regex parser (e.g. malformed comment syntax).\n for (const [tagName, fallbacks] of rawTextFallbacks) {\n for (const fallback of fallbacks) {\n const text = fallback.text.trim();\n if (text === \"\") continue;\n\n const provenance = fallback.provenance;\n if (tagName === \"defaultValue\") {\n annotations.push(parseDefaultValueTagValue(text, provenance));\n continue;\n }\n\n processConstraintTag(\n tagName,\n text,\n null,\n provenance,\n node,\n sourceFile,\n supportingDeclarations,\n options,\n constraints,\n diagnostics\n );\n }\n }\n\n const result = { constraints, annotations, diagnostics };\n parseResultCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Checks if a TS AST node has a `@deprecated` tag using the unified parser.\n */\nexport function hasDeprecatedTagTSDoc(node: ts.Node): boolean {\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n\n if (commentRanges) {\n for (const range of commentRanges) {\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) continue;\n const commentText = sourceText.substring(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) continue;\n\n if (parseUnifiedComment(commentText).isDeprecated) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Extracts root and member-target display-name metadata from a node's JSDoc tags.\n *\n * Member-target display-name tags use the syntax `@displayName :member Label`.\n * The first non-target `@displayName` is returned as the root display name.\n */\nexport function extractDisplayNameMetadata(node: ts.Node): DisplayNameMetadata {\n let displayName: string | undefined;\n const memberDisplayNames = new Map<string, string>();\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n\n if (commentRanges) {\n for (const range of commentRanges) {\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) continue;\n const commentText = sourceText.substring(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) continue;\n\n const unified = parseUnifiedComment(commentText);\n for (const tag of unified.tags) {\n if (tag.normalizedTagName !== \"displayName\") {\n continue;\n }\n\n if (tag.target !== null && tag.argumentText !== \"\") {\n memberDisplayNames.set(tag.target.rawText, tag.argumentText);\n continue;\n }\n\n if (tag.argumentText !== \"\") {\n displayName ??= tag.argumentText;\n }\n }\n }\n }\n\n return {\n ...(displayName !== undefined && { displayName }),\n memberDisplayNames,\n };\n}\n\n// =============================================================================\n// PUBLIC HELPERS — path target extraction\n// =============================================================================\n\n/**\n * Extracts a path-target prefix (`:fieldName`) from constraint tag text.\n * Returns the parsed PathTarget and remaining text, or null if no path target.\n *\n * @example\n * extractPathTarget(\":value 0\") // → { path: { segments: [\"value\"] }, remainingText: \"0\" }\n * extractPathTarget(\"42\") // → null\n */\nexport function extractPathTarget(\n text: string\n): { path: PathTarget; remainingText: string } | null {\n return extractSharedPathTarget(text);\n}\n\nfunction collectRawTextFallbacks(\n node: ts.Node,\n file: string\n): Map<string, { text: string; provenance: Provenance }[]> {\n const fallbacks = new Map<string, { text: string; provenance: Provenance }[]>();\n\n for (const tag of ts.getJSDocTags(node)) {\n const tagName = normalizeConstraintTagName(tag.tagName.text);\n if (!TAGS_REQUIRING_RAW_TEXT.has(tagName)) continue;\n\n const commentText = getTagCommentText(tag)?.trim() ?? \"\";\n if (commentText === \"\") continue;\n\n const entries = fallbacks.get(tagName) ?? [];\n entries.push({\n text: commentText,\n provenance: provenanceForJSDocTag(tag, file),\n });\n fallbacks.set(tagName, entries);\n }\n\n return fallbacks;\n}\n\n// =============================================================================\n// PRIVATE HELPERS — constraint value parsing\n// =============================================================================\n\nfunction isMemberTargetDisplayName(text: string): boolean {\n return parseTagSyntax(\"displayName\", text).target !== null;\n}\n\n// =============================================================================\n// PRIVATE HELPERS — provenance\n// =============================================================================\n\nfunction provenanceForComment(\n range: ts.CommentRange,\n sourceFile: ts.SourceFile,\n file: string,\n tagName: string\n): Provenance {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(range.pos);\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tagName,\n };\n}\n\nfunction provenanceForParsedTag(\n tag: ParsedCommentTag,\n sourceFile: ts.SourceFile,\n file: string\n): Provenance {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(tag.tagNameSpan.start);\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tag.normalizedTagName,\n };\n}\n\nfunction provenanceForJSDocTag(tag: ts.JSDocTag, file: string): Provenance {\n const sourceFile = tag.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(tag.getStart());\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tag.tagName.text,\n };\n}\n\n/**\n * Extracts the text content from a TypeScript JSDoc tag's comment.\n */\nfunction getTagCommentText(tag: ts.JSDocTag): string | undefined {\n if (tag.comment === undefined) {\n return undefined;\n }\n if (typeof tag.comment === \"string\") {\n return tag.comment;\n }\n return ts.getTextOfJSDocComment(tag.comment);\n}\n","import * as ts from \"typescript\";\n\nimport { _collectBrandIdentifiers, stripNullishUnion } from \"@formspec/analysis/internal\";\n\nimport type { ExtensionRegistry, ExtensionTypeLookupResult } from \"./registry.js\";\nimport {\n extractTypeNodeFromSource,\n getTypeAliasDeclarationFromTypeReference,\n resolveCanonicalSymbol,\n} from \"./ts-type-utils.js\";\n\nfunction getTypeNodeRegistrationName(typeNode: ts.TypeNode): string | null {\n if (ts.isTypeReferenceNode(typeNode)) {\n return ts.isIdentifier(typeNode.typeName)\n ? typeNode.typeName.text\n : typeNode.typeName.right.text;\n }\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return getTypeNodeRegistrationName(typeNode.type);\n }\n if (\n typeNode.kind === ts.SyntaxKind.BigIntKeyword ||\n typeNode.kind === ts.SyntaxKind.StringKeyword ||\n typeNode.kind === ts.SyntaxKind.NumberKeyword ||\n typeNode.kind === ts.SyntaxKind.BooleanKeyword\n ) {\n return typeNode.getText();\n }\n return null;\n}\n\nfunction resolveByNameFromTypeNode(\n typeNode: ts.TypeNode,\n registry: ExtensionRegistry,\n checker: ts.TypeChecker\n): ExtensionTypeLookupResult | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return resolveByNameFromTypeNode(typeNode.type, registry, checker);\n }\n const typeName = getTypeNodeRegistrationName(typeNode);\n if (typeName !== null) {\n const byName = registry.findTypeByName(typeName);\n if (byName !== undefined) {\n return byName;\n }\n }\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (aliasDecl !== undefined) {\n return resolveByNameFromTypeNode(aliasDecl.type, registry, checker);\n }\n }\n return null;\n}\n\n/**\n * Resolves a TypeScript type to an extension-registered custom type, trying\n * all three registration mechanisms in order of precision:\n *\n * 1. **Name-based** (via `sourceNode` AST walk) — matches the user-written\n * alias identifier (e.g. `amount: Decimal` → `\"Decimal\"`). Requires a\n * source node to walk; used by the direct-field code path.\n * 2. **Symbol-based** — matches `ts.Symbol` identity via\n * `ExtensionRegistry.findTypeBySymbol`, populated from\n * `defineCustomType<T>()` type parameter extraction. Works for any type\n * regardless of import aliases or name collisions.\n * 3. **Brand-based** — matches the `brand` identifier encoded into\n * intersection types as computed-property keys (e.g.\n * `string & { [__decimalBrand]: true }`). Structural; independent of\n * declaration names.\n *\n * Name-based resolution also has a symbol-fallback path that uses\n * `type.aliasSymbol?.getName()` when no `sourceNode` is provided, so\n * path-resolved types can still match name-registered custom types.\n *\n * Nullable unions (`T | null`, `T | undefined`, `T | null | undefined`) are\n * stripped before every detection attempt, so registrations apply through\n * nullable wrappers transparently.\n *\n * Returns `null` when no registered custom type matches.\n */\nexport function resolveCustomTypeFromTsType(\n type: ts.Type,\n checker: ts.TypeChecker,\n registry: ExtensionRegistry | undefined,\n sourceNode?: ts.Node\n): ExtensionTypeLookupResult | null {\n if (registry === undefined) {\n return null;\n }\n\n const stripped = stripNullishUnion(type);\n\n // 1. Name-based: prefer walking the source AST for the user-written\n // identifier; fall back to the canonical symbol name for path-resolved\n // types that have no syntactic source.\n if (sourceNode !== undefined) {\n const typeNode = extractTypeNodeFromSource(sourceNode);\n if (typeNode !== undefined) {\n const byName = resolveByNameFromTypeNode(typeNode, registry, checker);\n if (byName !== null) {\n return byName;\n }\n }\n } else {\n const typeName = (stripped.aliasSymbol ?? stripped.getSymbol())?.getName();\n if (typeName !== undefined) {\n const byName = registry.findTypeByName(typeName);\n if (byName !== undefined) {\n return byName;\n }\n }\n }\n\n // 2. Symbol-based.\n const canonical = resolveCanonicalSymbol(stripped, checker);\n if (canonical !== undefined) {\n const bySymbol = registry.findTypeBySymbol(canonical);\n if (bySymbol !== undefined) {\n return bySymbol;\n }\n }\n\n // 3. Brand-based.\n for (const brand of _collectBrandIdentifiers(stripped)) {\n const byBrand = registry.findTypeByBrand(brand);\n if (byBrand !== undefined) {\n return byBrand;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the fully-qualified type ID for a resolved custom-type lookup.\n *\n * Type IDs have the form `${extensionId}/${typeName}`, matching the format\n * produced elsewhere in the build pipeline.\n */\nexport function customTypeIdFromLookup(result: ExtensionTypeLookupResult): string {\n return `${result.extensionId}/${result.registration.typeName}`;\n}\n","import * as ts from \"typescript\";\n\n/**\n * Resolves a TypeScript type to its canonical `ts.Symbol`, following alias chains.\n *\n * `aliasSymbol` tracks type aliases (e.g. `type Foo = Bar`); `getSymbol()` tracks\n * the structural symbol. We prefer `aliasSymbol` when present so that aliased\n * types resolve to the declaration site rather than the structural shape.\n *\n * Returns `undefined` for bare primitives and anonymous types, which have no\n * symbol.\n */\nexport function resolveCanonicalSymbol(\n type: ts.Type,\n checker: ts.TypeChecker\n): ts.Symbol | undefined {\n const raw = type.aliasSymbol ?? type.getSymbol();\n if (raw === undefined) return undefined;\n return raw.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(raw) : raw;\n}\n\n/**\n * Extracts the `ts.TypeNode` backing a property / parameter / type-alias\n * declaration. Returns the node itself when `sourceNode` is already a type\n * node, or `undefined` otherwise.\n */\nexport function extractTypeNodeFromSource(sourceNode: ts.Node): ts.TypeNode | undefined {\n if (\n ts.isPropertyDeclaration(sourceNode) ||\n ts.isPropertySignature(sourceNode) ||\n ts.isParameter(sourceNode) ||\n ts.isTypeAliasDeclaration(sourceNode)\n ) {\n return sourceNode.type;\n }\n if (ts.isTypeNode(sourceNode)) {\n return sourceNode;\n }\n return undefined;\n}\n\nfunction resolveAliasedSymbol(\n symbol: ts.Symbol | undefined,\n checker: ts.TypeChecker\n): ts.Symbol | undefined {\n if (symbol === undefined) return undefined;\n return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;\n}\n\n/**\n * Resolves a `ts.TypeReferenceNode` to its declaring `ts.TypeAliasDeclaration`,\n * if the reference names a type alias — following import aliases so that\n * `import { Foo } from \"./types\"; field: Foo` resolves through to the\n * original `type Foo = ...` declaration.\n *\n * Returns `undefined` for references to non-alias declarations (interfaces,\n * classes, modules, etc.).\n */\nexport function getTypeAliasDeclarationFromTypeReference(\n typeNode: ts.TypeReferenceNode,\n checker: ts.TypeChecker\n): ts.TypeAliasDeclaration | undefined {\n const symbol = checker.getSymbolAtLocation(typeNode.typeName);\n return resolveAliasedSymbol(symbol, checker)?.declarations?.find(ts.isTypeAliasDeclaration);\n}\n","/**\n * Re-exports {@link _isIntegerBrandedType} from the shared\n * `@formspec/analysis` implementation.\n *\n * The detection logic was extracted to `@formspec/analysis` (Phase 4A of the\n * synthetic-checker retirement) so that both the build consumer\n * (`tsdoc-parser.ts`) and the snapshot consumer (`file-snapshots.ts`) can use\n * the same bypass check.\n *\n * Callers inside `@formspec/build` continue to import from this module — no\n * import-site changes required in `class-analyzer.ts` or `tsdoc-parser.ts`.\n *\n * @internal\n */\nexport { _isIntegerBrandedType } from \"@formspec/analysis/internal\";\n","/**\n * Symbol-based custom type registry.\n *\n * Walks the FormSpec config file AST to find `defineCustomType<T>()` calls,\n * extracts the TypeScript type argument, resolves it to a canonical `ts.Symbol`,\n * and builds a `Map` for O(1) symbol-identity lookup during field analysis.\n *\n * This detection path is the most precise available — it uses TypeScript's own\n * type identity, making it immune to import aliases and name collisions.\n *\n * @packageDocumentation\n */\n\nimport * as ts from \"typescript\";\nimport * as path from \"node:path\";\nimport type { ExtensionRegistry, ExtensionTypeLookupResult } from \"./registry.js\";\nimport { resolveCanonicalSymbol } from \"./ts-type-utils.js\";\n\n// =============================================================================\n// IMPLEMENTATION\n// =============================================================================\n\n/**\n * Walks the config file's AST to find `defineCustomType<T>()` calls,\n * extracts type arguments, resolves them to ts.Symbol, and builds a\n * Map for O(1) symbol-identity lookup during field analysis.\n *\n * Returns an empty map if the config file isn't in the program, has\n * no `defineCustomType` calls, or none have type arguments.\n *\n * @param configPath - Absolute path to the FormSpec config file.\n * @param program - The TypeScript program that includes the config file.\n * @param checker - Type checker for the program.\n * @param extensionRegistry - The runtime extension registry already built from\n * the config's export; used to look up the matching registration by typeName.\n * @returns A map from canonical ts.Symbol to the matching registry entry.\n *\n * @public\n */\nexport function buildSymbolMapFromConfig(\n configPath: string,\n program: ts.Program,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry\n): Map<ts.Symbol, ExtensionTypeLookupResult> {\n const symbolMap = new Map<ts.Symbol, ExtensionTypeLookupResult>();\n\n const normalizedPath = path.resolve(configPath);\n const configFile = program.getSourceFile(normalizedPath);\n if (configFile === undefined) {\n return symbolMap;\n }\n\n // Walk AST to find defineCustomType<T>() calls\n function visit(node: ts.Node): void {\n if (ts.isCallExpression(node) && isDefineCustomTypeCall(node, checker)) {\n processDefineCustomTypeCall(node);\n }\n ts.forEachChild(node, visit);\n }\n\n function processDefineCustomTypeCall(call: ts.CallExpression): void {\n // typeArguments is checked (length > 0) before calling this function,\n // but the NodeArray index returns T | undefined in noUncheckedIndexedAccess mode.\n const typeArgNode = call.typeArguments?.[0];\n if (typeArgNode === undefined) {\n return;\n }\n const resolvedType = checker.getTypeFromTypeNode(typeArgNode);\n\n // Resolve to the canonical symbol, following alias chains.\n const canonical = resolveCanonicalSymbol(resolvedType, checker);\n if (canonical === undefined) {\n // Bare primitive (string, number, etc.) — no symbol, skip.\n return;\n }\n\n // Extract the typeName from the call's object literal argument so we can\n // look up the matching runtime registration by name.\n const typeName = extractTypeNameFromCallArg(call);\n if (typeName === null) {\n return;\n }\n\n // Prefer a fully-qualified lookup (extensionId + typeName) to avoid ambiguity\n // when two extensions register types with the same typeName. Walk up the AST to\n // find the enclosing defineExtension() call and extract its extensionId.\n let entry: ExtensionTypeLookupResult | undefined;\n const extensionId = extractEnclosingExtensionId(call, checker);\n if (extensionId !== null) {\n // Qualified lookup — unambiguous when extensionId is known.\n const reg = extensionRegistry.findType(`${extensionId}/${typeName}`);\n if (reg !== undefined) {\n entry = { extensionId, registration: reg };\n }\n }\n // Fallback: linear scan by typeName across all extensions.\n entry ??= findRegistrationByTypeName(extensionRegistry, typeName);\n if (entry === undefined) {\n return;\n }\n\n symbolMap.set(canonical, entry);\n }\n\n visit(configFile);\n return symbolMap;\n}\n\n// =============================================================================\n// HELPERS (module-private)\n// =============================================================================\n\n/**\n * Returns true when `node` is a `defineCustomType<T>(...)` call expression, regardless\n * of how `defineCustomType` was imported (direct import, namespace import, or renamed import).\n *\n * Primary strategy: resolve the call expression's symbol through the type checker and\n * verify the declaration comes from `@formspec/core`. This handles namespace imports\n * (`core.defineCustomType<T>()`), renamed imports (`dct<T>()`), and re-exports.\n *\n * Fallback strategy: if the type checker cannot resolve the symbol (e.g., when the\n * config file's module resolution cannot locate `@formspec/core` from its directory),\n * fall back to a syntactic check on the bare identifier name. This covers the common\n * case of `import { defineCustomType } from \"@formspec/core\"` in environments where\n * type-checker-based symbol resolution is unavailable.\n */\nfunction isDefineCustomTypeCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n if (node.typeArguments === undefined || node.typeArguments.length === 0) return false;\n\n const callSymbol = checker.getSymbolAtLocation(node.expression);\n if (callSymbol !== undefined) {\n // Primary path: symbol resolved — verify it's defineCustomType from @formspec/core.\n const resolved =\n callSymbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(callSymbol) : callSymbol;\n\n const decl = resolved.declarations?.[0];\n if (decl !== undefined) {\n // Normalize to forward slashes for cross-platform path comparison.\n const sourceFile = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n return (\n resolved.name === \"defineCustomType\" &&\n // Match whether in node_modules/@formspec/core or monorepo packages/core.\n (sourceFile.includes(\"@formspec/core\") || sourceFile.includes(\"/packages/core/\"))\n );\n }\n }\n\n // Fallback path: type checker couldn't resolve the symbol. Fall back to a syntactic\n // check on the bare identifier name so that\n // `import { defineCustomType } from \"@formspec/core\"` still works when\n // @formspec/core is not resolvable from the config file's directory.\n return ts.isIdentifier(node.expression) && node.expression.text === \"defineCustomType\";\n}\n\n\n/**\n * Extracts the `typeName` string from a `defineCustomType({ typeName: \"...\" })` call.\n *\n * Returns `null` when the first argument is not an object literal or the\n * `typeName` property is missing / not a string literal.\n */\nfunction extractTypeNameFromCallArg(call: ts.CallExpression): string | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n return null;\n }\n\n const typeNameProp = arg.properties.find(\n (p): p is ts.PropertyAssignment =>\n ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === \"typeName\"\n );\n\n if (typeNameProp === undefined || !ts.isStringLiteral(typeNameProp.initializer)) {\n return null;\n }\n\n return typeNameProp.initializer.text;\n}\n\n/**\n * Walks up the AST from a `defineCustomType<T>()` call to find an enclosing\n * `defineExtension({ extensionId: \"...\" })` call, and returns the extensionId.\n *\n * This enables unambiguous qualified lookup (`extensionId/typeName`) when two\n * extensions register types with the same `typeName`. Returns `null` when\n * no enclosing `defineExtension` call is found.\n */\nfunction extractEnclosingExtensionId(\n call: ts.CallExpression,\n checker: ts.TypeChecker\n): string | null {\n // Walk up the AST parent chain to find an enclosing defineExtension() call.\n // ts.Node.parent is always defined after binding, so we use isSourceFile as\n // the termination condition instead of checking for undefined.\n for (let node = call.parent; !ts.isSourceFile(node); node = node.parent) {\n if (ts.isCallExpression(node) && isDefineExtensionCall(node, checker)) {\n return extractExtensionIdFromCallArg(node);\n }\n }\n return null;\n}\n\n/**\n * Returns true when `node` is a `defineExtension(...)` call expression, using\n * the same symbol-resolution strategy as {@link isDefineCustomTypeCall}.\n */\nfunction isDefineExtensionCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n const callSymbol = checker.getSymbolAtLocation(node.expression);\n if (callSymbol !== undefined) {\n const resolved =\n callSymbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(callSymbol) : callSymbol;\n const decl = resolved.declarations?.[0];\n if (decl !== undefined) {\n const sourceFile = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n return (\n resolved.name === \"defineExtension\" &&\n (sourceFile.includes(\"@formspec/core\") || sourceFile.includes(\"/packages/core/\"))\n );\n }\n }\n // Syntactic fallback for environments where module resolution is unavailable.\n return ts.isIdentifier(node.expression) && node.expression.text === \"defineExtension\";\n}\n\n/**\n * Extracts the `extensionId` string from a `defineExtension({ extensionId: \"...\" })` call.\n *\n * Returns `null` when the first argument is not an object literal or the\n * `extensionId` property is missing / not a string literal.\n */\nfunction extractExtensionIdFromCallArg(call: ts.CallExpression): string | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n return null;\n }\n\n const prop = arg.properties.find(\n (p): p is ts.PropertyAssignment =>\n ts.isPropertyAssignment(p) &&\n ts.isIdentifier(p.name) &&\n p.name.text === \"extensionId\"\n );\n\n if (prop === undefined || !ts.isStringLiteral(prop.initializer)) {\n return null;\n }\n\n return prop.initializer.text;\n}\n\n/**\n * Finds the registry entry for the extension type that matches `typeName`.\n *\n * Iterates extensions in registration order. Returns `undefined` if no\n * extension has a type with the given name.\n */\nfunction findRegistrationByTypeName(\n registry: ExtensionRegistry,\n typeName: string\n): ExtensionTypeLookupResult | undefined {\n for (const ext of registry.extensions) {\n if (ext.types === undefined) {\n continue;\n }\n for (const type of ext.types) {\n if (type.typeName === typeName) {\n return { extensionId: ext.extensionId, registration: type };\n }\n }\n }\n return undefined;\n}\n","/**\n * Constraint validator for the FormSpec IR.\n *\n * Delegates target-centric semantic analysis to `@formspec/analysis` so build\n * validation and editor tooling share the same inheritance, path-target,\n * contradiction, and broadening semantics.\n *\n * @packageDocumentation\n */\n\nimport { analyzeConstraintTargets, type ConstraintRegistryLike } from \"@formspec/analysis/internal\";\nimport type { FormIR, FormIRElement, FieldNode, ObjectProperty } from \"@formspec/core/internals\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\n\n/**\n * Supported severity levels returned by static build validation.\n *\n * @public\n */\nexport type ValidationDiagnosticSeverity = \"error\" | \"warning\";\n\n/**\n * Public source-location shape attached to validation diagnostics.\n *\n * This mirrors the provenance information surfaced by the shared analysis\n * layer without exposing `@formspec/core/internals` through the public API.\n *\n * @public\n */\nexport interface ValidationDiagnosticLocation {\n /** Authoring surface that produced the diagnostic location. */\n readonly surface: \"tsdoc\" | \"chain-dsl\" | \"extension\" | \"inferred\";\n /** Absolute path to the source file. */\n readonly file: string;\n /** 1-based line number in the source file. */\n readonly line: number;\n /** 0-based column number in the source file. */\n readonly column: number;\n /** Optional span length in characters. */\n readonly length?: number;\n /** Optional tag or construct associated with the location. */\n readonly tagName?: string;\n}\n\n/**\n * A machine-readable validation diagnostic returned by static schema analysis.\n *\n * @public\n */\nexport interface ValidationDiagnostic {\n /** Stable machine-readable diagnostic code. */\n readonly code: string;\n /** Human-readable explanation of the validation problem. */\n readonly message: string;\n /** Severity of the reported validation problem. */\n readonly severity: ValidationDiagnosticSeverity;\n /** Primary source location associated with the diagnostic. */\n readonly primaryLocation: ValidationDiagnosticLocation;\n /** Related source locations that add context to the diagnostic. */\n readonly relatedLocations: readonly ValidationDiagnosticLocation[];\n}\n\n/**\n * Result of validating canonical FormIR before schema emission.\n *\n * @public\n */\nexport interface ValidationResult {\n /** Diagnostics produced during validation. */\n readonly diagnostics: readonly ValidationDiagnostic[];\n /** Whether any error-severity diagnostics were produced. */\n readonly valid: boolean;\n}\n\n/**\n * Options for validating canonical FormIR.\n *\n * @public\n */\nexport interface ValidateIROptions {\n /** Vendor prefix used when resolving extension-backed keywords. */\n readonly vendorPrefix?: string;\n /** Extension registry used to resolve custom constraints and types. */\n readonly extensionRegistry?: ExtensionRegistry;\n}\n\ninterface ValidationContext {\n readonly diagnostics: ValidationDiagnostic[];\n readonly extensionRegistry: ConstraintRegistryLike | undefined;\n readonly typeRegistry: FormIR[\"typeRegistry\"];\n}\n\nfunction validateFieldNode(ctx: ValidationContext, field: FieldNode): void {\n const analysis = analyzeConstraintTargets(\n field.name,\n field.type,\n field.constraints,\n ctx.typeRegistry,\n ctx.extensionRegistry === undefined\n ? undefined\n : {\n extensionRegistry: ctx.extensionRegistry,\n }\n );\n ctx.diagnostics.push(...analysis.diagnostics);\n\n if (field.type.kind === \"object\") {\n for (const property of field.type.properties) {\n validateObjectProperty(ctx, field.name, property);\n }\n }\n}\n\nfunction validateObjectProperty(\n ctx: ValidationContext,\n parentName: string,\n property: ObjectProperty\n): void {\n const qualifiedName = `${parentName}.${property.name}`;\n const analysis = analyzeConstraintTargets(\n qualifiedName,\n property.type,\n property.constraints,\n ctx.typeRegistry,\n ctx.extensionRegistry === undefined\n ? undefined\n : {\n extensionRegistry: ctx.extensionRegistry,\n }\n );\n ctx.diagnostics.push(...analysis.diagnostics);\n\n if (property.type.kind === \"object\") {\n for (const nestedProperty of property.type.properties) {\n validateObjectProperty(ctx, qualifiedName, nestedProperty);\n }\n }\n}\n\nfunction validateElement(ctx: ValidationContext, element: FormIRElement): void {\n switch (element.kind) {\n case \"field\":\n validateFieldNode(ctx, element);\n break;\n case \"group\":\n for (const child of element.elements) {\n validateElement(ctx, child);\n }\n break;\n case \"conditional\":\n for (const child of element.elements) {\n validateElement(ctx, child);\n }\n break;\n default: {\n const exhaustive: never = element;\n throw new Error(`Unhandled element kind: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Validates canonical FormIR and returns all discovered diagnostics.\n *\n * @public\n */\nexport function validateIR(ir: FormIR, options?: ValidateIROptions): ValidationResult {\n const ctx: ValidationContext = {\n diagnostics: [],\n extensionRegistry: options?.extensionRegistry,\n typeRegistry: ir.typeRegistry,\n };\n\n for (const element of ir.elements) {\n validateElement(ctx, element);\n }\n\n return {\n diagnostics: ctx.diagnostics,\n valid: ctx.diagnostics.every((diagnostic) => diagnostic.severity !== \"error\"),\n };\n}\n","import * as ts from \"typescript\";\nimport {\n createProgramContext,\n createProgramContextFromProgram,\n type ProgramContext,\n} from \"./analyzer/program.js\";\n\n/**\n * Supported compiler context for static build-time analysis workflows.\n *\n * This context gives consumers access to the TypeScript program, checker, and\n * source file used to discover declarations before invoking FormSpec schema\n * generation helpers.\n *\n * @public\n */\nexport interface StaticBuildContext {\n /** Host-owned or FormSpec-created TypeScript program. */\n readonly program: ts.Program;\n /** TypeScript checker for symbol and type analysis. */\n readonly checker: ts.TypeChecker;\n /** Source file used as the entry module for export resolution. */\n readonly sourceFile: ts.SourceFile;\n}\n\nfunction toStaticBuildContext(context: ProgramContext): StaticBuildContext {\n return context;\n}\n\n/**\n * Creates a supported static build context for a source file.\n *\n * @param filePath - Entry TypeScript source file used for export resolution\n * @returns Reusable build context containing the program, checker, and source file\n *\n * @public\n */\nexport function createStaticBuildContext(filePath: string): StaticBuildContext {\n return toStaticBuildContext(createProgramContext(filePath));\n}\n\n/**\n * Creates a supported static build context from an existing host-owned program.\n *\n * @param program - Existing TypeScript program supplied by the caller\n * @param filePath - Entry TypeScript source file used for export resolution\n * @returns Reusable build context containing the program, checker, and source file\n *\n * @public\n */\nexport function createStaticBuildContextFromProgram(\n program: ts.Program,\n filePath: string\n): StaticBuildContext {\n return toStaticBuildContext(createProgramContextFromProgram(program, filePath));\n}\n\nfunction getModuleSymbol(context: StaticBuildContext): ts.Symbol | undefined {\n const sourceFileWithSymbol = context.sourceFile as ts.SourceFile & { symbol?: ts.Symbol };\n return context.checker.getSymbolAtLocation(context.sourceFile) ?? sourceFileWithSymbol.symbol;\n}\n\nfunction isSchemaSourceDeclaration(\n declaration: ts.Declaration\n): declaration is ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration {\n return (\n ts.isClassDeclaration(declaration) ||\n ts.isInterfaceDeclaration(declaration) ||\n ts.isTypeAliasDeclaration(declaration)\n );\n}\n\n/**\n * Resolves an export from the context source file, following aliases and re-exports.\n *\n * @param context - Static build context created for the entry source file\n * @param exportName - Export name to resolve. Defaults to `\"default\"`.\n * @returns Resolved symbol for the export, or `null` when it cannot be found\n *\n * @public\n */\nexport function resolveModuleExport(\n context: StaticBuildContext,\n exportName = \"default\"\n): ts.Symbol | null {\n const moduleSymbol = getModuleSymbol(context);\n if (moduleSymbol === undefined) {\n return null;\n }\n\n const exportSymbol =\n context.checker\n .getExportsOfModule(moduleSymbol)\n .find((candidate) => candidate.name === exportName) ?? null;\n if (exportSymbol === null) {\n return null;\n }\n\n return exportSymbol.flags & ts.SymbolFlags.Alias\n ? context.checker.getAliasedSymbol(exportSymbol)\n : exportSymbol;\n}\n\n/**\n * Resolves the declaration behind an export from the context source file,\n * following aliases and re-exports. This helper is intentionally limited to\n * declaration kinds accepted by declaration-driven schema generation.\n *\n * @param context - Static build context created for the entry source file\n * @param exportName - Export name to resolve. Defaults to `\"default\"`.\n * @returns Resolved class, interface, or type-alias declaration for the export,\n * or `null` when the export does not resolve to one of those schema-source kinds\n *\n * @public\n */\nexport function resolveModuleExportDeclaration(\n context: StaticBuildContext,\n exportName = \"default\"\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null {\n return (\n resolveModuleExport(context, exportName)?.declarations?.find(isSchemaSourceDeclaration) ?? null\n );\n}\n","import * as ts from \"typescript\";\nimport { analyzeMetadataForNodeWithChecker } from \"@formspec/analysis/internal\";\nimport type {\n AnnotationNode,\n ObjectProperty,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport type { MetadataPolicyInput, ResolvedMetadata } from \"@formspec/core\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport type { StaticBuildContext } from \"../static-build.js\";\nimport {\n analyzeDeclarationRootInfo,\n analyzeClassToIR,\n analyzeInterfaceToIR,\n analyzeTypeAliasToIR,\n createAnalyzerMetadataPolicy,\n resolveTypeNode,\n type IRClassAnalysis,\n} from \"../analyzer/class-analyzer.js\";\nimport {\n generateClassSchemas,\n resolveStaticOptions,\n type ClassSchemas,\n type StaticSchemaGenerationOptions,\n} from \"./class-schema.js\";\nimport { generateJsonSchemaFromIR, type JsonSchema2020 } from \"../json-schema/ir-generator.js\";\nimport { IR_VERSION, type FieldNode } from \"@formspec/core/internals\";\nimport type { ConstraintSemanticDiagnostic } from \"@formspec/analysis/internal\";\nimport {\n getDeclarationMetadataPolicy,\n mergeResolvedMetadata,\n normalizeMetadataPolicy,\n resolveFormIRMetadata,\n} from \"../metadata/index.js\";\n\n/**\n * Generated schemas for a discovered declaration or signature type.\n *\n * `uiSchema` is `null` when the discovered type does not have an object-shaped\n * root that can be represented as a JSON Forms layout.\n *\n * @public\n */\nexport interface DiscoveredTypeSchemas {\n /** JSON Schema 2020-12 for the resolved type. */\n readonly jsonSchema: JsonSchema2020;\n /** UI Schema for object-shaped roots, or `null` when not applicable. */\n readonly uiSchema: UISchema | null;\n /**\n * Resolved type-level metadata used during generation, when available.\n *\n * This preserves explicit and inferred naming metadata such as singular and\n * plural API/display names for consumers that need the resolved values in\n * addition to the emitted schema artifacts.\n */\n readonly resolvedMetadata?: ResolvedMetadata | undefined;\n}\n\n/**\n * Supported declaration kinds for declaration-driven schema generation.\n *\n * @public\n */\nexport type SchemaSourceDeclaration =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Supported declaration kinds for standalone metadata resolution.\n *\n * This helper is intentionally limited to named type declarations,\n * methods/functions, and object-like properties. It does not currently expose\n * parameter or variable metadata resolution on the public build surface.\n *\n * @public\n */\nexport type MetadataSourceDeclaration =\n | SchemaSourceDeclaration\n | ts.MethodDeclaration\n | ts.FunctionDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature;\n\n/**\n * Options for generating schemas from a resolved declaration.\n *\n * @public\n */\nexport interface GenerateSchemasFromDeclarationOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Declaration to turn into schemas. */\n readonly declaration: SchemaSourceDeclaration;\n}\n\n/**\n * Options for generating schemas from a resolved TypeScript type.\n *\n * @public\n */\nexport interface GenerateSchemasFromTypeOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** TypeScript type to turn into schemas. */\n readonly type: ts.Type;\n /**\n * Optional source node associated with the type.\n *\n * When provided, FormSpec uses it as the source location for provenance and\n * inline-type analysis.\n */\n readonly sourceNode?: ts.Node | undefined;\n /** Optional logical name used for anonymous roots. */\n readonly name?: string | undefined;\n}\n\n/**\n * Options for generating schemas from a method or function parameter type.\n *\n * @public\n */\nexport interface GenerateSchemasFromParameterOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Parameter declaration whose type should be converted into schemas. */\n readonly parameter: ts.ParameterDeclaration;\n}\n\n/**\n * Options for generating schemas from a method or function return type.\n *\n * @public\n */\nexport interface GenerateSchemasFromReturnTypeOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Signature declaration whose return type should be converted into schemas. */\n readonly declaration: ts.SignatureDeclaration;\n}\n\n/**\n * Options for resolving metadata from a declaration against the active\n * metadata policy.\n *\n * @public\n */\nexport interface ResolveDeclarationMetadataOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Declaration whose metadata should be resolved. */\n readonly declaration: MetadataSourceDeclaration;\n}\n\nfunction toDiscoveredTypeSchemas(\n result: ClassSchemas,\n resolvedMetadata?: ResolvedMetadata\n): DiscoveredTypeSchemas {\n return {\n ...result,\n ...(resolvedMetadata !== undefined && { resolvedMetadata }),\n };\n}\n\nfunction isNamedTypeDeclaration(\n declaration: ts.Declaration\n): declaration is ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration {\n return (\n ts.isClassDeclaration(declaration) ||\n ts.isInterfaceDeclaration(declaration) ||\n ts.isTypeAliasDeclaration(declaration)\n );\n}\n\nfunction hasConcreteTypeArguments(type: ts.Type, checker: ts.TypeChecker): boolean {\n if (\n \"aliasTypeArguments\" in type &&\n Array.isArray(type.aliasTypeArguments) &&\n type.aliasTypeArguments.length > 0\n ) {\n return true;\n }\n\n if ((type.flags & ts.TypeFlags.Object) === 0) {\n return false;\n }\n\n const objectType = type as ts.ObjectType;\n if ((objectType.objectFlags & ts.ObjectFlags.Reference) === 0) {\n return false;\n }\n\n return checker.getTypeArguments(objectType as ts.TypeReference).length > 0;\n}\n\nfunction getNamedTypeDeclaration(\n type: ts.Type\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | undefined {\n const symbol = type.getSymbol();\n if (symbol?.declarations !== undefined) {\n const declaration = symbol.declarations[0];\n if (declaration !== undefined && isNamedTypeDeclaration(declaration)) {\n return declaration;\n }\n }\n\n const aliasDeclaration = type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration);\n return aliasDeclaration;\n}\n\nfunction getFallbackName(sourceNode: ts.Node | undefined, fallback = \"AnonymousType\"): string {\n if (sourceNode !== undefined && \"name\" in sourceNode) {\n const namedNode = sourceNode as ts.Node & { name?: ts.PropertyName | ts.BindingName };\n if (namedNode.name !== undefined && ts.isIdentifier(namedNode.name)) {\n return namedNode.name.text;\n }\n }\n\n return fallback;\n}\n\nfunction createObjectRootAnalysis(\n name: string,\n properties: readonly ObjectProperty[],\n typeRegistry: Record<string, TypeDefinition>,\n metadata?: ResolvedMetadata,\n annotations?: readonly AnnotationNode[]\n): IRClassAnalysis {\n const fields: FieldNode[] = properties.map((property) => ({\n kind: \"field\",\n name: property.name,\n ...(property.metadata !== undefined && { metadata: property.metadata }),\n type: property.type,\n required: !property.optional,\n constraints: property.constraints,\n annotations: property.annotations,\n provenance: property.provenance,\n }));\n\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields,\n fieldLayouts: fields.map(() => ({})),\n typeRegistry,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n instanceMethods: [],\n staticMethods: [],\n diagnostics: [],\n };\n}\n\ninterface RootTypeDescriptor {\n readonly name: string;\n readonly metadata?: ResolvedMetadata;\n readonly annotations?: readonly AnnotationNode[];\n readonly type: TypeNode;\n}\n\ninterface RootTypeOverride {\n readonly name?: string;\n readonly metadata?: ResolvedMetadata;\n readonly annotations?: readonly AnnotationNode[];\n}\n\nfunction omitApiName(metadata: ResolvedMetadata | undefined): ResolvedMetadata | undefined {\n if (metadata?.apiName === undefined) {\n return metadata;\n }\n\n const { apiName: _apiName, ...rest } = metadata;\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nfunction enforceRequiredMetadata(\n metadata: ResolvedMetadata | undefined,\n declarationKind: \"type\" | \"field\" | \"method\",\n logicalName: string,\n metadataPolicy: MetadataPolicyInput | undefined\n): void {\n const declarationPolicy = getDeclarationMetadataPolicy(\n normalizeMetadataPolicy(metadataPolicy),\n declarationKind\n );\n\n if (metadata?.apiName === undefined && declarationPolicy.apiName.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit apiName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.displayName === undefined &&\n declarationPolicy.displayName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.apiNamePlural === undefined &&\n declarationPolicy.apiName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.displayNamePlural === undefined &&\n declarationPolicy.displayName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n}\n\nfunction describeRootType(\n rootType: TypeNode,\n typeRegistry: Readonly<Record<string, TypeDefinition>>,\n fallbackName: string\n): RootTypeDescriptor {\n if (rootType.kind !== \"reference\") {\n return {\n name: fallbackName,\n type: rootType,\n };\n }\n\n const definition = typeRegistry[rootType.name];\n if (definition === undefined) {\n return {\n name: rootType.name,\n type: rootType,\n };\n }\n\n return {\n name: definition.name,\n ...(definition.metadata !== undefined && { metadata: definition.metadata }),\n ...(definition.annotations !== undefined &&\n definition.annotations.length > 0 && { annotations: definition.annotations }),\n type: definition.type,\n };\n}\n\nfunction toStandaloneJsonSchema(\n root: RootTypeDescriptor,\n typeRegistry: Record<string, TypeDefinition>,\n resolved: ReturnType<typeof resolveStaticOptions> | undefined\n): JsonSchema2020 {\n const syntheticFieldMetadata = omitApiName(root.metadata);\n const syntheticField: FieldNode = {\n kind: \"field\",\n name: \"__result\",\n metadata: {\n ...syntheticFieldMetadata,\n // Pin apiName so metadata-policy transforms (e.g. toStripeApiCase)\n // cannot rename this synthetic wrapper field. The lookup below\n // expects \"__result\" in the output schema properties.\n apiName: { value: \"__result\", source: \"explicit\" },\n },\n type: root.type,\n required: true,\n constraints: [],\n annotations: [...(root.annotations ?? [])],\n provenance: {\n surface: \"tsdoc\",\n file: \"\",\n line: 1,\n column: 0,\n },\n };\n\n const ir = resolveFormIRMetadata(\n {\n kind: \"form-ir\",\n name: root.name,\n irVersion: IR_VERSION,\n elements: [syntheticField],\n ...(root.metadata !== undefined && { metadata: root.metadata }),\n ...(root.annotations !== undefined &&\n root.annotations.length > 0 && { rootAnnotations: root.annotations }),\n typeRegistry,\n provenance: syntheticField.provenance,\n },\n {\n policy: normalizeMetadataPolicy(resolved?.metadata),\n surface: \"tsdoc\",\n rootLogicalName: root.name,\n }\n );\n\n const schema = generateJsonSchemaFromIR(ir, {\n extensionRegistry: resolved?.extensionRegistry,\n enumSerialization: resolved?.enumSerialization,\n vendorPrefix: resolved?.vendorPrefix,\n });\n\n const result = schema.properties?.[\"__result\"];\n if (result === undefined) {\n throw new Error(\"FormSpec failed to extract the standalone schema root from the synthetic IR.\");\n }\n\n if (schema.$defs === undefined || Object.keys(schema.$defs).length === 0) {\n return {\n ...(schema.$schema !== undefined && { $schema: schema.$schema }),\n ...result,\n };\n }\n\n return {\n ...(schema.$schema !== undefined && { $schema: schema.$schema }),\n ...result,\n $defs: schema.$defs,\n };\n}\n\nfunction generateSchemasFromAnalysis(\n analysis: IRClassAnalysis,\n filePath: string,\n resolved: ReturnType<typeof resolveStaticOptions> | undefined\n): DiscoveredTypeSchemas {\n return toDiscoveredTypeSchemas(\n generateClassSchemas(\n analysis,\n { file: filePath },\n {\n extensionRegistry: resolved?.extensionRegistry,\n enumSerialization: resolved?.enumSerialization,\n metadata: resolved?.metadata,\n vendorPrefix: resolved?.vendorPrefix,\n }\n ),\n analysis.metadata\n );\n}\n\nfunction generateSchemasFromResolvedType(\n options: GenerateSchemasFromTypeOptions,\n skipNamedDeclaration = false,\n rootOverride?: RootTypeOverride\n): DiscoveredTypeSchemas {\n const resolved = resolveStaticOptions(options);\n const namedDeclaration =\n skipNamedDeclaration || hasConcreteTypeArguments(options.type, options.context.checker)\n ? undefined\n : getNamedTypeDeclaration(options.type);\n if (namedDeclaration !== undefined) {\n return generateSchemasFromDeclaration({\n ...options,\n declaration: namedDeclaration,\n });\n }\n\n const filePath =\n options.sourceNode?.getSourceFile().fileName ?? options.context.sourceFile.fileName;\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const rootType = resolveTypeNode(\n options.type,\n options.context.checker,\n filePath,\n typeRegistry,\n new Set<ts.Type>(),\n options.sourceNode,\n createAnalyzerMetadataPolicy(resolved.metadata, options.discriminator),\n resolved.extensionRegistry,\n diagnostics\n );\n\n if (diagnostics.length > 0) {\n const diagnosticDetails = diagnostics\n .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)\n .join(\"; \");\n throw new Error(\n `FormSpec validation failed while generating discovered type schemas. ${diagnosticDetails}`\n );\n }\n\n const describedRoot = describeRootType(\n rootType,\n typeRegistry,\n options.name ?? getFallbackName(options.sourceNode)\n );\n const mergedMetadata = mergeResolvedMetadata(describedRoot.metadata, rootOverride?.metadata);\n const root: RootTypeDescriptor = {\n ...describedRoot,\n ...(rootOverride?.name !== undefined && { name: rootOverride.name }),\n ...(mergedMetadata !== undefined && { metadata: mergedMetadata }),\n ...(rootOverride?.annotations !== undefined && { annotations: rootOverride.annotations }),\n };\n\n if (root.type.kind === \"object\") {\n return generateSchemasFromAnalysis(\n createObjectRootAnalysis(\n options.name ?? root.name,\n root.type.properties,\n typeRegistry,\n root.metadata,\n root.annotations\n ),\n filePath,\n resolved\n );\n }\n\n return {\n jsonSchema: toStandaloneJsonSchema(root, typeRegistry, resolved),\n uiSchema: null,\n ...(root.metadata !== undefined && { resolvedMetadata: root.metadata }),\n };\n}\n\n/**\n * Generates schemas from a resolved declaration using the supported public\n * static-build workflow.\n *\n * Named declarations reuse the same analyzer semantics as FormSpec's existing\n * top-level generation APIs. Non-object type aliases fall back to the generic\n * resolved-type entry point.\n *\n * @public\n */\nexport function generateSchemasFromDeclaration(\n options: GenerateSchemasFromDeclarationOptions\n): DiscoveredTypeSchemas {\n const filePath = options.declaration.getSourceFile().fileName;\n const resolved = resolveStaticOptions(options);\n\n if (ts.isClassDeclaration(options.declaration)) {\n return generateSchemasFromAnalysis(\n analyzeClassToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n ),\n filePath,\n resolved\n );\n }\n\n if (ts.isInterfaceDeclaration(options.declaration)) {\n return generateSchemasFromAnalysis(\n analyzeInterfaceToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n ),\n filePath,\n resolved\n );\n }\n\n if (ts.isTypeAliasDeclaration(options.declaration)) {\n const analyzedAlias = analyzeTypeAliasToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n );\n if (analyzedAlias.ok) {\n return generateSchemasFromAnalysis(analyzedAlias.analysis, filePath, resolved);\n }\n const aliasRootInfo = analyzeDeclarationRootInfo(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata\n );\n if (aliasRootInfo.diagnostics.length > 0) {\n const diagnosticDetails = aliasRootInfo.diagnostics\n .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)\n .join(\"; \");\n throw new Error(\n `FormSpec validation failed while generating discovered type schemas. ${diagnosticDetails}`\n );\n }\n\n return generateSchemasFromResolvedType(\n {\n ...options,\n type: options.context.checker.getTypeAtLocation(options.declaration),\n sourceNode: options.declaration,\n name: options.declaration.name.text,\n },\n true,\n {\n name: options.declaration.name.text,\n ...(aliasRootInfo.metadata !== undefined && { metadata: aliasRootInfo.metadata }),\n ...(aliasRootInfo.annotations.length > 0 && { annotations: aliasRootInfo.annotations }),\n }\n );\n }\n\n const _exhaustive: never = options.declaration;\n return _exhaustive;\n}\n\n/**\n * Generates schemas from a resolved TypeScript type.\n *\n * This is the advanced public entry point for build tooling that already uses\n * the TypeScript compiler API to discover types before handing them to\n * FormSpec.\n *\n * @public\n */\nexport function generateSchemasFromType(\n options: GenerateSchemasFromTypeOptions\n): DiscoveredTypeSchemas {\n return generateSchemasFromResolvedType(options);\n}\n\n/**\n * Generates schemas for a method or function parameter type.\n *\n * @public\n */\nexport function generateSchemasFromParameter(\n options: GenerateSchemasFromParameterOptions\n): DiscoveredTypeSchemas {\n return generateSchemasFromResolvedType({\n ...options,\n type: options.context.checker.getTypeAtLocation(options.parameter),\n sourceNode: options.parameter,\n name: getFallbackName(options.parameter, \"Parameter\"),\n });\n}\n\n/**\n * Generates schemas for a method or function return type.\n *\n * Awaited `Promise<T>`-style return types are unwrapped before generation.\n *\n * @public\n */\nexport function generateSchemasFromReturnType(\n options: GenerateSchemasFromReturnTypeOptions\n): DiscoveredTypeSchemas {\n const signature = options.context.checker.getSignatureFromDeclaration(options.declaration);\n const returnType =\n signature !== undefined\n ? options.context.checker.getReturnTypeOfSignature(signature)\n : options.context.checker.getTypeAtLocation(options.declaration);\n const type = unwrapPromiseType(options.context.checker, returnType);\n const sourceNode =\n type !== returnType\n ? (unwrapPromiseTypeNode(options.declaration.type) ??\n options.declaration.type ??\n options.declaration)\n : (options.declaration.type ?? options.declaration);\n\n const fallbackName =\n options.declaration.name !== undefined && ts.isIdentifier(options.declaration.name)\n ? `${options.declaration.name.text}ReturnType`\n : \"ReturnType\";\n\n return generateSchemasFromResolvedType({\n ...options,\n type,\n sourceNode,\n name: fallbackName,\n });\n}\n\n/**\n * Resolves metadata from a declaration using FormSpec's configured metadata\n * policy for the matching declaration kind.\n *\n * @public\n */\nexport function resolveDeclarationMetadata(\n options: ResolveDeclarationMetadataOptions\n): ResolvedMetadata | undefined {\n const resolved = resolveStaticOptions(options);\n const analysis = analyzeMetadataForNodeWithChecker({\n checker: options.context.checker,\n node: options.declaration,\n metadata: resolved.metadata,\n extensions: resolved.extensionRegistry?.extensions,\n buildContext: options.context,\n });\n if (analysis === null) {\n return undefined;\n }\n\n const metadata = analysis.resolvedMetadata;\n\n enforceRequiredMetadata(metadata, analysis.declarationKind, analysis.logicalName, resolved.metadata);\n return metadata;\n}\n\nfunction unwrapPromiseType(checker: ts.TypeChecker, type: ts.Type): ts.Type {\n if (!(\"getAwaitedType\" in checker) || typeof checker.getAwaitedType !== \"function\") {\n return type;\n }\n\n const awaited = checker.getAwaitedType(type) ?? type;\n if (awaited === type && looksLikePromiseType(checker, type)) {\n // The type prints as `Promise<T>` but the checker could not await it. The\n // most common cause is a TypeScript compiler host that cannot locate its\n // default lib files (e.g. `lib.es2015.promise.d.ts`) — for example after\n // bundling `typescript` with esbuild. Without this check, the payload type\n // would silently degrade to `{ type: \"string\" }` in the generated schema\n // (see issue #256).\n throw new Error(\n `FormSpec could not unwrap the awaited type from \"${checker.typeToString(type)}\". ` +\n `This usually indicates the TypeScript compiler host cannot resolve its default ` +\n `lib files (for example \"lib.es2015.promise.d.ts\"). Ensure the program is configured ` +\n `with the standard library available to \\`ts.createProgram\\`.`\n );\n }\n\n return awaited;\n}\n\nfunction looksLikePromiseType(checker: ts.TypeChecker, type: ts.Type): boolean {\n const symbolName = type.getSymbol()?.getName();\n if (symbolName === \"Promise\" || symbolName === \"PromiseLike\") {\n return true;\n }\n return /^(?:Promise|PromiseLike)\\b/.test(checker.typeToString(type));\n}\n\nfunction unwrapPromiseTypeNode(typeNode: ts.TypeNode | undefined): ts.TypeNode | undefined {\n if (typeNode === undefined) {\n return undefined;\n }\n\n if (ts.isParenthesizedTypeNode(typeNode)) {\n const unwrapped = unwrapPromiseTypeNode(typeNode.type);\n return unwrapped ?? typeNode;\n }\n\n return isPromiseTypeReferenceNode(typeNode) ? typeNode.typeArguments[0] : typeNode;\n}\n\nfunction isPromiseTypeReferenceNode(\n typeNode: ts.TypeNode\n): typeNode is ts.TypeReferenceNode & { typeArguments: [ts.TypeNode, ...ts.TypeNode[]] } {\n return (\n ts.isTypeReferenceNode(typeNode) &&\n ts.isIdentifier(typeNode.typeName) &&\n typeNode.typeName.text === \"Promise\" &&\n typeNode.typeArguments !== undefined &&\n typeNode.typeArguments.length > 0\n );\n}\n","/**\n * Mixed-authoring schema generator.\n *\n * Composes a statically analyzed TSDoc/class/interface/type-alias model with\n * ChainDSL-authored field overlays. The static model remains authoritative for\n * structure and constraints; overlays may add runtime field behavior such as\n * dynamic enum or dynamic schema metadata.\n */\n\nimport type { FormElement, FormSpec } from \"@formspec/core\";\nimport type { AnnotationNode, FieldNode, FormIRElement, TypeNode } from \"@formspec/core/internals\";\nimport type { JsonSchema2020 } from \"../json-schema/ir-generator.js\";\nimport { generateJsonSchemaFromIR } from \"../json-schema/ir-generator.js\";\nimport { generateUiSchemaFromIR } from \"../ui-schema/ir-generator.js\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport { canonicalizeChainDSL, canonicalizeTSDoc } from \"../canonicalize/index.js\";\nimport { analyzeNamedTypeToIR } from \"../analyzer/program.js\";\nimport type { IRClassAnalysis } from \"../analyzer/class-analyzer.js\";\nimport type { StaticSchemaGenerationOptions } from \"./class-schema.js\";\nimport { mergeResolvedMetadata } from \"../metadata/index.js\";\n\n/**\n * Result of generating schemas from a mixed-authoring composition.\n *\n * @public\n */\nexport interface MixedAuthoringSchemas {\n /** JSON Schema 2020-12 for validation. */\n readonly jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering. */\n readonly uiSchema: UISchema;\n}\n\n/**\n * Options for generating mixed-authoring schemas.\n *\n * The `typeName` can resolve to a class, interface, or object type alias, just\n * like `generateSchemas()`.\n *\n * @public\n */\nexport interface BuildMixedAuthoringSchemasOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the class, interface, or type alias to analyze. */\n readonly typeName: string;\n /** ChainDSL overlays to apply to the static model. Groups and conditionals are flattened by field name. */\n readonly overlays: FormSpec<readonly FormElement[]>;\n}\n\n/**\n * Builds JSON Schema and UI Schema from a TSDoc-derived model with ChainDSL\n * field overlays.\n *\n * Overlays are matched by field name. The static model wins for structure,\n * ordering, and constraints; ChainDSL overlays may contribute dynamic runtime\n * field metadata such as dynamic enum or dynamic schema keywords, and may fill\n * in missing annotations.\n *\n * @public\n */\nexport function buildMixedAuthoringSchemas(\n options: BuildMixedAuthoringSchemasOptions\n): MixedAuthoringSchemas {\n const { filePath, typeName, overlays, ...schemaOptions } = options;\n const analysis = analyzeNamedTypeToIR(\n filePath,\n typeName,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.metadata,\n schemaOptions.discriminator\n );\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const composedAnalysis = composeAnalysisWithOverlays(analysis, overlays, schemaOptions.metadata);\n const ir = canonicalizeTSDoc(\n composedAnalysis,\n { file: filePath },\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.metadata !== undefined ? { metadata: schemaOptions.metadata } : undefined\n );\n\n return {\n jsonSchema: generateJsonSchemaFromIR(ir, schemaOptions),\n uiSchema: generateUiSchemaFromIR(ir),\n };\n}\n\nfunction composeAnalysisWithOverlays(\n analysis: IRClassAnalysis,\n overlays: FormSpec<readonly FormElement[]>,\n metadata: StaticSchemaGenerationOptions[\"metadata\"]\n): IRClassAnalysis {\n const overlayIR = canonicalizeChainDSL(\n overlays,\n metadata !== undefined ? { metadata } : undefined\n );\n const overlayFields = collectOverlayFields(overlayIR.elements);\n\n if (overlayFields.length === 0) {\n return analysis;\n }\n\n const overlayByName = new Map<string, FieldNode>();\n for (const field of overlayFields) {\n if (overlayByName.has(field.name)) {\n throw new Error(`Mixed-authoring overlays define \"${field.name}\" more than once`);\n }\n overlayByName.set(field.name, field);\n }\n\n const mergedFields: FieldNode[] = [];\n\n for (const baseField of analysis.fields) {\n const overlayField = overlayByName.get(baseField.name);\n if (overlayField === undefined) {\n mergedFields.push(baseField);\n continue;\n }\n\n mergedFields.push(mergeFieldOverlay(baseField, overlayField, analysis.typeRegistry));\n overlayByName.delete(baseField.name);\n }\n\n if (overlayByName.size > 0) {\n const unknownFields = [...overlayByName.keys()].sort().join(\", \");\n throw new Error(\n `Mixed-authoring overlays reference fields that are not present in the static model: ${unknownFields}`\n );\n }\n\n return {\n ...analysis,\n fields: mergedFields,\n };\n}\n\nfunction collectOverlayFields(elements: readonly FormIRElement[]): FieldNode[] {\n const fields: FieldNode[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n fields.push(element);\n break;\n case \"group\":\n fields.push(...collectOverlayFields(element.elements));\n break;\n case \"conditional\":\n fields.push(...collectOverlayFields(element.elements));\n break;\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n\n return fields;\n}\n\nfunction mergeFieldOverlay(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): FieldNode {\n assertSupportedOverlayField(baseField, overlayField);\n const metadata = mergeResolvedMetadata(baseField.metadata, overlayField.metadata);\n return {\n ...baseField,\n ...(metadata !== undefined && { metadata }),\n type: mergeFieldType(baseField, overlayField, typeRegistry),\n annotations: mergeAnnotations(baseField.annotations, overlayField.annotations),\n };\n}\n\nfunction assertSupportedOverlayField(baseField: FieldNode, overlayField: FieldNode): void {\n if (overlayField.constraints.length > 0) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" cannot define constraints; keep constraints on the static model`\n );\n }\n\n if (overlayField.required && !baseField.required) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" cannot change requiredness; keep requiredness on the static model`\n );\n }\n}\n\nfunction mergeFieldType(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): TypeNode {\n const { type: baseType } = baseField;\n const { type: overlayType } = overlayField;\n\n if (overlayType.kind === \"object\" || overlayType.kind === \"array\") {\n throw new Error(\n `Mixed-authoring overlays do not support nested object or array overlays for \"${baseField.name}\"`\n );\n }\n\n if (overlayType.kind === \"dynamic\") {\n if (!isCompatibleDynamicOverlay(baseField, overlayField, typeRegistry)) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" is incompatible with the static field type`\n );\n }\n return overlayType;\n }\n\n if (!isSameStaticTypeShape(baseType, overlayType)) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" must preserve the static field type`\n );\n }\n\n return baseType;\n}\n\nfunction isCompatibleDynamicOverlay(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): boolean {\n const overlayType = overlayField.type;\n if (overlayType.kind !== \"dynamic\") {\n return false;\n }\n\n const resolvedBaseType = resolveReferenceType(baseField.type, typeRegistry);\n if (resolvedBaseType === null) {\n return false;\n }\n\n if (overlayType.dynamicKind === \"enum\") {\n return resolvedBaseType.kind === \"primitive\"\n ? resolvedBaseType.primitiveKind === \"string\"\n : resolvedBaseType.kind === \"enum\";\n }\n\n return resolvedBaseType.kind === \"object\" || resolvedBaseType.kind === \"record\";\n}\n\nfunction resolveReferenceType(\n type: TypeNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"],\n seen = new Set<string>()\n): TypeNode | null {\n if (type.kind !== \"reference\") {\n return type;\n }\n\n if (seen.has(type.name)) {\n return null;\n }\n\n const definition = typeRegistry[type.name];\n if (definition === undefined) {\n return null;\n }\n\n seen.add(type.name);\n return resolveReferenceType(definition.type, typeRegistry, seen);\n}\n\nfunction isSameStaticTypeShape(baseType: TypeNode, overlayType: TypeNode): boolean {\n if (baseType.kind !== overlayType.kind) {\n return false;\n }\n\n switch (baseType.kind) {\n case \"primitive\":\n return (\n overlayType.kind === \"primitive\" && baseType.primitiveKind === overlayType.primitiveKind\n );\n case \"enum\":\n return overlayType.kind === \"enum\";\n case \"dynamic\":\n return (\n overlayType.kind === \"dynamic\" &&\n baseType.dynamicKind === overlayType.dynamicKind &&\n baseType.sourceKey === overlayType.sourceKey\n );\n case \"record\":\n return overlayType.kind === \"record\";\n case \"reference\":\n return overlayType.kind === \"reference\" && baseType.name === overlayType.name;\n case \"union\":\n return overlayType.kind === \"union\";\n case \"custom\":\n return overlayType.kind === \"custom\" && baseType.typeId === overlayType.typeId;\n case \"object\":\n case \"array\":\n // Mixed authoring keeps the static type verbatim for structured fields.\n // We only need shape equality for scalar-like overlays that could replace\n // the static field type if we returned the overlay type by mistake.\n return true;\n default: {\n const _exhaustive: never = baseType;\n return _exhaustive;\n }\n }\n}\n\nfunction mergeAnnotations(\n baseAnnotations: readonly AnnotationNode[],\n overlayAnnotations: readonly AnnotationNode[]\n): AnnotationNode[] {\n const baseKeys = new Set(baseAnnotations.map(annotationKey));\n const overlayOnly = overlayAnnotations.filter(\n (annotation) => !baseKeys.has(annotationKey(annotation))\n );\n return [...baseAnnotations, ...overlayOnly];\n}\n\nfunction annotationKey(annotation: AnnotationNode): string {\n return annotation.annotationKind === \"custom\"\n ? `${annotation.annotationKind}:${annotation.annotationId}`\n : annotation.annotationKind;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BA,IAAAA,eAA2B;;;ACnB3B,kBAA2B;;;AC+C3B,uBAAuD;;;ACjBvD,IAAM,eAAwC,MAAM;AAEpD,SAAS,uBACP,OACuC;AACvC,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAEA,SAAS,sBACP,OAC+B;AAC/B,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,eAAe,uBAAuB,MAAM,aAAa;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,eAAe,uBAAuB,MAAM,aAAa;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,eAAe,uBAAuB,OAAO,aAAa;AAAA,EAC5D;AACF;AAEA,SAAS,2BACP,OACqC;AACrC,SAAO;AAAA,IACL,SAAS,sBAAsB,OAAO,OAAO;AAAA,IAC7C,aAAa,sBAAsB,OAAO,WAAW;AAAA,EACvD;AACF;AAEA,SAAS,qCACP,OACuC;AACvC,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,0BACP,OACoC;AACpC,SAAO;AAAA,IACL,aAAa,qCAAqC,OAAO,WAAW;AAAA,EACtE;AACF;AAEO,SAAS,wBAAwB,OAAuD;AAC7F,SAAO;AAAA,IACL,MAAM,2BAA2B,OAAO,IAAI;AAAA,IAC5C,OAAO,2BAA2B,OAAO,KAAK;AAAA,IAC9C,QAAQ,2BAA2B,OAAO,MAAM;AAAA,IAChD,YAAY,0BAA0B,OAAO,UAAU;AAAA,EACzD;AACF;AAEO,SAAS,6BACd,QACA,iBACqC;AACrC,SAAO,OAAO,eAAe;AAC/B;AAEO,SAAS,oBACd,SACA,iBACA,aACA,cAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,iBAAiB,UAAa,EAAE,aAAa;AAAA,EACnD;AACF;;;AC7HA,SAAS,iBAAiB,OAA+D;AACvF,SAAO,UAAU,UAAa,MAAM,KAAK,MAAM,KAAK,EAAE,OAAO,QAAQ,WAAW,IAAI;AACtF;AAEA,SAAS,2BACP,UAC8B;AAC9B,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,SAAS,OAAO;AACjD,QAAM,cAAc,iBAAiB,SAAS,WAAW;AACzD,QAAM,gBAAgB,iBAAiB,SAAS,aAAa;AAC7D,QAAM,oBAAoB,iBAAiB,SAAS,iBAAiB;AACrE,QAAM,WAA6B;AAAA,IACjC,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,kBAAkB,UAAa,EAAE,cAAc;AAAA,IACnD,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,EAC7D;AAEA,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACvD;AAEA,SAAS,cACP,SACA,QACA,SACA,eACoC;AACpC,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,UAAM,IAAI;AAAA,MACR,qCAAqC,aAAa,QAAQ,QAAQ,eAAe,KAAK,QAAQ,WAAW,YAAY,QAAQ,OAAO;AAAA,IACtI;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OAAO,MAAM,OAAO;AAC1C,SAAO,cAAc,KAAK,MAAM,KAAK,EAAE,OAAO,eAAe,QAAQ,WAAW,IAAI;AACtF;AAEA,SAAS,cACP,SACA,UACA,QACA,SACA,eACoC;AACpC,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,UAAM,IAAI;AAAA,MACR,qCAAqC,aAAa,QAAQ,QAAQ,eAAe,KAAK,QAAQ,WAAW,YAAY,QAAQ,OAAO;AAAA,IACtI;AAAA,EACF;AAEA,MAAI,aAAa,UAAa,OAAO,SAAS,oBAAoB;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,QAAQ,EAAE,GAAG,SAAS,UAAU,SAAS,MAAM,CAAC;AAC3E,SAAO,YAAY,KAAK,MAAM,KAAK,EAAE,OAAO,aAAa,QAAQ,WAAW,IAAI;AAClF;AAEA,SAAS,wBACP,SACA,QACA,SAC8B;AAC9B,QAAM,UAAU,cAAc,SAAS,SAAS,OAAO,SAAS,SAAS,SAAS;AAClF,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACA,QAAM,gBAAgB;AAAA,IACpB,SAAS;AAAA,IACT;AAAA,IACA,OAAO,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACA,QAAM,oBAAoB;AAAA,IACxB,SAAS;AAAA,IACT;AAAA,IACA,OAAO,YAAY;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AAEA,MACE,YAAY,UACZ,gBAAgB,UAChB,kBAAkB,UAClB,sBAAsB,QACtB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,kBAAkB,UAAa,EAAE,cAAc;AAAA,IACnD,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,EAC7D;AACF;AAEA,SAAS,0BACP,WACA,cACoC;AACpC,MAAI,cAAc,WAAW,YAAY;AACvC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW,YAAY;AACpC,WAAO;AAAA,EACT;AACA,SAAO,aAAa;AACtB;AAEA,SAAS,6BACP,SACA,QACA,SACoB;AACpB,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,UAAM,IAAI;AAAA,MACR,kEAAkE,QAAQ,WAAW,YAAY,QAAQ,OAAO;AAAA,IAClH;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,oBAAoB;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OAAO,MAAM,OAAO,EAAE,KAAK;AACjD,SAAO,kBAAkB,KAAK,gBAAgB;AAChD;AAEA,SAAS,wBACP,MACA,SACc;AACd,QAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,WAAW;AAC3C,UAAM,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,QAAQ,OAAO,WAAW;AAAA,MAC1B;AAAA,QACE,SAAS,QAAQ;AAAA,QACjB,aAAa,OAAO,OAAO,KAAK;AAAA,QAChC,aAAa,OAAO;AAAA,QACpB,GAAI,QAAQ,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,MACjF;AAAA,IACF;AAEA,QAAI,gBAAgB,OAAO,aAAa;AACtC,aAAO;AAAA,IACT;AAEA,WAAO,gBAAgB,SACnB,EAAE,OAAO,OAAO,MAAM,IACtB,EAAE,OAAO,OAAO,OAAO,YAAY;AAAA,EACzC,CAAC;AAED,SAAO,QAAQ,KAAK,CAAC,QAAQ,UAAU,WAAW,KAAK,QAAQ,KAAK,CAAC,IACjE,EAAE,GAAG,MAAM,QAAQ,IACnB;AACN;AAEA,SAAS,wBAAwB,MAAgB,SAAiD;AAChG,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,wBAAwB,KAAK,OAAO,OAAO;AAAA,MACpD;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,KAAK,WAAW;AAAA,UAAI,CAAC,aAC/B,8BAA8B,UAAU,OAAO;AAAA,QACjD;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW,wBAAwB,KAAK,WAAW,OAAO;AAAA,MAC5D;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,wBAAwB,QAAQ,OAAO,CAAC;AAAA,MAChF;AAAA,IAEF,KAAK;AACH,aAAO,wBAAwB,MAAM,OAAO;AAAA,IAE9C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IAET,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,8BACP,UACA,SACgB;AAChB,QAAM,WAAW,wBAAwB,SAAS,UAAU,QAAQ,OAAO,OAAO;AAAA,IAChF,SAAS,QAAQ;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa,SAAS;AAAA,IACtB,GAAI,QAAQ,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,EACjF,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,MAAM,wBAAwB,SAAS,MAAM,OAAO;AAAA,EACtD;AACF;AAEA,SAAS,yBACP,OACA,SACW;AACX,QAAM,WAAW,wBAAwB,MAAM,UAAU,QAAQ,OAAO,OAAO;AAAA,IAC7E,SAAS,QAAQ;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,GAAI,QAAQ,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,EACjF,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,MAAM,wBAAwB,MAAM,MAAM,OAAO;AAAA,EACnD;AACF;AAEA,SAAS,2BACP,SACA,SACe;AACf,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,yBAAyB,SAAS,OAAO;AAAA,IAElD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,QAAQ,SAAS,IAAI,CAAC,UAAU,2BAA2B,OAAO,OAAO,CAAC;AAAA,MACtF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,QAAQ,SAAS,IAAI,CAAC,UAAU,2BAA2B,OAAO,OAAO,CAAC;AAAA,MACtF;AAAA,IAEF,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,8BACP,gBACA,SACgB;AAChB,QAAM,WAAW,wBAAwB,eAAe,UAAU,QAAQ,OAAO,MAAM;AAAA,IACrF,SAAS,QAAQ;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa,eAAe;AAAA,IAC5B,GAAI,QAAQ,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,EACjF,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,MAAM,wBAAwB,eAAe,MAAM,OAAO;AAAA,EAC5D;AACF;AAEO,SAAS,gBACd,UACA,QACA,SAC8B;AAC9B,SAAO,wBAAwB,2BAA2B,QAAQ,GAAG,QAAQ,OAAO;AACtF;AAEO,SAAS,sBACd,cACA,iBAC8B;AAC9B,QAAM,UAAU,0BAA0B,cAAc,SAAS,iBAAiB,OAAO;AACzF,QAAM,cAAc;AAAA,IAClB,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AACA,QAAM,gBAAgB;AAAA,IACpB,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AACA,QAAM,oBAAoB;AAAA,IACxB,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAEA,MACE,YAAY,UACZ,gBAAgB,UAChB,kBAAkB,UAClB,sBAAsB,QACtB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,kBAAkB,UAAa,EAAE,cAAc;AAAA,IACnD,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,EAC7D;AACF;AAEO,SAAS,kBACd,aACA,UACQ;AACR,SAAO,UAAU,SAAS,SAAS;AACrC;AAEO,SAAS,eAAe,UAA4D;AACzF,SAAO,UAAU,aAAa;AAChC;AAEO,SAAS,sBAAsB,IAAY,SAA+C;AAC/F,QAAM,WACJ,QAAQ,4BAA4B,QAChC,GAAG,WACH,wBAAwB,GAAG,UAAU,QAAQ,OAAO,MAAM;AAAA,IACxD,SAAS,QAAQ;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa,QAAQ,mBAAmB,GAAG,QAAQ;AAAA,IACnD,GAAI,QAAQ,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,EACjF,CAAC;AAEP,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,UAAU,GAAG,SAAS,IAAI,CAAC,YAAY,2BAA2B,SAAS,OAAO,CAAC;AAAA,IACnF,cAAc,OAAO;AAAA,MACnB,OAAO,QAAQ,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,UAAU,MAAM;AAAA,QAC1D;AAAA,QACA,8BAA8B,YAAY,OAAO;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AF5VA,IAAM,uBAAmC;AAAA,EACvC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV;AAMA,SAAS,QAAQ,IAAsD;AACrE,SAAO,GAAG,UAAU;AACtB;AAEA,SAAS,cACP,IAC4D;AAC5D,SAAO,GAAG,UAAU;AACtB;AAEA,SAAS,QAAQ,IAAiC;AAChD,SAAO,GAAG,UAAU;AACtB;AAgBO,SAAS,qBACd,MACA,SACQ;AACR,QAAM,iBAAiB;AAAA,IACrB,SAAS,gBAAY,6CAA2B,IAAI;AAAA,EACtD;AACA,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU,qBAAqB,KAAK,UAAU,cAAc;AAAA,IAC5D,iBAAiB,CAAC;AAAA,IAClB,cAAc,CAAC;AAAA,IACf,YAAY;AAAA,EACd;AAEA,SAAO,sBAAsB,IAAI;AAAA,IAC/B,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA;AAAA,IAGT,yBAAyB;AAAA,EAC3B,CAAC;AACH;AASA,SAAS,qBACP,UACA,gBACiB;AACjB,SAAO,SAAS,IAAI,CAAC,YAAY,oBAAoB,SAAS,cAAc,CAAC;AAC/E;AAKA,SAAS,oBACP,SACA,gBACe;AACf,MAAI,QAAQ,OAAO,GAAG;AACpB,WAAO,kBAAkB,SAAS,cAAc;AAAA,EAClD;AACA,MAAI,QAAQ,OAAO,GAAG;AACpB,WAAO,kBAAkB,SAAS,cAAc;AAAA,EAClD;AACA,MAAI,cAAc,OAAO,GAAG;AAC1B,WAAO,wBAAwB,SAAS,cAAc;AAAA,EACxD;AACA,QAAM,cAAqB;AAC3B,QAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,WAAW,CAAC,EAAE;AACxE;AASA,SAAS,kBACP,OACA,gBACW;AACX,UAAQ,MAAM,QAAQ;AAAA,IACpB,KAAK;AACH,aAAO,sBAAsB,OAAO,cAAc;AAAA,IACpD,KAAK;AACH,aAAO,wBAAwB,OAAO,cAAc;AAAA,IACtD,KAAK;AACH,aAAO,yBAAyB,OAAO,cAAc;AAAA,IACvD,KAAK;AACH,aAAO,4BAA4B,OAAO,cAAc;AAAA,IAC1D,KAAK;AACH,aAAO,6BAA6B,OAAO,cAAc;AAAA,IAC3D,KAAK;AACH,aAAO,+BAA+B,OAAO,cAAc;AAAA,IAC7D,KAAK;AACH,aAAO,uBAAuB,OAAO,cAAc;AAAA,IACrD,KAAK;AACH,aAAO,wBAAwB,OAAO,cAAc;AAAA,IACtD,SAAS;AACP,YAAM,cAAqB;AAC3B,YAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,WAAW,CAAC,EAAE;AAAA,IACtE;AAAA,EACF;AACF;AAMA,SAAS,sBACP,OACA,gBACW;AACX,QAAM,OAA0B,EAAE,MAAM,aAAa,eAAe,SAAS;AAC7E,QAAM,cAAgC,CAAC;AAEvC,MAAI,MAAM,cAAc,QAAW;AACjC,UAAM,IAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,MAAI,MAAM,cAAc,QAAW;AACjC,UAAM,IAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,MAAI,MAAM,YAAY,QAAW;AAC/B,UAAM,IAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,GAAG,MAAM,WAAW;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,gBACW;AACX,QAAM,OAA0B,EAAE,MAAM,aAAa,eAAe,SAAS;AAC7E,QAAM,cAAgC,CAAC;AAEvC,MAAI,MAAM,QAAQ,QAAW;AAC3B,UAAM,IAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,MAAI,MAAM,QAAQ,QAAW;AAC3B,UAAM,IAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,MAAI,MAAM,eAAe,QAAW;AAClC,UAAM,IAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,yBACP,OACA,gBACW;AACX,QAAM,OAA0B,EAAE,MAAM,aAAa,eAAe,UAAU;AAC9E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,4BACP,OACA,gBACW;AACX,QAAM,UAAwB,MAAM,QAAQ,IAAI,CAAC,QAAQ;AACvD,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO,EAAE,OAAO,IAAI;AAAA,IACtB;AAEA,WAAO,EAAE,OAAO,IAAI,IAAI,aAAa,IAAI,MAAM;AAAA,EACjD,CAAC;AAED,QAAM,OAAqB,EAAE,MAAM,QAAQ,QAAQ;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,6BACP,OACA,gBACW;AACX,QAAM,OAAwB;AAAA,IAC5B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,iBAAiB,MAAM,SAAS,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC;AAAA,EACvD;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,+BACP,OACA,gBACW;AACX,QAAM,OAAwB;AAAA,IAC5B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,iBAAiB,CAAC;AAAA,EACpB;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,uBACP,OACA,gBACW;AAEX,QAAM,iBAAiB,sBAAsB,MAAM,OAAO,cAAc;AACxE,QAAM,YAA4B;AAAA,IAChC,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,sBAAsB;AAAA,EACxB;AACA,QAAM,OAAsB,EAAE,MAAM,SAAS,OAAO,UAAU;AAE9D,QAAM,cAAgC,CAAC;AACvC,MAAI,MAAM,aAAa,QAAW;AAChC,UAAM,IAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AACA,MAAI,MAAM,aAAa,QAAW;AAChC,UAAM,IAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,gBACW;AACX,QAAM,aAAa,sBAAsB,MAAM,YAAY,cAAc;AACzE,QAAM,OAAuB;AAAA,IAC3B,MAAM;AAAA,IACN;AAAA,IACA,sBAAsB;AAAA,EACxB;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,qBAAqB,MAAM,MAAM,OAAO,cAAc;AAAA,IACtD;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,uBAAuB,KAAK,CAAC;AAAA,EAChD;AACF;AAMA,SAAS,kBACP,GACA,gBACiB;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,EAAE;AAAA,IACT,UAAU,qBAAqB,EAAE,UAAU,cAAc;AAAA,IACzD,YAAY;AAAA,EACd;AACF;AAEA,SAAS,wBACP,GACA,gBACuB;AACvB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,EAAE;AAAA;AAAA;AAAA,IAGb,OAAO,gBAAgB,EAAE,KAAK;AAAA,IAC9B,UAAU,qBAAqB,EAAE,UAAU,cAAc;AAAA,IACzD,YAAY;AAAA,EACd;AACF;AAYA,SAAS,gBAAgB,GAAuB;AAC9C,MAAI,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW;AAC1F,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,WAAO,EAAE,IAAI,eAAe;AAAA,EAC9B;AACA,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,SAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC1C,aAAO,GAAG,IAAI,gBAAgB,GAAG;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,UAAU,+CAA+C,OAAO,CAAC,EAAE;AAC/E;AAKA,SAAS,eACP,MACA,UACA,MACA,UACA,aACA,cAAgC,CAAC,GACtB;AACX,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC;AAAA,IACA,UAAU,aAAa;AAAA,IACvB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAKA,SAAS,iBAAiB,OAAgB,aAAwC;AAChF,QAAM,cAAgC,CAAC;AAEvC,MAAI,UAAU,QAAW;AACvB,UAAM,IAA+B;AAAA,MACnC,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,MAAI,gBAAgB,QAAW;AAC7B,UAAM,IAA+B;AAAA,MACnC,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AACA,gBAAY,KAAK,CAAC;AAAA,EACpB;AAEA,SAAO;AACT;AAiBA,SAAS,sBACP,UACA,gBACA,oBAAoB,OACF;AAClB,QAAM,aAA+B,CAAC;AAEtC,aAAW,MAAM,UAAU;AACzB,QAAI,QAAQ,EAAE,GAAG;AACf,YAAM,YAAY,kBAAkB,IAAI,cAAc;AACtD,iBAAW,KAAK;AAAA,QACd,MAAM,UAAU;AAAA,QAChB,GAAI,UAAU,aAAa,UAAa,EAAE,UAAU,UAAU,SAAS;AAAA,QACvE,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,QAIhB,UAAU,qBAAqB,CAAC,UAAU;AAAA,QAC1C,aAAa,UAAU;AAAA,QACvB,aAAa,UAAU;AAAA,QACvB,YAAY;AAAA,MACd,CAAC;AAAA,IACH,WAAW,QAAQ,EAAE,GAAG;AAGtB,iBAAW,KAAK,GAAG,sBAAsB,GAAG,UAAU,gBAAgB,iBAAiB,CAAC;AAAA,IAC1F,WAAW,cAAc,EAAE,GAAG;AAG5B,iBAAW,KAAK,GAAG,sBAAsB,GAAG,UAAU,gBAAgB,IAAI,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAGT;AACrB,MAAI,MAAM,UAAU,UAAa,MAAM,gBAAgB,QAAW;AAChE,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACA,SAAO,MAAM,eAAe,MAAM;AACpC;AAEA,SAAS,qBACP,aACA,OAKA,gBAC8B;AAC9B,QAAM,cAAc,uBAAuB,KAAK;AAChD,SAAO;AAAA,IACL;AAAA,MACE,GAAI,MAAM,YAAY,UAAa,EAAE,SAAS,MAAM,QAAQ;AAAA,MAC5D,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IACjD;AAAA,IACA,6BAA6B,gBAAgB,OAAO;AAAA,IACpD,oBAAoB,aAAa,SAAS,WAAW;AAAA,EACvD;AACF;;;AG9lBA,IAAAC,oBAA2B;AA8BpB,SAAS,kBACd,UACA,QACA,SACQ;AACR,QAAM,OAAO,QAAQ,QAAQ;AAE7B,QAAM,aAAyB;AAAA,IAC7B,SAAS;AAAA,IACT;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAEA,QAAM,WAAW,iBAAiB,SAAS,QAAQ,SAAS,cAAc,UAAU;AAEpF,QAAM,KAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,WAAW;AAAA,IACX;AAAA,IACA,GAAI,SAAS,aAAa,UAAa,EAAE,UAAU,SAAS,SAAS;AAAA,IACrE,cAAc,SAAS;AAAA,IACvB,GAAI,SAAS,gBAAgB,UAC3B,SAAS,YAAY,SAAS,KAAK,EAAE,iBAAiB,SAAS,YAAY;AAAA,IAC7E,GAAI,SAAS,gBAAgB,UAC3B,SAAS,YAAY,SAAS,KAAK,EAAE,aAAa,SAAS,YAAY;AAAA,IACzE;AAAA,EACF;AAEA,SAAO,sBAAsB,IAAI;AAAA,IAC/B,QAAQ,wBAAwB,SAAS,QAAQ;AAAA,IACjD,SAAS;AAAA,EACX,CAAC;AACH;AAUA,SAAS,iBACP,QACA,SACA,YAC0B;AAC1B,QAAM,WAA4B,CAAC;AAInC,QAAM,WAAW,oBAAI,IAA6B;AAClD,QAAM,gBAGA,CAAC;AAEP,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,CAAC,SAAS,CAAC,OAAQ;AAGvB,UAAM,UAAU,kBAAkB,OAAO,QAAQ,UAAU;AAE3D,QAAI,OAAO,eAAe,QAAW;AACnC,YAAM,QAAQ,OAAO;AACrB,UAAI,gBAAgB,SAAS,IAAI,KAAK;AACtC,UAAI,CAAC,eAAe;AAClB,wBAAgB,CAAC;AACjB,iBAAS,IAAI,OAAO,aAAa;AACjC,sBAAc,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,MAC7C;AACA,oBAAc,KAAK,OAAO;AAAA,IAC5B,OAAO;AACL,oBAAc,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AAGA,aAAW,SAAS,eAAe;AACjC,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,gBAAgB,SAAS,IAAI,MAAM,KAAK;AAC9C,UAAI,eAAe;AACjB,cAAM,YAA6B;AAAA,UACjC,MAAM;AAAA,UACN,OAAO,MAAM;AAAA,UACb,UAAU;AAAA,UACV;AAAA,QACF;AACA,iBAAS,KAAK,SAAS;AAEvB,iBAAS,OAAO,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF,OAAO;AACL,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,kBACP,OACA,QACA,YACe;AACf,MAAI,OAAO,aAAa,QAAW;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,cAAqC;AAAA,IACzC,MAAM;AAAA,IACN,WAAW,OAAO,SAAS;AAAA,IAC3B,OAAO,OAAO,SAAS;AAAA,IACvB,UAAU,CAAC,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;;;AC9JA,SAAS,4BAA4B,SAAyC,OAAqB;AACjG,QAAM,OAAO,oBAAI,IAAiC;AAElD,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,KAAK,IAAI,MAAM,cAAc;AAC9C,QAAI,aAAa,QAAW;AAC1B,UAAI,SAAS,gBAAgB,MAAM,eAAe,SAAS,aAAa,MAAM,UAAU;AACtF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,gCAAgC,KAAK,KAAK,SAAS,QAAQ,KAAK,SAAS,WAAW,SAAS,MAAM,QAAQ,KAAK,MAAM,WAAW,sBAAsB,MAAM,cAAc;AAAA,MAC7K;AAAA,IACF;AACA,SAAK,IAAI,MAAM,gBAAgB,KAAK;AAAA,EACtC;AACF;AAEA,SAAS,uBAAuB,UAAiD;AAC/E,QAAM,SAAsB,CAAC;AAE7B,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,eAAO,KAAK,OAAO;AACnB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,GAAG,uBAAuB,QAAQ,QAAQ,CAAC;AACvD;AAAA,MACF,SAAS;AACP,cAAM,aAAoB;AAC1B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,YAAuC,OAAqB;AAC5F;AAAA,IACE,WAAW,IAAI,CAAC,cAAc;AAAA,MAC5B,aAAa,SAAS;AAAA,MACtB,gBAAgB,kBAAkB,SAAS,MAAM,SAAS,QAAQ;AAAA,MAClE,UAAU;AAAA,IACZ,EAAE;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,YAAY;AACjC;AAAA,MACE,SAAS;AAAA,MACT,GAAG,KAAK,IAAI,kBAAkB,SAAS,MAAM,SAAS,QAAQ,CAAC;AAAA,IACjE;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAAgB,OAAqB;AAC7D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,uBAAiB,KAAK,OAAO,GAAG,KAAK,IAAI;AACzC;AAAA,IACF,KAAK;AACH,+BAAyB,KAAK,YAAY,KAAK;AAC/C;AAAA,IACF,KAAK;AACH,uBAAiB,KAAK,WAAW,GAAG,KAAK,IAAI;AAC7C;AAAA,IACF,KAAK;AACH,WAAK,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,yBAAiB,QAAQ,GAAG,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MACtD,CAAC;AACD;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF,SAAS;AACP,YAAM,aAAoB;AAC1B,WAAK;AAAA,IACP;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,cAA4C;AAC3E,QAAM,cAAc,OAAO,OAAO,YAAY;AAC9C;AAAA,IACE,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC/B,aAAa,WAAW;AAAA,MACxB,gBAAgB,kBAAkB,WAAW,MAAM,WAAW,QAAQ;AAAA,MACtE,UAAU;AAAA,IACZ,EAAE;AAAA,IACF;AAAA,EACF;AAEA,aAAW,cAAc,aAAa;AACpC,2BAAuB,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,uBAAuB,YAAkC;AAChE;AAAA,IACE,WAAW;AAAA,IACX,SAAS,kBAAkB,WAAW,MAAM,WAAW,QAAQ,CAAC;AAAA,EAClE;AACF;AAEO,SAAS,iCAAiC,IAAkB;AACjE;AAAA,IACE,uBAAuB,GAAG,QAAQ,EAAE,IAAI,CAAC,WAAW;AAAA,MAClD,aAAa,MAAM;AAAA,MACnB,gBAAgB,kBAAkB,MAAM,MAAM,MAAM,QAAQ;AAAA,MAC5D,UAAU;AAAA,IACZ,EAAE;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS,uBAAuB,GAAG,QAAQ,GAAG;AACvD,qBAAiB,MAAM,MAAM,UAAU,kBAAkB,MAAM,MAAM,MAAM,QAAQ,CAAC,GAAG;AAAA,EACzF;AAEA,0BAAwB,GAAG,YAAY;AACzC;;;AC0BA,SAAS,uBAAuB,OAAuD;AACrF,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,IAAI;AAAA,QACR,8BAA8B,OAAO,KAAK,CAAC;AAAA,MAC7C;AAAA,EACJ;AACF;AAEA,SAAS,YAAY,SAA6D;AAChF,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,oBAAoB,uBAAuB,SAAS,iBAAiB;AAC3E,MAAI,CAAC,aAAa,WAAW,IAAI,GAAG;AAClC,UAAM,IAAI;AAAA,MACR,yBAAyB,YAAY;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,CAAC;AAAA,IACP,aAAa,CAAC;AAAA,IACd,cAAc,CAAC;AAAA,IACf,mBAAmB,SAAS;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAgDO,SAAS,yBACd,IACA,SACgB;AAChB,mCAAiC,EAAE;AAEnC,QAAM,MAAM;AAAA,IACV,GAAG,YAAY,OAAO;AAAA,IACtB,cAAc,GAAG;AAAA,IACjB,aAAa,OAAO;AAAA,MAClB,OAAO,QAAQ,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,MAAM;AAAA,QACvD;AAAA,QACA,kBAAkB,MAAM,QAAQ,QAAQ;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAKA,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,GAAG,YAAY,GAAG;AAC7D,UAAM,aAAa,IAAI,YAAY,IAAI,KAAK;AAC5C,QAAI,KAAK,UAAU,IAAI,iBAAiB,QAAQ,MAAM,GAAG;AACzD,0BAAsB,IAAI,KAAK,UAAU,GAAG,QAAQ,QAAQ;AAC5D,QAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,uBAAiB,IAAI,KAAK,UAAU,GAAG,QAAQ,aAAa,GAAG;AAAA,IACjE;AACA,QAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,uBAAiB,IAAI,KAAK,UAAU,GAAG,QAAQ,aAAa,KAAK,QAAQ,IAAI;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,aAA6C,CAAC;AACpD,QAAM,WAAqB,CAAC;AAE5B,gBAAc,GAAG,UAAU,YAAY,UAAU,GAAG;AAGpD,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAE5C,QAAM,SAAyB;AAAA,IAC7B,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA,GAAI,eAAe,SAAS,KAAK,EAAE,UAAU,eAAe;AAAA,EAC9D;AACA,wBAAsB,QAAQ,GAAG,QAAQ;AAEzC,MAAI,GAAG,eAAe,GAAG,YAAY,SAAS,GAAG;AAC/C,qBAAiB,QAAQ,GAAG,aAAa,GAAG;AAAA,EAC9C;AAEA,MAAI,OAAO,KAAK,IAAI,IAAI,EAAE,SAAS,GAAG;AACpC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,SAAO;AACT;AAYA,SAAS,cACP,UACA,YACA,UACA,KACM;AACN,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,mBAAW,uBAAuB,OAAO,CAAC,IAAI,oBAAoB,SAAS,GAAG;AAC9E,YAAI,QAAQ,UAAU;AACpB,mBAAS,KAAK,uBAAuB,OAAO,CAAC;AAAA,QAC/C;AACA;AAAA,MAEF,KAAK;AAEH,sBAAc,QAAQ,UAAU,YAAY,UAAU,GAAG;AACzD;AAAA,MAEF,KAAK;AAEH,sBAAc,QAAQ,UAAU,YAAY,UAAU,GAAG;AACzD;AAAA,MAEF,SAAS;AACP,cAAM,cAAqB;AAC3B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AASA,SAAS,oBAAoB,OAAkB,KAAuC;AACpF,QAAM,SAAS,iBAAiB,MAAM,MAAM,GAAG;AAC/C,QAAM,mBACJ,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,WAAW,OAAO,QAAQ;AAG9E,QAAM,oBAAsC,CAAC;AAC7C,QAAM,kBAAoC,CAAC;AAC3C,QAAM,kBAAoC,CAAC;AAC3C,aAAW,KAAK,MAAM,aAAa;AACjC,QAAI,EAAE,MAAM;AACV,sBAAgB,KAAK,CAAC;AAAA,IACxB,WAAW,qBAAqB,UAAa,uBAAuB,CAAC,GAAG;AACtE,sBAAgB,KAAK,CAAC;AAAA,IACxB,OAAO;AACL,wBAAkB,KAAK,CAAC;AAAA,IAC1B;AAAA,EACF;AAIA,mBAAiB,QAAQ,mBAAmB,GAAG;AAE/C,MAAI,qBAAqB,QAAW;AAClC,qBAAiB,kBAAkB,iBAAiB,GAAG;AAAA,EACzD;AAGA,QAAM,kBAAoC,CAAC;AAC3C,QAAM,kBAAoC,CAAC;AAC3C,aAAW,cAAc,MAAM,aAAa;AAC1C,QAAI,qBAAqB,UAAa,WAAW,mBAAmB,UAAU;AAC5E,sBAAgB,KAAK,UAAU;AAAA,IACjC,OAAO;AACL,sBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AAEA,wBAAsB,QAAQ,MAAM,QAAQ;AAC5C,mBAAiB,QAAQ,iBAAiB,KAAK,MAAM,IAAI;AACzD,MAAI,qBAAqB,QAAW;AAClC,qBAAiB,kBAAkB,iBAAiB,GAAG;AAAA,EACzD;AAGA,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,6BAA6B,QAAQ,iBAAiB,KAAK,MAAM,IAAI;AAC9E;AAUA,SAAS,uBAAuB,YAAqC;AACnE,UAAQ,WAAW,gBAAgB;AAAA,IACjC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AA4BA,SAAS,6BACP,QACA,iBACA,KACA,UACgB;AAEhB,MAAI,OAAO,SAAS,WAAW,OAAO,OAAO;AAC3C,UAAM,iBACJ,UAAU,SAAS,cAAc,sBAAsB,UAAU,GAAG,IAAI;AAC1E,UAAM,aACJ,UAAU,SAAS,UACf,SAAS,QACT,gBAAgB,SAAS,UACvB,eAAe,QACf;AACR,WAAO,QAAQ,6BAA6B,OAAO,OAAO,iBAAiB,KAAK,UAAU;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,uBAAuB,iBAAiB,UAAU,GAAG;AAC/E,QAAM,sBAAsB,4BAA4B,MAAM;AAE9D,MAAI,wBAAwB,QAAW;AACrC,UAAM,6BAA6B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA,2BAA2B,UAAU,GAAG;AAAA,IAC1C;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,aAAO,QAAQ,OAAO,MAAM;AAAA,QAAI,CAAC,WAC/B,WAAW,sBAAsB,6BAA6B;AAAA,MAChE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAYA,MAAI,OAAO,MAAM;AACf,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EACF;AAWA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,eAAW,CAAC,QAAQ,cAAc,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAUxE,UAAI,OAAO,OAAO,OAAO,YAAY,MAAM,GAAG;AAC5C,cAAM,WAAW,OAAO,WAAW,MAAM;AACzC,YAAI,UAAU;AACZ,8BAAoB,UAAU,cAAc;AAC5C;AAAA,QACF;AAAA,MACF;AACA,aAAO,eAAe,OAAO,YAAY,QAAQ;AAAA,QAC/C,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAOA,MAAI,OAAO,OAAO;AAChB,UAAM,iBAAiC,EAAE,YAAY,kBAAkB;AACvE,UAAM,YAAY,0BAA0B,QAAQ,cAAc;AAClE,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,CAAC,GAAG,OAAO,OAAO,cAAc;AAC/C,WAAO;AAAA,EACT;AAKA,SAAO;AACT;AAaA,SAAS,iBAAiB,MAAgB,KAAuC;AAC/E,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,sBAAsB,IAAI;AAAA,IAEnC,KAAK;AACH,aAAO,iBAAiB,MAAM,GAAG;AAAA,IAEnC,KAAK;AACH,aAAO,kBAAkB,MAAM,GAAG;AAAA,IAEpC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IAErC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IAErC,KAAK;AACH,aAAO,kBAAkB,MAAM,GAAG;AAAA,IAEpC,KAAK;AACH,aAAO,sBAAsB,MAAM,GAAG;AAAA,IAExC,KAAK;AACH,aAAO,oBAAoB,IAAI;AAAA,IAEjC,KAAK;AACH,aAAO,mBAAmB,MAAM,GAAG;AAAA,IAErC,SAAS;AAEP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AASA,SAAS,sBAAsB,MAAyC;AACtE,SAAO;AAAA,IACL,MACE,KAAK,kBAAkB,aAAa,KAAK,kBAAkB,WACvD,YACA,KAAK;AAAA,EACb;AACF;AAcA,SAAS,iBAAiB,MAAoB,KAAuC;AACnF,MACE,IAAI,sBAAsB,WACzB,IAAI,sBAAsB,gBAAgB,2BAA2B,IAAI,GAC1E;AACA,WAAO;AAAA,MACL,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM;AAC7B,cAAM,cAAc,OAAO,EAAE,KAAK;AAClC,cAAM,QACJ,EAAE,gBAAgB,UAAa,EAAE,gBAAgB,cAAc,EAAE,cAAc;AACjF,eAAO,UAAU,SAAY,EAAE,OAAO,EAAE,OAAO,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAyB,EAAE,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;AACxE,MAAI,IAAI,sBAAsB,cAAc;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,8BAA8B,IAAI;AACvD,MAAI,iBAAiB,QAAW;AAE9B,WAAO,GAAG,IAAI,YAAY,gBAAiC,IAAI;AAAA,EACjE;AACA,SAAO;AACT;AAMA,SAAS,2BAA2B,MAA6B;AAC/D,SAAO,KAAK,QAAQ,KAAK,CAAC,WAAW;AACnC,UAAM,QAAQ,OAAO,eAAe,OAAO,OAAO,KAAK;AACvD,WAAO,UAAU,OAAO,OAAO,KAAK;AAAA,EACtC,CAAC;AACH;AAEA,SAAS,8BAA8B,MAAwD;AAC7F,MAAI,CAAC,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,gBAAgB,MAAS,GAAG;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,eAAuC,uBAAO,OAAO,IAAI;AAC/D,aAAW,UAAU,KAAK,SAAS;AACjC,UAAM,MAAM,OAAO,OAAO,KAAK;AAC/B,QAAI,OAAO,OAAO,cAAc,GAAG,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,0BAA0B,GAAG;AAAA,MAE/B;AAAA,IACF;AACA,iBAAa,GAAG,IAAI,OAAO,eAAe;AAAA,EAC5C;AAEA,SAAO;AACT;AAOA,SAAS,kBAAkB,MAAqB,KAAuC;AACrF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,iBAAiB,KAAK,OAAO,GAAG;AAAA,EACzC;AACF;AASA,SAAS,mBAAmB,MAAsB,KAAuC;AACvF,QAAM,aAA6C,CAAC;AACpD,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,KAAK,YAAY;AAClC,UAAM,eAAe,gCAAgC,IAAI;AACzD,eAAW,YAAY,IAAI,uBAAuB,MAAM,GAAG;AAC3D,QAAI,CAAC,KAAK,UAAU;AAClB,eAAS,KAAK,YAAY;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,SAAyB,EAAE,MAAM,UAAU,WAAW;AAE5D,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,CAAC,KAAK,sBAAsB;AAC9B,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAUA,SAAS,mBAAmB,MAAsB,KAAuC;AACvF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,sBAAsB,iBAAiB,KAAK,WAAW,GAAG;AAAA,EAC5D;AACF;AAMA,SAAS,uBAAuB,MAAsB,KAAuC;AAC3F,QAAM,SAAS,iBAAiB,KAAK,MAAM,GAAG;AAC9C,mBAAiB,QAAQ,KAAK,aAAa,GAAG;AAC9C,wBAAsB,QAAQ,KAAK,QAAQ;AAC3C,mBAAiB,QAAQ,KAAK,aAAa,KAAK,KAAK,IAAI;AACzD,SAAO;AACT;AAWA,SAAS,kBAAkB,MAAqB,KAAuC;AAErF,MAAI,eAAe,IAAI,GAAG;AACxB,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAIA,MAAI,gBAAgB,IAAI,GAAG;AACzB,WAAO;AAAA,MACL,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAAA,IACzD;AAAA,EACF;AAKA,SAAO;AAAA,IACL,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAAA,EACzD;AACF;AAKA,SAAS,eAAe,MAA8B;AACpD,MAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAI5C,SACE,MAAM,MAAM,CAAC,MAAM,MAAM,WAAW,KACpC,KAAK,QAAQ,MAAM,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,kBAAkB,SAAS;AAErF;AASA,SAAS,gBAAgB,MAA8B;AACrD,MAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AACtC,QAAM,YAAY,KAAK,QAAQ;AAAA,IAC7B,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,kBAAkB;AAAA,EACvD,EAAE;AACF,SAAO,cAAc;AACvB;AAQA,SAAS,sBAAsB,MAAyB,KAAuC;AAC7F,SAAO,EAAE,MAAM,WAAW,sBAAsB,KAAK,MAAM,GAAG,CAAC,GAAG;AACpE;AAEA,SAAS,uBAAuB,OAAqD;AACnF,SAAO,kBAAkB,MAAM,MAAM,MAAM,QAAQ;AACrD;AAEA,SAAS,gCACP,UACQ;AACR,SAAO,kBAAkB,SAAS,MAAM,SAAS,QAAQ;AAC3D;AAEA,SAAS,sBAAsB,aAAqB,KAA+B;AACjF,SAAO,IAAI,YAAY,WAAW,KAAK;AACzC;AAEA,SAAS,sBACP,QACA,UACM;AACN,QAAM,cAAc,eAAe,QAAQ;AAC3C,MAAI,gBAAgB,QAAW;AAC7B,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,sBACP,MACA,KACsB;AACtB,SAAO,IAAI,aAAa,KAAK,IAAI,GAAG;AACtC;AAEA,SAAS,oBACP,UACA,KACsB;AACtB,MAAI,UAAU,SAAS,aAAa;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,UAAU,GAAG;AAC5C;AAEA,SAAS,uBAAuB,UAAsD;AACpF,MAAI,UAAU,SAAS,WAAW,CAAC,gBAAgB,QAAQ,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,QAAQ;AAAA,IACtB,CAAC,WAAW,EAAE,OAAO,SAAS,eAAe,OAAO,kBAAkB;AAAA,EACxE;AACF;AAEA,SAAS,2BACP,UACA,KACsB;AACtB,QAAM,eAAe,oBAAoB,UAAU,GAAG;AACtD,QAAM,YAAY,uBAAuB,YAAY;AAErD,MAAI,cAAc,cAAc;AAC9B,WAAO,2BAA2B,WAAW,GAAG;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,aACA,UACA,KACQ;AACR,QAAM,gBAAgB,2BAA2B,UAAU,GAAG;AAC9D,MAAI,eAAe,SAAS,SAAS;AACnC,WAAO,8BAA8B,aAAa,cAAc,OAAO,GAAG;AAAA,EAC5E;AAEA,MAAI,eAAe,SAAS,UAAU;AACpC,UAAM,WAAW,cAAc,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,WAAW;AAC5F,WAAO,aAAa,SAAY,cAAc,gCAAgC,QAAQ;AAAA,EACxF;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,aACA,UACA,KACsB;AACtB,QAAM,gBAAgB,2BAA2B,UAAU,GAAG;AAC9D,MAAI,eAAe,SAAS,SAAS;AACnC,WAAO,sBAAsB,aAAa,cAAc,OAAO,GAAG;AAAA,EACpE;AAEA,MAAI,eAAe,SAAS,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,SAAO,cAAc,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,WAAW,GAAG;AACvF;AAEA,SAAS,uBACP,iBACA,UACA,KACgC;AAChC,QAAM,WAAW,oBAAI,IAA8B;AAEnD,aAAW,cAAc,iBAAiB;AACxC,UAAM,SAAS,WAAW,MAAM,SAAS,CAAC;AAC1C,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,UAAU,SAAS,IAAI,MAAM,KAAK,CAAC;AACzC,YAAQ,KAAK,UAAU;AACvB,aAAS,IAAI,QAAQ,OAAO;AAAA,EAC9B;AASA,QAAM,YAAY,uBAAO,OAAO,IAAI;AACpC,aAAW,CAAC,QAAQ,WAAW,KAAK,UAAU;AAC5C,UAAM,eAAe,8BAA8B,QAAQ,UAAU,GAAG;AACxE,UAAM,SAAS;AAAA,MACb,YAAY,IAAI,uBAAuB;AAAA,MACvC,sBAAsB,QAAQ,UAAU,GAAG;AAAA,MAC3C;AAAA,IACF;AACA,WAAO,eAAe,WAAW,cAAc;AAAA,MAC7C,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,aACA,UACA,KACgB;AAChB,QAAM,SAAyB,CAAC;AAChC,QAAM,oBAAsC,CAAC;AAC7C,QAAM,oBAAsC,CAAC;AAE7C,aAAW,cAAc,aAAa;AACpC,QAAI,WAAW,SAAS,UAAa,WAAW,KAAK,SAAS,WAAW,GAAG;AAC1E,wBAAkB,KAAK,UAAU;AAAA,IACnC,OAAO;AACL,wBAAkB,KAAK,UAAU;AAAA,IACnC;AAAA,EACF;AAEA,mBAAiB,QAAQ,mBAAmB,GAAG;AAE/C,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,2BAA2B,UAAU,GAAG;AAC9D,MAAI,eAAe,SAAS,SAAS;AACnC,WAAO,QAAQ,wBAAwB,mBAAmB,cAAc,OAAO,GAAG;AAClF,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,uBAAuB,mBAAmB,eAAe,GAAG;AAChF,SAAO;AACT;AA8BA,SAAS,0BACP,QACA,gBAC4B;AAC5B,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAGA,QAAM,CAAC,UAAU,IAAI,OAAO;AAC5B,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,EAAE,OAAO,QAAQ,GAAG,UAAU,IAAI;AAExC,QAAM,YAAY,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC;AAChD,QAAM,aAAa,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC;AAClD,QAAM,eAAe,IAAI,IAAI,OAAO,KAAK,cAAc,CAAC;AAIxD,aAAW,OAAO,YAAY;AAC5B,QAAI,UAAU,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,GAAG;AAC/C,aAAO;AAAA,IACT;AAAA,EACF;AACA,aAAW,OAAO,cAAc;AAC9B,QAAI,UAAU,IAAI,GAAG,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,SAAS,oBAAoB,QAAwB,UAAgC;AACnF,QAAM,sBAAsB,4BAA4B,MAAM;AAC9D,MAAI,wBAAwB,QAAW;AACrC,wBAAoB,qBAAqB,QAAQ;AACjD;AAAA,EACF;AAEA,MAAI,SAAS,eAAe,QAAW;AAMrC,UAAM,mBACJ,OAAO,cAAe,uBAAO,OAAO,IAAI;AAC1C,eAAW,CAAC,MAAM,gBAAgB,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC1E,YAAM,WAAW,OAAO,OAAO,kBAAkB,IAAI,IAAI,iBAAiB,IAAI,IAAI;AAClF,UAAI,aAAa,QAAW;AAI1B,eAAO,eAAe,kBAAkB,MAAM;AAAA,UAC5C,OAAO;AAAA,UACP,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB,CAAC;AAAA,MACH,OAAO;AACL,4BAAoB,UAAU,gBAAgB;AAAA,MAChD;AAAA,IACF;AACA,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,SAAS,UAAU,QAAW;AAChC,QAAI,OAAO,UAAU,QAAW;AAC9B,aAAO,QAAQ,SAAS;AAAA,IAC1B,OAAO;AACL,0BAAoB,OAAO,OAAO,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,QAAQ,gBAAgB,QAAQ,SAAS;AAC3C;AAAA,IACF;AAMA,WAAO,eAAe,QAAQ,KAAK;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBAAwB,YAA4C;AAC3E,QAAM,WAAW,WAAW,MAAM;AAClC,MAAI,aAAa,UAAa,SAAS,WAAW,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,GAAG,IAAI,IAAI;AACpB,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,EAAE,MAAM,OAAO,GAAG,SAAS,IAAI;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,EAAE,UAAU,KAAK;AAAA,EACzB;AACF;AAEA,SAAS,4BAA4B,QAAoD;AACvF,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,MAAM,KAAK,CAAC,WAAW,OAAO,SAAS,MAAM;AACxE,QAAM,aAAa,OAAO,MAAM,KAAK,CAAC,WAAW,OAAO,SAAS,MAAM;AACvE,SAAO,gBAAgB,UAAa,eAAe,SAAY,cAAc;AAC/E;AASA,SAAS,oBAAoB,MAAuC;AAClE,MAAI,KAAK,gBAAgB,QAAQ;AAC/B,UAAM,SAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,qBAAqB,KAAK;AAAA,IAC5B;AACA,QAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,aAAO,mBAAmB,IAAI,CAAC,GAAG,KAAK,eAAe;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,sBAAsB;AAAA,IACtB,2BAA2B,KAAK;AAAA,EAClC;AACF;AAiBA,SAAS,iBACP,QACA,aACA,KACM;AACN,aAAW,cAAc,aAAa;AACpC,YAAQ,WAAW,gBAAgB;AAAA,MACjC,KAAK;AACH,eAAO,UAAU,WAAW;AAC5B;AAAA,MAEF,KAAK;AACH,eAAO,UAAU,WAAW;AAC5B;AAAA,MAEF,KAAK;AACH,eAAO,mBAAmB,WAAW;AACrC;AAAA,MAEF,KAAK;AACH,eAAO,mBAAmB,WAAW;AACrC;AAAA,MAEF,KAAK,cAAc;AACjB,cAAM,EAAE,MAAM,IAAI;AAClB,YAAI,UAAU,KAAK,OAAO,SAAS,UAAU;AAE3C,iBAAO,OAAO;AAAA,QAChB,OAAO;AACL,iBAAO,aAAa;AAAA,QACtB;AACA;AAAA,MACF;AAAA,MAEA,KAAK;AACH,eAAO,YAAY,WAAW;AAC9B;AAAA,MAEF,KAAK;AACH,eAAO,YAAY,WAAW;AAC9B;AAAA,MAEF,KAAK;AACH,eAAO,WAAW,WAAW;AAC7B;AAAA,MAEF,KAAK;AACH,eAAO,WAAW,WAAW;AAC7B;AAAA,MAEF,KAAK;AACH,eAAO,UAAU,WAAW;AAC5B;AAAA,MAEF,KAAK;AACH,eAAO,cAAc,WAAW;AAChC;AAAA,MAEF,KAAK;AACH,eAAO,QAAQ,WAAW;AAC1B;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF,KAAK;AACH,8BAAsB,QAAQ,YAAY,GAAG;AAC7C;AAAA,MAEF,SAAS;AAEP,cAAM,cAAqB;AAC3B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAoBA,SAAS,iBACP,QACA,aACA,KACA,UACM;AACN,aAAW,cAAc,aAAa;AACpC,YAAQ,WAAW,gBAAgB;AAAA,MACjC,KAAK;AACH,eAAO,UAAU,WAAW;AAC5B;AAAA,MAEF,KAAK;AACH,eAAO,cAAc,WAAW;AAChC;AAAA,MAEF,KAAK;AACH,eAAO,GAAG,IAAI,YAAY,UAA2B,IAAI,WAAW;AACpE;AAAA,MAEF,KAAK;AACH,eAAO,UAAU,mBAAmB,WAAW,OAAO,UAAU,QAAQ,GAAG;AAC3E;AAAA,MAEF,KAAK;AACH,eAAO,SAAS,WAAW;AAC3B;AAAA,MAEF,KAAK;AACH,eAAO,aAAa;AACpB,YAAI,WAAW,YAAY,UAAa,WAAW,YAAY,IAAI;AACjE,iBAAO,GAAG,IAAI,YAAY,0BAA2C,IACnE,WAAW;AAAA,QACf;AACA;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF,KAAK;AACH,8BAAsB,QAAQ,YAAY,GAAG;AAC7C;AAAA,MAEF,SAAS;AAEP,cAAM,cAAqB;AAC3B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AA0BA,SAAS,mBACP,OACA,UACA,eACA,KACS;AACT,MAAI,UAAU,SAAS,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,eAAe,IAAI,mBAAmB,SAAS,SAAS,MAAM;AACpE,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,qBAAqB,QAAW;AAC/C,WAAO,aAAa,iBAAiB,OAAO,SAAS,OAAO;AAAA,EAC9D;AAKA,QAAM,eAAgB,cAA0C,MAAM;AACtE,MAAI,iBAAiB,YAAY,OAAO,UAAU,UAAU;AAO1D,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,eAAO;AAAA,MACT;AACA,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,SAAS;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAsB,KAAuC;AACvF,QAAM,eAAe,IAAI,mBAAmB,SAAS,KAAK,MAAM;AAChE,MAAI,iBAAiB,QAAW;AAC9B,UAAM,IAAI;AAAA,MACR,gDAAgD,KAAK,MAAM;AAAA,IAC7D;AAAA,EACF;AAIA,SAAO,aAAa,aAAa,KAAK,SAAS,IAAI,YAAY;AACjE;AAYA,IAAM,mCAAmC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,sBACP,QACA,YACA,KACM;AACN,QAAM,eAAe,IAAI,mBAAmB,eAAe,WAAW,YAAY;AAClF,MAAI,iBAAiB,QAAW;AAC9B,UAAM,IAAI;AAAA,MACR,sDAAsD,WAAW,YAAY;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,kBAAkB,aAAa,aAAa,WAAW,SAAS,IAAI,YAAY;AAEtF,MAAI,aAAa,yBAAyB;AAGxC,UAAM,SAAS;AACf,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC1D,UAAI,iCAAiC,IAAI,GAAG,GAAG;AAC7C,cAAM,IAAI;AAAA,UACR,sBAAsB,WAAW,YAAY,mFACS,GAAG;AAAA,QAC3D;AAAA,MACF;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF,OAAO;AACL;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ,sBAAsB,WAAW,YAAY;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,SAAS,sBACP,QACA,YACA,KACM;AACN,QAAM,eAAe,IAAI,mBAAmB,eAAe,WAAW,YAAY;AAClF,MAAI,iBAAiB,QAAW;AAC9B,UAAM,IAAI;AAAA,MACR,sDAAsD,WAAW,YAAY;AAAA,IAC/E;AAAA,EACF;AAEA,MAAI,aAAa,iBAAiB,QAAW;AAC3C;AAAA,EACF;AAEA;AAAA,IACE;AAAA,IACA,aAAa,aAAa,WAAW,OAAO,IAAI,YAAY;AAAA,IAC5D,IAAI;AAAA,IACJ,sBAAsB,WAAW,YAAY;AAAA,EAC/C;AACF;AAEA,SAAS,sCACP,QACA,iBACA,cACA,QACM;AACN,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC1D,QAAI,CAAC,IAAI,WAAW,GAAG,YAAY,GAAG,GAAG;AACvC,YAAM,IAAI;AAAA,QACR,gBAAgB,MAAM,oCAAoC,YAAY;AAAA,MACxE;AAAA,IACF;AACA,WAAO,GAAoB,IAAI;AAAA,EACjC;AACF;;;AN5/CO,SAAS,mBACd,MACA,SACgB;AAChB,QAAM,UAAU,SAAS,UAAU,wBAAY,MAAM,EAAE,OAAO,KAAK,CAAC;AACpE,QAAM,WAAW,SAAS;AAC1B,QAAM,eAAe,SAAS;AAC9B,QAAM,oBAAoB,SAAS;AACnC,SAAO,MAAM,gCAAgC;AAC7C,QAAM,KAAK,qBAAqB,MAAM,aAAa,SAAY,EAAE,SAAS,IAAI,MAAS;AACvF,QAAM,gBAAgB,SAAS,UAAU,wBAAY,MAAM,EAAE,OAAO,SAAS,CAAC;AAC9E,eAAa,MAAM,gCAAgC;AACnD,QAAM,kBACJ,iBAAiB,UAAa,sBAAsB,SAChD,SACA;AAAA,IACE,GAAI,iBAAiB,UAAa,EAAE,aAAa;AAAA,IACjD,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,EAC7D;AACN,SAAO,yBAAyB,IAAI,eAAe;AACrD;;;AOnFA,IAAAC,eAA2B;;;ACE3B,iBAAkB;AAQlB,IAAM,oBAAoB,aAAE,OAAO;AAW5B,IAAM,mBAAmB,aAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,SAAS,CAAC;AAcrE,IAAM,4BAA4B,aAAE,KAAK;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAyCM,IAAM,sBAAsD,aAAE;AAAA,EAAK,MACxE,aACG,OAAO;AAAA,IACN,OAAO,aAAE,QAAQ,EAAE,SAAS;AAAA,IAC5B,MAAM,aAAE,MAAM,aAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,IAC/C,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,KAAK,oBAAoB,SAAS;AAAA,IAClC,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,kBAAkB,aAAE,OAAO,EAAE,SAAS;AAAA,IACtC,kBAAkB,aAAE,OAAO,EAAE,SAAS;AAAA,IACtC,WAAW,aAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,YAAY,aAAE,OAAO,aAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,IAC/D,UAAU,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACvC,OAAO,aAAE,MAAM,mBAAmB,EAAE,SAAS;AAAA,EAC/C,CAAC,EACA,OAAO;AACZ;AAWO,IAAM,6BAA6B,aACvC,OAAO;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV,CAAC,EACA,OAAO;AAcH,IAAM,aAAa,aACvB,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AACb,CAAC,EACA,OAAO;AAqCH,IAAM,wBAAoD,aAAE;AAAA,EAAK,MACtE,aAAE,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAWO,IAAM,gBAAgB,aAC1B,OAAO;AAAA,EACN,MAAM,aAAE,QAAQ,SAAS;AAAA,EACzB,OAAO;AAAA,EACP,OAAO,aAAE,MAAM,CAAC,aAAE,OAAO,GAAG,aAAE,QAAQ,KAAK,CAAC,CAAC,EAAE,SAAS;AAAA,EACxD,MAAM,WAAW,SAAS;AAAA,EAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AACtD,CAAC,EACA,YAAY;AAgCR,IAAM,uBAAkD,aAAE;AAAA,EAAK,MACpE,aACG,OAAO;AAAA,IACN,MAAM,aAAE,QAAQ,gBAAgB;AAAA,IAChC,UAAU,aAAE,MAAM,qBAAqB;AAAA,IACvC,MAAM,WAAW,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACtD,CAAC,EACA,YAAY;AACjB;AAwBO,IAAM,yBAAsD,aAAE;AAAA,EAAK,MACxE,aACG,OAAO;AAAA,IACN,MAAM,aAAE,QAAQ,kBAAkB;AAAA,IAClC,UAAU,aAAE,MAAM,qBAAqB;AAAA,IACvC,MAAM,WAAW,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACtD,CAAC,EACA,YAAY;AACjB;AAyBO,IAAM,oBAA4C,aAAE;AAAA,EAAK,MAC9D,aACG,OAAO;AAAA,IACN,MAAM,aAAE,QAAQ,OAAO;AAAA,IACvB,OAAO,aAAE,OAAO;AAAA,IAChB,UAAU,aAAE,MAAM,qBAAqB;AAAA,IACvC,MAAM,WAAW,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACtD,CAAC,EACA,YAAY;AACjB;AAyBO,IAAM,iBAAsC,aAAE;AAAA,EAAK,MACxD,aACG,OAAO;AAAA,IACN,MAAM,aAAE,QAAQ,UAAU;AAAA,IAC1B,OAAO,aAAE,OAAO;AAAA,IAChB,UAAU,aAAE,MAAM,qBAAqB;AAAA,IACvC,MAAM,WAAW,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACtD,CAAC,EACA,YAAY;AACjB;AAyBO,IAAM,uBAAkD,aAAE;AAAA,EAAK,MACpE,aACG,OAAO;AAAA,IACN,MAAM,aAAE,QAAQ,gBAAgB;AAAA,IAChC,UAAU,aAAE,MAAM,cAAc;AAAA,IAChC,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,MAAM,WAAW,SAAS;AAAA,IAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACtD,CAAC,EACA,YAAY;AACjB;AAWO,IAAM,qBAAqB,aAC/B,OAAO;AAAA,EACN,MAAM,aAAE,QAAQ,OAAO;AAAA,EACvB,MAAM,aAAE,OAAO;AAAA,EACf,MAAM,WAAW,SAAS;AAAA,EAC1B,SAAS,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,EAAE,SAAS;AACtD,CAAC,EACA,YAAY;AAkBR,IAAM,WAAgC,aAAE;AAAA,EAAK,MAClD,aAAE,MAAM,CAAC,sBAAsB,wBAAwB,mBAAmB,oBAAoB,CAAC;AACjG;;;ACtZA,IAAAC,cAAkB;AAUlB,SAAS,aAAgB,QAAsB,OAAgB,OAAkB;AAC/E,MAAI;AACF,WAAO,OAAO,MAAM,KAAK;AAAA,EAC3B,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAE,UAAU;AAC/B,YAAM,IAAI;AAAA,QACR,aAAa,KAAK;AAAA,EAAwB,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACrH;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAKA,SAAS,aAAa,WAA2B;AAC/C,SAAO,gBAAgB,SAAS;AAClC;AAKA,SAAS,eAAe,WAAmB,OAAsB;AAC/D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,MACT,OAAO,aAAa,SAAS;AAAA,MAC7B,QAAQ,EAAE,OAAO,MAAM;AAAA,IACzB;AAAA,EACF;AACF;AAUA,SAAS,uBAAuB,OAAe,QAAoD;AACjG,MAAI,OAAO,UAAU,QAAW;AAC9B,QAAI,UAAU,KAAK;AACjB,aAAO,CAAC,MAAM;AAAA,IAChB;AAEA,UAAM,YAAY,MAAM,QAAQ,iBAAiB,EAAE;AACnD,WAAO;AAAA,MACL;AAAA,QACE,YAAY;AAAA,UACV,CAAC,SAAS,GAAG;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,MAAM,QAAQ,CAAC,WAAW,uBAAuB,OAAO,MAAM,CAAC;AAC/E;AAEA,SAAS,aAAa,YAAkB,WAAuB;AAC7D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,GAAG,uBAAuB,WAAW,UAAU,OAAO,WAAW,UAAU,MAAM;AAAA,UACjF,GAAG,uBAAuB,UAAU,UAAU,OAAO,UAAU,UAAU,MAAM;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAsC;AACjE,QAAM,sBAAsB,eAAe,MAAM,QAAQ;AACzD,MAAI,wBAAwB,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,YAAY,KAAK,CAAC,eAAe,WAAW,mBAAmB,aAAa,GAAG;AAC9F;AAYA,SAAS,mBACP,OACA,cACA,YACgB;AAChB,QAAM,wBAAwB,MAAM,YAAY,KAAK,CAAC,MAAM,EAAE,mBAAmB,aAAa;AAC9F,QAAM,iBACJ,aAAa,IAAI,MAAM,IAAI,KAAK,kBAAkB,MAAM,MAAM,MAAM,QAAQ;AAC9E,QAAM,cAAc,oBAAoB,KAAK;AAE7C,QAAM,UAA0B;AAAA,IAC9B,MAAM;AAAA,IACN,OAAO,aAAa,cAAc;AAAA,IAClC,GAAI,gBAAgB,UAAa,EAAE,OAAO,YAAY;AAAA,IACtD,GAAI,0BAA0B,UAAa;AAAA,MACzC,SAAS,EAAE,aAAa,sBAAsB,MAAM;AAAA,IACtD;AAAA,IACA,GAAI,eAAe,UAAa,EAAE,MAAM,WAAW;AAAA,EACrD;AAEA,SAAO;AACT;AASA,SAAS,kBACP,OACA,cACA,YACa;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,UAAU,qBAAqB,MAAM,UAAU,cAAc,UAAU;AAAA,IACvE,GAAI,eAAe,UAAa,EAAE,MAAM,WAAW;AAAA,EACrD;AACF;AASA,SAAS,qBACP,UACA,cACA,YACmB;AACnB,QAAM,SAA4B,CAAC;AAEnC,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,SAAS;AACZ,eAAO,KAAK,mBAAmB,SAAS,cAAc,UAAU,CAAC;AACjE;AAAA,MACF;AAAA,MAEA,KAAK,SAAS;AACZ,eAAO,KAAK,kBAAkB,SAAS,cAAc,UAAU,CAAC;AAChE;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAElB,cAAM,UAAU;AAAA,UACd,aAAa,IAAI,QAAQ,SAAS,KAAK,QAAQ;AAAA,UAC/C,QAAQ;AAAA,QACV;AAEA,cAAM,eAAe,eAAe,SAAY,aAAa,YAAY,OAAO,IAAI;AAGpF,cAAM,gBAAgB,qBAAqB,QAAQ,UAAU,cAAc,YAAY;AACvF,eAAO,KAAK,GAAG,aAAa;AAC5B;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,cAAqB;AAC3B,aAAK;AACL,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAiDO,SAAS,uBAAuB,IAAsB;AAC3D,mCAAiC,EAAE;AACnC,QAAM,eAAe,oBAAoB,GAAG,QAAQ;AACpD,QAAM,SAAmB;AAAA,IACvB,MAAM;AAAA,IACN,UAAU,qBAAqB,GAAG,UAAU,YAAY;AAAA,EAC1D;AAEA,SAAO,aAAa,UAAmB,QAAQ,WAAW;AAC5D;AAEA,SAAS,oBAAoB,UAAiE;AAC5F,QAAM,MAAM,oBAAI,IAAoB;AAEpC,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,YAAI,IAAI,QAAQ,MAAM,kBAAkB,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AACvE;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,CAAC,KAAK,KAAK,KAAK,oBAAoB,QAAQ,QAAQ,GAAG;AAChE,cAAI,IAAI,KAAK,KAAK;AAAA,QACpB;AACA;AAAA,MACF,SAAS;AACP,cAAM,cAAqB;AAC3B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AFlOO,SAAS,iBACd,MACA,SACU;AACV,QAAM,UAAU,SAAS,UAAU,yBAAY,MAAM,EAAE,OAAO,KAAK,CAAC;AACpE,SAAO,MAAM,yDAAyD;AACtE,QAAM,KAAK;AAAA,IACT;AAAA,IACA,SAAS,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI;AAAA,EACrE;AACA,QAAM,gBAAgB,SAAS,UAAU,yBAAY,MAAM,EAAE,OAAO,SAAS,CAAC;AAC9E,eAAa,MAAM,8BAA8B;AACjD,SAAO,uBAAuB,EAAE;AAClC;;;ARvDA,SAAoB;AACpB,IAAAC,QAAsB;;;AWbtB,IAAAC,oBAGO;AACP,sBAQO;AA8JP,IAAM,wBAAwB,oBAAI,IAAI,CAAC,WAAW,aAAa,CAAC;AAEhE,SAAS,0BACP,YAC+B;AAC/B,SAAO,WAAW,IAAI,CAAC,eAAe;AAAA,IACpC,aAAa,UAAU;AAAA,IACvB,GAAI,UAAU,mBAAmB,SAC7B;AAAA,MACE,gBAAgB,UAAU,eAAe,IAAI,CAAC,SAAS;AAAA,QACrD,aAAS,0CAAyB,IAAI,OAAO;AAAA,MAC/C,EAAE;AAAA,IACJ,IACA,CAAC;AAAA;AAAA;AAAA,IAGL,GAAI,UAAU,UAAU,SACpB;AAAA,MACE,aAAa,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA;AAAA;AAAA;AAAA,QAI1C,aAAa,KAAK,eAAe,CAAC,KAAK,QAAQ;AAAA,MACjD,EAAE;AAAA,IACJ,IACA,CAAC;AAAA,EACP,EAAE;AACJ;AAeO,SAAS,wBACd,YAC0B;AAG1B,QAAM,kBAAc,oCAAmB;AACvC,cAAY,MAAM,yCAAyC;AAAA,IACzD,gBAAgB,WAAW;AAAA,IAC3B,cAAc,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW;AAAA,EACnD,CAAC;AAKD,QAAM,sBAAsB,0BAA0B,UAAU;AAChE,QAAM,uBAAmB,yCAAwB,mBAAmB;AACpE,2CAAoB,aAAa;AAAA,IAC/B,iBAAiB,iBAAiB;AAAA,IAClC,OAAO,iBAAiB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC3C,CAAC;AAID,QAAM,qBAAqB;AAC3B,MAAI,YAAY,oBAAI,IAA0C;AAC9D,QAAM,UAAU,oBAAI,IAAoC;AACxD,QAAM,cAAc,oBAAI,IAAuC;AAC/D,QAAM,WAAW,oBAAI,IAAuC;AAC5D,QAAM,gBAAgB,oBAAI,IAA0C;AACpE,QAAM,mBAAmB,oBAAI,IAG3B;AACF,QAAM,uBAAuB,oBAAI,IAG/B;AACF,QAAM,gBAAgB,oBAAI,IAA0C;AACpE,QAAM,kBAAkB,oBAAI,IAAkB;AAC9C,QAAM,iBAAiB,oBAAI,IAAkB;AAE7C,aAAW,OAAO,YAAY;AAC5B,QAAI,IAAI,UAAU,QAAW;AAC3B,iBAAW,QAAQ,IAAI,OAAO;AAC5B,cAAM,cAAc,GAAG,IAAI,WAAW,IAAI,KAAK,QAAQ;AACvD,YAAI,QAAQ,IAAI,WAAW,GAAG;AAC5B,gBAAM,IAAI,MAAM,8BAA8B,WAAW,GAAG;AAAA,QAC9D;AACA,gBAAQ,IAAI,aAAa,IAAI;AAE7B,mBAAW,kBAAkB,KAAK,eAAe,CAAC,KAAK,QAAQ,GAAG;AAChE,cAAI,YAAY,IAAI,cAAc,GAAG;AACnC,kBAAM,IAAI,MAAM,uCAAuC,cAAc,GAAG;AAAA,UAC1E;AACA,sBAAY,IAAI,gBAAgB;AAAA,YAC9B,aAAa,IAAI;AAAA,YACjB,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,UAAU,QAAW;AAC5B,cAAI,KAAK,UAAU,kBAAkB;AACnC,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,cAAI,SAAS,IAAI,KAAK,KAAK,GAAG;AAC5B,kBAAM,IAAI,MAAM,iCAAiC,KAAK,KAAK,GAAG;AAAA,UAChE;AACA,mBAAS,IAAI,KAAK,OAAO;AAAA,YACvB,aAAa,IAAI;AAAA,YACjB,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,iCAAiC,QAAW;AACnD,qBAAW,cAAc,KAAK,8BAA8B;AAC1D,kBAAM,MAAM,GAAG,WAAW,IAAI,WAAW,OAAO;AAChD,gBAAI,qBAAqB,IAAI,GAAG,GAAG;AACjC,oBAAM,IAAI,MAAM,8CAA8C,GAAG,GAAG;AAAA,YACtE;AACA,iCAAqB,IAAI,KAAK;AAAA,cAC5B,aAAa,IAAI;AAAA,cACjB,cAAc;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,gBAAgB,QAAW;AACjC,iBAAW,cAAc,IAAI,aAAa;AACxC,cAAM,cAAc,GAAG,IAAI,WAAW,IAAI,WAAW,cAAc;AACnE,YAAI,cAAc,IAAI,WAAW,GAAG;AAClC,gBAAM,IAAI,MAAM,oCAAoC,WAAW,GAAG;AAAA,QACpE;AACA,sBAAc,IAAI,aAAa,UAAU;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,IAAI,mBAAmB,QAAW;AACpC,iBAAW,OAAO,IAAI,gBAAgB;AACpC,cAAM,uBAAmB,0CAAyB,IAAI,OAAO;AAC7D,YAAI,iBAAiB,IAAI,gBAAgB,GAAG;AAC1C,gBAAM,IAAI,MAAM,sCAAsC,gBAAgB,GAAG;AAAA,QAC3E;AACA,yBAAiB,IAAI,kBAAkB;AAAA,UACrC,aAAa,IAAI;AAAA,UACjB,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,IAAI,gBAAgB,QAAW;AACjC,iBAAW,cAAc,IAAI,aAAa;AACxC,cAAM,cAAc,GAAG,IAAI,WAAW,IAAI,WAAW,cAAc;AACnE,YAAI,cAAc,IAAI,WAAW,GAAG;AAClC,gBAAM,IAAI,MAAM,oCAAoC,WAAW,GAAG;AAAA,QACpE;AACA,sBAAc,IAAI,aAAa,UAAU;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,IAAI,kBAAkB,QAAW;AACnC,iBAAW,QAAQ,IAAI,eAAe;AACpC,YAAI,gBAAgB,IAAI,KAAK,MAAM,GAAG;AACpC,gBAAM,IAAI,MAAM,gCAAgC,KAAK,MAAM,GAAG;AAAA,QAChE;AACA,wBAAgB,IAAI,KAAK,QAAQ,IAAI;AAErC,cAAM,uBAAmB,0CAAyB,KAAK,OAAO;AAC9D,YAAI,KAAK,cAAc,UAAU,KAAK,YAAY,UAAU,OAAO,GAAG;AACpE,gBAAM,IAAI;AAAA,YACR,kBAAkB,gBAAgB;AAAA,UACpC;AAAA,QACF;AACA,YAAI,eAAe,IAAI,gBAAgB,GAAG;AACxC,gBAAM,IAAI,MAAM,6BAA6B,gBAAgB,GAAG;AAAA,QAClE;AACA,YAAI,sBAAsB,IAAI,gBAAgB,GAAG;AAC/C,gBAAM,IAAI;AAAA,YACR,kBAAkB,gBAAgB;AAAA,UACpC;AAAA,QACF;AACA,YAAI,iBAAiB,IAAI,gBAAgB,GAAG;AAC1C,gBAAM,IAAI;AAAA,YACR,kBAAkB,gBAAgB,4CAA4C,gBAAgB;AAAA,UAChG;AAAA,QACF;AACA,YACE,OAAO;AAAA,UACL;AAAA,cACA,8CAA2B,gBAAgB;AAAA,QAC7C,GACA;AACA,gBAAM,IAAI;AAAA,YACR,kBAAkB,gBAAgB,gDAA4C,8CAA2B,gBAAgB,CAAC;AAAA,UAC5H;AAAA,QACF;AACA,cAAM,kBAAc,kCAAiB,kBAAkB,kBAAkB;AACzE,YAAI,gBAAgB,MAAM;AACxB,gBAAM,sBAAsB,IAAI,YAAY,aAAa,IACrD,IAAI;AAAA,YACF,kBAAkB,gBAAgB;AAAA,UACpC,IACA,IAAI;AAAA,YACF,kBAAkB,gBAAgB,4CAA4C,YAAY,aAAa;AAAA,UACzG;AAAA,QACN;AACA,uBAAe,IAAI,kBAAkB,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,cAAY,MAAM,qCAAqC;AAAA,IACrD,WAAW,QAAQ;AAAA,IACnB,iBAAiB,cAAc;AAAA,IAC/B,oBAAoB,iBAAiB;AAAA,IACrC,iBAAiB,qBAAqB;AAAA,IACtC,iBAAiB,cAAc;AAAA,IAC/B,mBAAmB,gBAAgB;AAAA,IACnC,sBAAsB,iBAAiB;AAAA,EACzC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,CAAC,WAAmB,QAAQ,IAAI,MAAM;AAAA,IAChD,gBAAgB,CAAC,aAAqB,YAAY,IAAI,QAAQ;AAAA,IAC9D,iBAAiB,CAAC,UAAkB,SAAS,IAAI,KAAK;AAAA,IACtD,kBAAkB,CAAC,WAAsB,UAAU,IAAI,MAAM;AAAA,IAC7D,cAAc,CAAC,QAAQ;AACrB,kBAAY;AAAA,IACd;AAAA,IACA,gBAAgB,CAAC,iBAAyB,cAAc,IAAI,YAAY;AAAA,IACxE,mBAAmB,CAAC,YAAoB,iBAAiB,QAAI,0CAAyB,OAAO,CAAC;AAAA,IAC9F,iCAAiC,CAAC,QAAgB,YAChD,qBAAqB,IAAI,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,IACjD,gBAAgB,CAAC,iBAAyB,cAAc,IAAI,YAAY;AAAA,EAC1E;AACF;;;ACtaA,IAAAC,cAAkB;AAYX,IAAM,uBAAuB,cAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAoBM,IAAM,oBAA4C,cAAE;AAAA,EAAK,MAC9D,cACG,OAAO;AAAA,IACN,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA,IACzB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG1B,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,IACjC,YAAY,cAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,IAGjC,MAAM,cAAE,MAAM,CAAC,sBAAsB,cAAE,MAAM,oBAAoB,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,IAG9E,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG7B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,kBAAkB,cAAE,OAAO,EAAE,SAAS;AAAA,IACtC,kBAAkB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAGtC,MAAM,cACH,MAAM,cAAE,MAAM,CAAC,cAAE,OAAO,GAAG,cAAE,OAAO,GAAG,cAAE,QAAQ,GAAG,cAAE,KAAK,CAAC,CAAC,CAAC,EAC9D,SAAS,EACT,SAAS;AAAA,IACZ,OAAO,cAAE,MAAM,CAAC,cAAE,OAAO,GAAG,cAAE,OAAO,GAAG,cAAE,QAAQ,GAAG,cAAE,KAAK,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,IAGzE,YAAY,cAAE,OAAO,cAAE,OAAO,GAAG,iBAAiB,EAAE,SAAS;AAAA,IAC7D,UAAU,cAAE,MAAM,cAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACvC,sBAAsB,cAAE,MAAM,CAAC,cAAE,QAAQ,GAAG,iBAAiB,CAAC,EAAE,SAAS;AAAA;AAAA,IAGzE,OAAO,cAAE,MAAM,CAAC,mBAAmB,cAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,SAAS;AAAA,IACzE,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG9B,OAAO,cAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,IAC3C,OAAO,cAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,IAC3C,OAAO,cAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,IAC3C,KAAK,kBAAkB,SAAS;AAAA;AAAA,IAGhC,IAAI,kBAAkB,SAAS;AAAA,IAC/B,MAAM,kBAAkB,SAAS;AAAA,IACjC,MAAM,kBAAkB,SAAS;AAAA;AAAA,IAGjC,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,IAG5B,SAAS,cAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,IAG9B,qBAAqB,cAAE,OAAO,EAAE,SAAS;AAAA,IACzC,qBAAqB,cAAE,MAAM,cAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,IAC7D,2BAA2B,cAAE,OAAO,EAAE,SAAS;AAAA,EACjD,CAAC,EAGA,YAAY;AACjB;;;AC7GA,IAAAC,MAAoB;;;ACDpB,IAAAC,MAAoB;AACpB,WAAsB;;;ACAtB,IAAAC,MAAoB;AACpB,IAAAC,mBAKO;;;ACCP,IAAAC,MAAoB;;;ACwBpB,IAAAC,MAAoB;AACpB,IAAAC,mBAmBO;AACP,IAAAC,oBAIO;AACP,IAAAA,oBAMO;AACP,IAAAC,eAA2B;;;ACxE3B,IAAAC,MAAoB;AAEpB,IAAAC,mBAA4D;;;ACF5D,SAAoB;AAYb,SAAS,uBACd,MACA,SACuB;AACvB,QAAM,MAAM,KAAK,eAAe,KAAK,UAAU;AAC/C,MAAI,QAAQ,OAAW,QAAO;AAC9B,SAAO,IAAI,QAAW,eAAY,QAAQ,QAAQ,iBAAiB,GAAG,IAAI;AAC5E;AAOO,SAAS,0BAA0B,YAA8C;AACtF,MACK,yBAAsB,UAAU,KAChC,uBAAoB,UAAU,KAC9B,eAAY,UAAU,KACtB,0BAAuB,UAAU,GACpC;AACA,WAAO,WAAW;AAAA,EACpB;AACA,MAAO,cAAW,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,SACuB;AACvB,MAAI,WAAW,OAAW,QAAO;AACjC,SAAO,OAAO,QAAW,eAAY,QAAQ,QAAQ,iBAAiB,MAAM,IAAI;AAClF;AAWO,SAAS,yCACd,UACA,SACqC;AACrC,QAAM,SAAS,QAAQ,oBAAoB,SAAS,QAAQ;AAC5D,SAAO,qBAAqB,QAAQ,OAAO,GAAG,cAAc,KAAQ,yBAAsB;AAC5F;;;ADrDA,SAAS,4BAA4B,UAAsC;AACzE,MAAO,wBAAoB,QAAQ,GAAG;AACpC,WAAU,iBAAa,SAAS,QAAQ,IACpC,SAAS,SAAS,OAClB,SAAS,SAAS,MAAM;AAAA,EAC9B;AACA,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,4BAA4B,SAAS,IAAI;AAAA,EAClD;AACA,MACE,SAAS,SAAY,eAAW,iBAChC,SAAS,SAAY,eAAW,iBAChC,SAAS,SAAY,eAAW,iBAChC,SAAS,SAAY,eAAW,gBAChC;AACA,WAAO,SAAS,QAAQ;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,0BACP,UACA,UACA,SACkC;AAClC,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,0BAA0B,SAAS,MAAM,UAAU,OAAO;AAAA,EACnE;AACA,QAAM,WAAW,4BAA4B,QAAQ;AACrD,MAAI,aAAa,MAAM;AACrB,UAAM,SAAS,SAAS,eAAe,QAAQ;AAC/C,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAO,wBAAoB,QAAQ,KAAQ,iBAAa,SAAS,QAAQ,GAAG;AAC1E,UAAM,YAAY,yCAAyC,UAAU,OAAO;AAC5E,QAAI,cAAc,QAAW;AAC3B,aAAO,0BAA0B,UAAU,MAAM,UAAU,OAAO;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AACT;AA4BO,SAAS,4BACd,MACA,SACA,UACA,YACkC;AAClC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,eAAW,oCAAkB,IAAI;AAKvC,MAAI,eAAe,QAAW;AAC5B,UAAM,WAAW,0BAA0B,UAAU;AACrD,QAAI,aAAa,QAAW;AAC1B,YAAM,SAAS,0BAA0B,UAAU,UAAU,OAAO;AACpE,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,YAAY,SAAS,eAAe,SAAS,UAAU,IAAI,QAAQ;AACzE,QAAI,aAAa,QAAW;AAC1B,YAAM,SAAS,SAAS,eAAe,QAAQ;AAC/C,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,uBAAuB,UAAU,OAAO;AAC1D,MAAI,cAAc,QAAW;AAC3B,UAAM,WAAW,SAAS,iBAAiB,SAAS;AACpD,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,aAAS,2CAAyB,QAAQ,GAAG;AACtD,UAAM,UAAU,SAAS,gBAAgB,KAAK;AAC9C,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,uBAAuB,QAA2C;AAChF,SAAO,GAAG,OAAO,WAAW,IAAI,OAAO,aAAa,QAAQ;AAC9D;;;AEhIA,IAAAC,mBAAsC;;;AHiEtC,IAAAC,mBAeO;AAEP,SAAS,sBAAsB,SAA6B;AAC1D,SAAO;AAAA,IACL,GAAI,SAAS,sBAAsB,SAAY,EAAE,UAAU,QAAQ,kBAAkB,IAAI,CAAC;AAAA,IAC1F,GAAI,SAAS,cAAc,SAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC7E;AACF;AAEA,IAAM,8BACD,oBAAgB,eAAkB,oBAAgB;AAEvD,SAAS,sBAAsB,UAA8D;AAC3F,MAAI,aAAa,QAAW;AAC1B,WAAO,oBAAI,IAAI;AAAA,EACjB;AACA,SAAO,IAAI;AAAA,IACT,SAAS,WAAW;AAAA,MAAQ,CAAC,SAC1B,IAAI,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,YAAgD;AAC5E,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,aAAW,aAAa,WAAW,YAAY;AAC7C,QAAO,wBAAoB,SAAS,KAAK,UAAU,iBAAiB,QAAW;AAC7E,YAAM,SAAS,UAAU;AACzB,UAAI,OAAO,SAAS,QAAW;AAC7B,sBAAc,IAAI,OAAO,KAAK,IAAI;AAAA,MACpC;AACA,UAAI,OAAO,kBAAkB,QAAW;AACtC,YAAO,mBAAe,OAAO,aAAa,GAAG;AAC3C,qBAAW,aAAa,OAAO,cAAc,UAAU;AACrD,0BAAc,IAAI,UAAU,KAAK,IAAI;AAAA,UACvC;AAAA,QACF,WAAc,sBAAkB,OAAO,aAAa,GAAG;AACrD,wBAAc,IAAI,OAAO,cAAc,KAAK,IAAI;AAAA,QAClD;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAO,8BAA0B,SAAS,GAAG;AAC3C,oBAAc,IAAI,UAAU,KAAK,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAA8B;AAC9D,QAAM,SAAS,KAAK;AAEpB,OACM,qBAAiB,MAAM,KACtB,uBAAmB,MAAM,KACzB,sBAAkB,MAAM,KACxB,iBAAa,MAAM,KACnB,0BAAsB,MAAM,KAC5B,yBAAqB,MAAM,KAC3B,mBAAe,MAAM,KACrB,8BAA0B,MAAM,KAChC,sBAAkB,MAAM,KACxB,2BAAuB,MAAM,KAC7B,wBAAoB,MAAM,KAC1B,sBAAkB,MAAM,KACxB,wBAAoB,MAAM,KAC1B,sBAAkB,MAAM,KACxB,sBAAkB,MAAM,KACxB,gBAAY,MAAM,KAClB,0BAAsB,MAAM,KAC5B,wBAAoB,MAAM,KAC1B,6BAAyB,MAAM,KAC/B,6BAAyB,MAAM,KAC/B,2BAAuB,MAAM,KAC7B,+BAA2B,MAAM,KACjC,0BAAsB,MAAM,MACjC,OAAO,SAAS,MAChB;AACA,WAAO;AAAA,EACT;AAEA,OACM,yBAAqB,MAAM,KAAQ,+BAA2B,MAAM,MACxE,OAAO,SAAS,MAChB;AACA,WAAO;AAAA,EACT;AAEA,MAAO,oBAAgB,MAAM,KAAK,OAAO,UAAU,MAAM;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,MAAe,eAA6C;AAC7F,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AAEZ,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,MAAO;AAEX,QAAO,iBAAa,IAAI,KAAK,cAAc,IAAI,KAAK,IAAI,KAAK,CAAC,yBAAyB,IAAI,GAAG;AAC5F,cAAQ;AACR;AAAA,IACF;AAEA,IAAG,iBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,IAAI;AACV,SAAO;AACT;AAOA,SAAS,iBACP,WAC0C;AAC1C,MAAO,2BAAuB,SAAS,GAAG;AACxC,WAAO,UAAU;AAAA,EACnB;AACA,MAAO,sBAAkB,UAAU,IAAI,GAAG;AACxC,WAAO,UAAU,KAAK;AAAA,EACxB;AACA,SAAO;AACT;AAiBA,SAAS,2BACP,WACA,YACA,eACe;AACf,QAAM,UAAU,iBAAiB,SAAS;AAC1C,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,eAAiD,CAAC;AAExD,aAAW,UAAU,SAAS;AAK5B,QAAI,CAAI,wBAAoB,MAAM,GAAG;AACnC,UAAI,0BAA0B,QAAQ,aAAa,GAAG;AACpD,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAEA,UAAM,iBAAiB,OAAO;AAC9B,QAAI,mBAAmB,OAAW;AAElC,QAAI,0BAA0B,gBAAgB,aAAa,GAAG;AAC5D,mBAAa,KAAK;AAAA,QAChB,OAAO,eAAe,SAAS,UAAU;AAAA,QACzC,KAAK,eAAe,OAAO;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,UAAU,QAAQ,UAAU;AAAA,EACrC;AAKA,QAAM,YAAY,UAAU,SAAS,UAAU;AAC/C,MAAI,SAAS,UAAU,QAAQ,UAAU;AACzC,aAAW,EAAE,OAAO,IAAI,KAAK,CAAC,GAAG,YAAY,EAAE,QAAQ,GAAG;AACxD,aAAS,OAAO,MAAM,GAAG,QAAQ,SAAS,IAAI,YAAY,OAAO,MAAM,MAAM,SAAS;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAAS,4BACP,YACA,oBACmB;AACnB,QAAM,gBAAgB,qBAAqB,UAAU;AAIrD,QAAM,sBAAsB,IAAI;AAAA,IAC9B,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,mBAAmB,IAAI,IAAI,CAAC;AAAA,EACnE;AAEA,QAAM,SAAmB,CAAC;AAE1B,aAAW,aAAa,WAAW,YAAY;AAE7C,QAAO,wBAAoB,SAAS,EAAG;AACvC,QAAO,8BAA0B,SAAS,EAAG;AAC7C,QAAO,wBAAoB,SAAS,KAAK,UAAU,oBAAoB,OAAW;AAElF,QAAI,CAAC,0BAA0B,WAAW,mBAAmB,GAAG;AAC9D,aAAO,KAAK,UAAU,QAAQ,UAAU,CAAC;AACzC;AAAA,IACF;AAOA,QAAO,2BAAuB,SAAS,KAAQ,2BAAuB,SAAS,GAAG;AAChF,YAAM,YAAY,2BAA2B,WAAW,YAAY,mBAAmB;AACvF,UAAI,cAAc,MAAM;AACtB,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,QACA,WACM;AACN,aAAW,cAAc,WAAW;AAClC,SACG,WAAW,SAAS,sCACnB,WAAW,SAAS,8BACtB,OAAO;AAAA,MACL,CAAC,aAAa,SAAS,SAAS,WAAW,QAAQ,SAAS,YAAY,WAAW;AAAA,IACrF,GACA;AACA;AAAA,IACF;AACA,WAAO,KAAK,UAAU;AAAA,EACxB;AACF;AAUA,SAAS,qBACP,SACA,MACA,WACA,YACA,MACA,YACA,wBACA,SACA,aACA,aACM;AACN,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,oBAAoB,SAAS,GAAG;AAClC,kCAA8B,aAAa,mBAAmB;AAC9D;AAAA,EACF;AACA,QAAM,qBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,OAAO;AAAA,EAC/B;AACA,MAAI,gBAAgB;AAClB,gBAAY,KAAK,cAAc;AAAA,EACjC;AACF;AAEA,SAAS,kCACP,WACA,cACe;AACf,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,YAAY,IAAI;AAClB,WAAO;AAAA,EACT;AAEA,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAKH,UAAI,YAAY,cAAc,YAAY,eAAe,YAAY,OAAO;AAC1E,eAAO;AAAA,MACT;AACA,aAAO,OAAO,SAAS,OAAO,OAAO,CAAC,IAAI,UAAU,KAAK,UAAU,OAAO;AAAA,IAC5E,KAAK;AACH,aAAO,KAAK,UAAU,YAAY;AAAA,IACpC,KAAK;AACH,UAAI;AACF,aAAK,MAAM,OAAO;AAClB,eAAO,IAAI,OAAO;AAAA,MACpB,QAAQ;AACN,eAAO,KAAK,UAAU,OAAO;AAAA,MAC/B;AAAA,IACF,KAAK;AACH,aAAO,YAAY,UAAU,YAAY,UAAU,UAAU,KAAK,UAAU,OAAO;AAAA,IACrF,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,aAAO,OAAO,SAAS;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAAe,SAAyC;AACnF,MAAI,CAAC,QAAQ,YAAY,IAAI,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,iBAAiB,IAAwB,EAAE,CAAC,KAAK;AAClE;AAEA,SAAS,6BACP,MACA,SACA,YACS;AACT,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,UAAI,4CAA0B,MAAM,SAAS,UAAU,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,eAAe;AAChC,UAAM,WAAW,oBAAoB,MAAM,OAAO;AAClD,WAAO,aAAa,YAAQ,4CAA0B,UAAU,SAAS,UAAU;AAAA,EACrF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB;AAC5B,IAAM,iBAAiB;AAEvB,SAAS,sBAAsB,MAAwB;AACrD,MAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,KAAK,MAAM;AAAA,IAC5B,CAAC,YAAY,OAAO,SAAY,cAAU,OAAU,cAAU,gBAAgB;AAAA,EAChF;AACA,MAAI,WAAW,WAAW,KAAK,WAAW,CAAC,MAAM,QAAW;AAC1D,WAAO,WAAW,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAwB;AAC9C,SAAO,KAAK,kBAAkB,EAAE,SAAS,KAAK,KAAK,uBAAuB,EAAE,SAAS;AACvF;AAEA,SAAS,4BAA4B,UAAqB,aAAsC;AAC9F,MAAI,SAAS,KAAK,WAAW,IAAI,GAAG;AAClC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe,YAAY,SAAS,QAAW;AAC3D,UAAM,OAAO,YAAY;AACzB,QAAO,2BAAuB,IAAI,KAAQ,wBAAoB,IAAI,GAAG;AACnE,aAAO;AAAA,IACT;AACA,QAAI,CAAI,iBAAa,IAAI,KAAK,CAAI,oBAAgB,IAAI,KAAK,CAAI,qBAAiB,IAAI,GAAG;AACrF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAcA,SAAS,gCACP,MACA,SACA,YACmB;AACnB,QAAM,MAAgB,CAAC;AACvB,QAAM,QAAQ,CAAC,SAAkB,QAA2B,UAAwB;AAClF,QAAI,QAAQ,gBAAgB;AAC1B;AAAA,IACF;AACA,UAAM,WAAW,sBAAsB,OAAO;AAC9C,QAAI,eAAe,QAAQ,GAAG;AAC5B;AAAA,IACF;AACA,QAAI,KAAC,4CAA0B,UAAU,SAAS,aAAa,GAAG;AAChE;AAAA,IACF;AACA,eAAW,YAAY,SAAS,cAAc,GAAG;AAC/C,YAAM,cAAc,SAAS,oBAAoB,SAAS,eAAe,CAAC;AAC1E,UAAI,gBAAgB,QAAW;AAC7B;AAAA,MACF;AACA,UAAI,CAAC,4BAA4B,UAAU,WAAW,GAAG;AACvD;AAAA,MACF;AACA,YAAM,eAAe,QAAQ,0BAA0B,UAAU,WAAW;AAC5E,YAAMC,QAAO,CAAC,GAAG,QAAQ,SAAS,IAAI;AACtC,UAAI,6BAA6B,cAAc,SAAS,UAAU,GAAG;AACnE,YAAI,KAAKA,MAAK,KAAK,GAAG,CAAC;AACvB;AAAA,MACF;AACA,YAAM,uBAAuB,sBAAsB,YAAY;AAC/D,UACE,CAAC,eAAe,oBAAoB,SACpC,4CAA0B,sBAAsB,SAAS,aAAa,GACtE;AACA,cAAM,sBAAsBA,OAAM,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,CAAC,GAAG,CAAC;AACjB,SAAO;AACT;AAEA,SAAS,oBACP,aACA,SACA,YACA,SACA,cACe;AAIf,MAAI,KAAC,4CAA0B,aAAa,SAAS,aAAa,GAAG;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,gCAAgC,aAAa,SAAS,UAAU;AACnF,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,cAAc,KAAK,KAAK;AACxC,QAAM,gBAAgB,CAACA,UACrB,YAAY,KAAK,IAAI,OAAO,KAAKA,KAAI,KAAK,IAAI,OAAO,KAAKA,KAAI,IAAI,OAAO;AAE3E,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,yDAAyD,cAAc,OAAO,CAAC;AAAA,EACxF;AAEA,QAAM,QAAQ,WAAW,MAAM,GAAG,mBAAmB;AACrD,QAAM,WAAW,WAAW,SAAS,sBAAsB,aAAQ;AACnE,SAAO,gEAAgE,MAAM,KAAK,IAAI,CAAC,GAAG,QAAQ,WAAW,cAAc,OAAO,CAAC;AACrI;AAEA,SAAS,eACP,MACA,SACA,YAC8B;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB;AACF;AAEA,SAAS,eACP,WACQ;AACR,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,YAAwC;AAC/D,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,WAAqD;AACrF,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,WAAW,SAAS,SAAS;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU,QAAQ;AAAA,IACtC,CAAC,WAA4D,OAAO,SAAS;AAAA,EAC/E;AACA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,UAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,QAAQ;AACtF,QAAM,yBAAyB,iBAAiB;AAAA,IAC9C,CAAC,WAAW,OAAO,SAAS,eAAe,OAAO,kBAAkB;AAAA,EACtE;AACA,QAAM,eAAe,cAAc,CAAC;AACpC,SAAO,0BAA0B,iBAAiB,SAAY,aAAa,SAAS;AACtF;AAEA,SAAS,+BAA+B,SAAiB,SAAsC;AAC7F,QAAM,kBAAkB,yBAAyB,SAAS,SAAS;AACnE,SACE,oBAAoB,UACpB,SAAS,mBAAmB,gCAAgC,iBAAiB,OAAO,MAClF;AAEN;AAEA,SAAS,yCACP,MACA,YACA,SACA,WACA,SACA,YACA,wBACA,SACyC;AACzC,MAAI,KAAC,2CAAwB,OAAO,GAAG;AACrC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,SAAS;AAC7B,MAAI,YAAY,UAAa,gBAAgB,QAAW;AACtD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAY,8CAA4B,IAAI;AAClD,MAAI,cAAc,MAAM;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAa,mCAAiB,SAAS,SAAS,mBAAmB,UAAU;AACnF,MAAI,eAAe,MAAM;AACvB,WAAO,CAAC;AAAA,EACV;AAKA,QAAM,mBAAgF;AACtF,QAAM,UAAM,iCAAe;AAC3B,QAAM,oBAAgB,sCAAoB;AAC1C,QAAM,mBAAe,qCAAmB;AACxC,QAAM,qBAAiB,uCAAqB;AAC5C,QAAM,cAAc,QAAQ,2BAAc,kBAAkB;AAC5D,QAAM,wBAAwB,iBAAiB;AAC/C,QAAM,0BAA0B,mBAAmB;AACnD,QAAM,WAAW,kBAAc,4BAAU,IAAI;AAC7C,QAAM,kBAAkB,kBAAc,mCAAiB,aAAa,OAAO,IAAI;AAS/E,WAAS,KACP,SACAC,SACyC;AACzC,QAAI,CAAC,aAAa;AAChB,aAAOA;AAAA,IACT;AACA,UAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,aAAa;AAAA,MACb,mBAAe,gCAAc,QAAQ;AAAA,IACvC;AACA,4CAAkB,KAAK,KAAK;AAC5B,QAAI,YAAY,YAAY,YAAY,QAAQ,YAAY,MAAM;AAChE,8CAAkB,eAAe,KAAK;AAAA,IACxC;AACA,WAAOA;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,WAAW,SAAS,SAAS,GAAG;AAC9C,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE;AAAA,QACA,SAAS,OAAO,uBAAuB,eAAe,SAAS,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,WAAW,UAAU;AAIpC,MAAI,gBAAyB;AAC7B,MAAI,cAAc,KAAK,QAAQ,UAAU;AACzC,MAAI,WAAW,MAAM;AACnB,QAAI,OAAO,SAAS,QAAQ;AAC1B,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,UACE;AAAA,UACA,SAAS,OAAO,sBAAsB,OAAO,IAAI;AAAA,UACjD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,OAAO,SAAS,OAAO,SAAS,MAAM;AACzC,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,UACE;AAAA,UACA,SAAS,OAAO;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,iBAAa,wCAAsB,aAAa,SAAS,OAAO,KAAK,QAAQ;AACnF,QAAI,WAAW,SAAS,oBAAoB;AAC1C,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,UACE;AAAA,UACA,WAAW,OAAO,OAAO,gCAAgC,OAAO,sCAAsC,WAAW,OAAO;AAAA,UACxH;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,SAAS,gBAAgB;AACtC,YAAM,aAAa,QAAQ,aAAa,WAAW,MAAM,MAAM,2BAA2B;AAC1F,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,UACE;AAAA,UACA,WAAW,OAAO,OAAO,gCAAgC,OAAO,8BAA8B,UAAU;AAAA,UACxG;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,oBAAgB,WAAW;AAC3B,kBAAc,OAAO;AAAA,EACvB;AAcA,QAAM,iBAAiB,MAAe;AACpC,QAAI,WAAW,MAAM;AACnB,cACE,4CAAsB,oCAAkB,WAAW,CAAC,KACpD,WAAW,aAAa,SAAS,oBAAoB,GACrD;AACA,eAAO;AAAA,MACT;AACA,aAAO,+BAA+B,SAAS,OAAO;AAAA,IACxD;AACA,UAAM,WAAW,SAAS;AAC1B,QAAI,aAAa,OAAW,QAAO;AACnC,UAAM,WAAW,4BAA4B,eAAe,SAAS,QAAQ;AAC7E,WACE,aAAa,QACb,SAAS,gCAAgC,uBAAuB,QAAQ,GAAG,OAAO,MAChF;AAAA,EAEN,GAAG;AAEH,MAAI,CAAC,eAAe;AAClB,UAAM,qBAAqB,WAAW,aAAa,CAAC;AACpD,QACE,uBAAuB,UACvB,CAAC,6BAA6B,eAAe,SAAS,kBAAkB,GACxE;AACA,YAAM,aAAa,QAAQ,aAAa,eAAe,MAAM,2BAA2B;AACxF,YAAM,cAAc,WAAW,WAAW,kBAAkB,OAAO,sBAAsB,gBAAgB,kBAAkB,CAAC,gCAAgC,UAAU;AAItK,YAAM,OACJ,WAAW,OACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb,IACA;AACN,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,UACE;AAAA,UACA,SAAS,OAAO,cAAc,GAAG,WAAW,KAAK,IAAI;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAmBA,MAAI,eAAe;AACjB,WAAO,KAAK,UAAU,CAAC,CAAC;AAAA,EAC1B;AASA,QAAM,4BAAwB,+CAA6B,SAAS,SAAS,SAAS;AAEtF,QAAM,uBAAmB,mCAAiB,SAAS,uBAAuB,OAAO;AAEjF,MAAI,CAAC,iBAAiB,IAAI;AAExB,QAAI,yBAAyB;AAC3B,qBAAe,MAAM,yBAAyB;AAAA,QAC5C,UAAU;AAAA,QACV,KAAK;AAAA,QACL,WAAW;AAAA,QACX,iBAAiB,oBAAoB,KAAK,kBAAkB;AAAA,QAC5D,aAAa;AAAA,QACb,gBAAgB,iBAAiB,WAAW;AAAA,MAC9C,CAAC;AAAA,IACH;AAMA,UAAM,iBAAa,+CAA6B,iBAAiB,WAAW,MAAM,OAAO;AACzF,WAAO,KAAK,YAAY;AAAA,MACtB,eAAe,YAAY,iBAAiB,WAAW,SAAS,UAAU;AAAA,IAC5E,CAAC;AAAA,EACH;AAIA,MAAI,yBAAyB;AAC3B,mBAAe,MAAM,uBAAuB;AAAA,MAC1C,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX,iBAAiB,oBAAoB,KAAK,kBAAkB;AAAA,MAC5D,aAAa;AAAA,MACb,WAAW,iBAAiB,MAAM;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB;AAAA,IACzB,WAAW;AAAA,IACX;AAAA,EACF;AAUA,QAAM,kBAAkB,QAAQ,aAAa,aAAa,MAAM,2BAA2B;AAC3F,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,eAAe,QAAQ,aAAa,UAAU,MAAM,2BAA2B;AAGrF,MAAI,uBAAuB;AACzB,iBAAa,MAAM,8BAA8B;AAAA,MAC/C,UAAU;AAAA,MACV,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAS,+CAA6B;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,IACb,GAAI,QAAQ,SAAS,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAiB,MAAM,OAAO,QAAQ,EAAE,IAAI,CAAC;AAAA,IAC7F,GAAI,uBAAuB,OAAO,EAAE,mBAAmB,IAAI,CAAC;AAAA,IAC5D;AAAA,IACA,GAAI,SAAS,sBAAsB,SAC/B;AAAA,MACE,YAAY,QAAQ,kBAAkB,WAAW,IAAI,CAAC,eAAe;AAAA,QACnE,aAAa,UAAU;AAAA,QACvB,GAAI,UAAU,mBAAmB,SAC7B;AAAA,UACE,gBAAgB,UAAU,eAAe,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE;AAAA,QAClF,IACA,CAAC;AAAA,QACL,GAAI,UAAU,kBAAkB,SAC5B;AAAA,UACE,eAAe,UAAU;AAAA,QAC3B,IACA,CAAC;AAAA,QACL,GAAI,UAAU,UAAU,SACpB;AAAA,UACE,aAAa,UAAU,MAAM,IAAI,CAAC,OAAO;AAAA,YACvC,aAAa,EAAE,eAAe,CAAC,EAAE,QAAQ;AAAA,UAC3C,EAAE;AAAA,QACJ,IACA,CAAC;AAAA,MACP,EAAE;AAAA,IACJ,IACA,CAAC;AAAA,EACP,CAAC;AAED,MAAI,OAAO,YAAY,WAAW,GAAG;AAInC,WAAO,KAAK,UAAU,CAAC,CAAC;AAAA,EAC1B;AAEA,QAAM,kBAAkB,OAAO,YAAY,KAAK,CAAC,eAAe,WAAW,SAAS,YAAY;AAChG,MAAI,oBAAoB,QAAW;AACjC,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,YACE,0CAAwB,gBAAgB,IAAI;AAAA,QAC5C,gBAAgB;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBACJ,WAAW,cAAc,OAAO,wBAAwB,gBAAgB,WAAW,SAAS;AAC9F,SAAO,KAAK,YAAY;AAAA,IACtB;AAAA,MACE;AAAA,MACA,SAAS,OAAO,sCAAsC,aAAa;AAAA,MACnE;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,mBAAmB,oBAAI,IAA8B;AAE3D,SAAS,qBAAqB,SAAgD;AAC5E,SAAO;AAAA,IACL,GAAI,SAAS,mBAAmB,WAAW;AAAA,MAAQ,CAAC,eACjD,UAAU,kBAAkB,CAAC,GAAG,IAAI,CAAC,YAAQ,2CAAyB,IAAI,OAAO,CAAC;AAAA,IACrF,KAAK,CAAC;AAAA,IACN,GAAI,SAAS,mBAAmB,WAAW;AAAA,MAAQ,CAAC,eACjD,UAAU,iBAAiB,CAAC,GAAG,IAAI,CAAC,aAAS,2CAAyB,KAAK,OAAO,CAAC;AAAA,IACtF,KAAK,CAAC;AAAA,EACR,EAAE,KAAK;AACT;AAoDA,SAAS,6BAA6B,UAAiD;AACrF,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,WACb;AAAA,IAAI,CAAC,cACJ,KAAK,UAAU;AAAA,MACb,aAAa,UAAU;AAAA,MACvB,WAAW,UAAU,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,KAAK,CAAC;AAAA,MAC7D,gBACE,UAAU,gBAAgB,IAAI,CAAC,YAAQ,2CAAyB,IAAI,OAAO,CAAC,KAAK,CAAC;AAAA,MACpF,eACE,UAAU,eAAe,IAAI,CAAC,UAAU;AAAA,QACtC,aAAS,2CAAyB,KAAK,OAAO;AAAA,QAC9C,kBAAkB,CAAC,GAAG,KAAK,gBAAgB,EAAE,KAAK;AAAA,QAClD,WAAW,KAAK,cAAc;AAAA,QAC9B,aAAa,KAAK,cAAc,CAAC,GAC9B,IAAI,CAAC,eAAe;AAAA,UACnB,WAAW,UAAU;AAAA,UACrB,GAAI,UAAU,oBAAoB,SAC9B,EAAE,iBAAiB,UAAU,gBAAgB,IAC7C,CAAC;AAAA,QACP,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,KAAK,UAAU,cAAc,MAAM,SAAS,CAAC;AAAA,MACxE,EAAE,KAAK,CAAC;AAAA,IACZ,CAAC;AAAA,EACH,EACC,KAAK,GAAG;AACb;AAEA,SAAS,iBACP,MACA,MACA,SACQ;AACR,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,UAAU,SAAS;AACzB,SAAO,KAAK,UAAU;AAAA,IACpB;AAAA,IACA,YAAY,WAAW;AAAA,IACvB,YAAY,WAAW;AAAA,IACvB,OAAO,KAAK,aAAa;AAAA,IACzB,KAAK,KAAK,OAAO;AAAA,IACjB,WAAW,SAAS,aAAa;AAAA,IACjC,aACE,YAAY,UAAa,SAAS,gBAAgB,SAC9C,QAAQ,aAAa,QAAQ,aAAa,MAAM,2BAA2B,IAC3E;AAAA,IACN,UACE,YAAY,UAAa,SAAS,aAAa,SAC3C,QAAQ,aAAa,QAAQ,UAAU,MAAM,2BAA2B,IACxE;AAAA,IACN,YAAY,6BAA6B,SAAS,iBAAiB;AAAA,EACrE,CAAC;AACH;AAgBO,SAAS,eACd,MACA,OAAO,IACP,SACkB;AAClB,QAAM,WAAW,iBAAiB,MAAM,MAAM,OAAO;AACrD,QAAM,SAAS,iBAAiB,IAAI,QAAQ;AAC5C,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAcA,QAAM,aAAa,SAAS,mBAAmB;AAC/C,MAAI,eAAe,UAAa,WAAW,SAAS,GAAG;AACrD,UAAMA,UAA2B;AAAA,MAC/B,aAAa,CAAC;AAAA,MACd,aAAa,CAAC;AAAA,MACd,iBAAa,wCAAsB,YAAY,IAAI;AAAA,IACrD;AACA,qBAAiB,IAAI,UAAUA,OAAM;AACrC,WAAOA;AAAA,EACT;AAEA,QAAM,cAAgC,CAAC;AACvC,QAAM,cAAgC,CAAC;AACvC,QAAM,cAA8C,CAAC;AACrD,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,WAAW,YAAY;AAI1C,QAAM,qBAAqB,sBAAsB,SAAS,iBAAiB;AAE3E,QAAM,yBAAyB,4BAA4B,YAAY,kBAAkB;AACzF,QAAM,gBAAmB,4BAAwB,YAAY,KAAK,aAAa,CAAC;AAIhF,QAAM,mBAAmB,wBAAwB,MAAM,IAAI;AAE3D,QAAM,oBAAoB,qBAAqB,OAAO;AAEtD,MAAI,eAAe;AACjB,eAAW,SAAS,eAAe;AAEjC,UAAI,MAAM,SAAY,eAAW,wBAAwB;AACvD;AAAA,MACF;AACA,YAAM,cAAc,WAAW,UAAU,MAAM,KAAK,MAAM,GAAG;AAC7D,UAAI,CAAC,YAAY,WAAW,KAAK,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,aAAa,SAAS,mBAAmB;AAC/C,YAAM,cAAU,sCAAoB,aAAa;AAAA,QAC/C,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACnD,CAAC;AAED,iBAAW,OAAO,QAAQ,MAAM;AAC9B,cAAM,UAAU,IAAI;AAEpB,YAAI,YAAY,iBAAiB,YAAY,YAAY,YAAY,eAAe;AAClF,gBAAMC,QAAO,IAAI;AACjB,cAAIA,UAAS,GAAI;AAEjB,gBAAMC,cAAa,uBAAuB,KAAK,YAAY,IAAI;AAC/D,kBAAQ,SAAS;AAAA,YACf,KAAK;AACH,kBAAI,CAAC,0BAA0BD,KAAI,KAAK,gBAAgB,QAAW;AACjE,8BAAcA;AACd,wCAAwBC;AAAA,cAC1B;AACA;AAAA,YAEF,KAAK;AACH,0BAAY,KAAK;AAAA,gBACf,MAAM;AAAA,gBACN,gBAAgB;AAAA,gBAChB,OAAOD;AAAA,gBACP,YAAAC;AAAA,cACF,CAAC;AACD;AAAA,YAEF,KAAK;AACH,kBAAI,gBAAgB,QAAW;AAC7B,8BAAcD;AACd,wCAAwBC;AAAA,cAC1B;AACA;AAAA,UACJ;AACA;AAAA,QACF;AAEA,YAAI,yCAAwB,IAAI,OAAO,GAAG;AAKxC,gBAAM,WAAW,iBAAiB,IAAI,OAAO,GAAG,MAAM;AACtD,gBAAMD,YAAO,6CAA2B,IAAI,qBAAqB,UAAU,QAAQ,EAAE;AACrF,cAAIA,UAAS,GAAI;AAEjB,gBAAMC,cAAa,uBAAuB,KAAK,YAAY,IAAI;AAC/D,cAAI,YAAY,gBAAgB;AAC9B,wBAAY,SAAK,4CAA0BD,OAAMC,WAAU,CAAC;AAC5D;AAAA,UACF;AAEA;AAAA,YACE;AAAA,YACAD;AAAA,YACA;AAAA,YACAC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,QACF;AAGA,cAAM,OAAO,IAAI;AACjB,cAAM,mBAAe,2CAAwB,OAAO,IAChD,iDAA+B,OAAO,IACtC;AACJ,YAAI,SAAS,MAAM,iBAAiB,UAAW;AAE/C,cAAM,aAAa,uBAAuB,KAAK,YAAY,IAAI;AAC/D;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ,cAAc;AACxB,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,GAAI,QAAQ,uBAAuB,MAAM,EAAE,SAAS,QAAQ,mBAAmB;AAAA,UAC/E,YAAY,qBAAqB,OAAO,YAAY,MAAM,YAAY;AAAA,QACxE,CAAC;AAAA,MACH;AAGA,UAAI,QAAQ,gBAAgB,IAAI;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,OAAO,QAAQ;AAAA,UACf,YAAY,qBAAqB,OAAO,YAAY,MAAM,SAAS;AAAA,QACrE,CAAC;AAAA,MACH;AAGA,UAAI,QAAQ,gBAAgB,IAAI;AAC9B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,OAAO,QAAQ;AAAA,UACf,YAAY,qBAAqB,OAAO,YAAY,MAAM,SAAS;AAAA,QACrE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,UAAa,0BAA0B,QAAW;AACpE,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,UAAa,0BAA0B,QAAW;AACpE,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAIA,aAAW,CAAC,SAAS,SAAS,KAAK,kBAAkB;AACnD,eAAW,YAAY,WAAW;AAChC,YAAM,OAAO,SAAS,KAAK,KAAK;AAChC,UAAI,SAAS,GAAI;AAEjB,YAAM,aAAa,SAAS;AAC5B,UAAI,YAAY,gBAAgB;AAC9B,oBAAY,SAAK,4CAA0B,MAAM,UAAU,CAAC;AAC5D;AAAA,MACF;AAEA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,EAAE,aAAa,aAAa,YAAY;AACvD,mBAAiB,IAAI,UAAU,MAAM;AACrC,SAAO;AACT;AA+BO,SAAS,2BAA2B,MAAoC;AAC7E,MAAI;AACJ,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,WAAW,YAAY;AAC1C,QAAM,gBAAmB,4BAAwB,YAAY,KAAK,aAAa,CAAC;AAEhF,MAAI,eAAe;AACjB,eAAW,SAAS,eAAe;AACjC,UAAI,MAAM,SAAY,eAAW,uBAAwB;AACzD,YAAM,cAAc,WAAW,UAAU,MAAM,KAAK,MAAM,GAAG;AAC7D,UAAI,CAAC,YAAY,WAAW,KAAK,EAAG;AAEpC,YAAM,cAAU,sCAAoB,WAAW;AAC/C,iBAAW,OAAO,QAAQ,MAAM;AAC9B,YAAI,IAAI,sBAAsB,eAAe;AAC3C;AAAA,QACF;AAEA,YAAI,IAAI,WAAW,QAAQ,IAAI,iBAAiB,IAAI;AAClD,6BAAmB,IAAI,IAAI,OAAO,SAAS,IAAI,YAAY;AAC3D;AAAA,QACF;AAEA,YAAI,IAAI,iBAAiB,IAAI;AAC3B,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C;AAAA,EACF;AACF;AAoBA,SAAS,wBACP,MACA,MACyD;AACzD,QAAM,YAAY,oBAAI,IAAwD;AAE9E,aAAW,OAAU,iBAAa,IAAI,GAAG;AACvC,UAAM,cAAU,8CAA2B,IAAI,QAAQ,IAAI;AAC3D,QAAI,CAAC,yCAAwB,IAAI,OAAO,EAAG;AAE3C,UAAM,cAAc,kBAAkB,GAAG,GAAG,KAAK,KAAK;AACtD,QAAI,gBAAgB,GAAI;AAExB,UAAM,UAAU,UAAU,IAAI,OAAO,KAAK,CAAC;AAC3C,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,YAAY,sBAAsB,KAAK,IAAI;AAAA,IAC7C,CAAC;AACD,cAAU,IAAI,SAAS,OAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAMA,SAAS,0BAA0B,MAAuB;AACxD,aAAO,iCAAe,eAAe,IAAI,EAAE,WAAW;AACxD;AAMA,SAAS,qBACP,OACA,YACA,MACA,SACY;AACZ,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW,8BAA8B,MAAM,GAAG;AAC9E,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,uBACP,KACA,YACA,MACY;AACZ,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW,8BAA8B,IAAI,YAAY,KAAK;AAC1F,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,MAAM,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,sBAAsB,KAAkB,MAA0B;AACzE,QAAM,aAAa,IAAI,cAAc;AACrC,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW,8BAA8B,IAAI,SAAS,CAAC;AACnF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ;AAAA,IACR,SAAS,MAAM,IAAI,QAAQ;AAAA,EAC7B;AACF;AAKA,SAAS,kBAAkB,KAAsC;AAC/D,MAAI,IAAI,YAAY,QAAW;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI,YAAY,UAAU;AACnC,WAAO,IAAI;AAAA,EACb;AACA,SAAU,0BAAsB,IAAI,OAAO;AAC7C;;;AD/iDO,SAAS,wBACd,MACA,OAAO,IACP,SACkB;AAClB,SAAO,eAAe,MAAM,MAAM,OAAO;AAC3C;AAaO,SAAS,4BACd,MACA,OAAO,IACP,SACkB;AAClB,QAAM,SAAS,wBAAwB,MAAM,MAAM,OAAO;AAC1D,SAAO,CAAC,GAAG,OAAO,WAAW;AAC/B;AAUO,SAAS,4BACd,MACA,OAAO,IACP,SACkB;AAClB,QAAM,SAAS,wBAAwB,MAAM,MAAM,OAAO;AAC1D,SAAO,CAAC,GAAG,OAAO,WAAW;AAC/B;AAiBO,SAAS,8BACd,aACA,OAAO,IACgB;AACvB,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI;AAEJ,MAAO,oBAAgB,WAAW,GAAG;AACnC,YAAQ,YAAY;AAAA,EACtB,WAAc,qBAAiB,WAAW,GAAG;AAC3C,YAAQ,OAAO,YAAY,IAAI;AAAA,EACjC,WAAW,YAAY,SAAY,eAAW,aAAa;AACzD,YAAQ;AAAA,EACV,WAAW,YAAY,SAAY,eAAW,cAAc;AAC1D,YAAQ;AAAA,EACV,WAAW,YAAY,SAAY,eAAW,aAAa;AACzD,YAAQ;AAAA,EACV,WAAc,4BAAwB,WAAW,GAAG;AAClD,QACE,YAAY,aAAgB,eAAW,cACpC,qBAAiB,YAAY,OAAO,GACvC;AACA,cAAQ,CAAC,OAAO,YAAY,QAAQ,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,UAAU,OAAW,QAAO;AAEhC,QAAM,aAAa,YAAY,cAAc;AAC7C,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW,8BAA8B,YAAY,SAAS,CAAC;AAE3F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,MAAM,OAAO;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AD1EA,SAAS,aAAa,MAAsC;AAC1D,SAAO,CAAC,EAAE,KAAK,QAAW,cAAU;AACtC;AAEA,SAAS,mBAAmB,MAA4C;AACtE,SAAO,CAAC,EAAE,KAAK,QAAW,cAAU;AACtC;AAEO,SAAS,oCAAoC,UAAgC;AAClF,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,oCAAoC,SAAS,IAAI;AAAA,EAC1D;AAEA,MAAO,sBAAkB,QAAQ,KAAQ,wBAAoB,QAAQ,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,SACK,2BAAuB,QAAQ,KAClC,SAAS,MAAM,SAAS,KACxB,SAAS,MAAM,MAAM,CAAC,WAAW,oCAAoC,MAAM,CAAC;AAEhF;AAEA,SAAS,kCAAkC,MAAe,SAAkC;AAC1F,MAAI,mBAAmB,IAAI,GAAG;AAC5B,WACE,KAAK,MAAM,SAAS,KACpB,KAAK,MAAM,MAAM,CAAC,WAAW,kCAAkC,QAAQ,OAAO,CAAC;AAAA,EAEnF;AAEA,SACE,aAAa,IAAI,KACjB,QAAQ,oBAAoB,MAAS,kBAAc,IAAI,EAAE,WAAW,KACpE,QAAQ,oBAAoB,MAAS,kBAAc,SAAS,EAAE,WAAW,KACzE,CAAC,QAAQ,YAAY,IAAI,KACzB,CAAC,QAAQ,YAAY,IAAI;AAE7B;AAOA,SAAS,gBAAgB,MAAyC;AAEhE,SACE,CAAC,EAAE,KAAK,QAAW,cAAU,WAC7B,CAAC,EAAG,KAAuB,cAAiB,gBAAY;AAE5D;AAQA,IAAM,6BAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,YAAY,CAAC;AAAA,EACb,sBAAsB;AACxB;AAEA,SAAS,iBACP,mBACA,WACA,SACA,aACA,UAC2D;AAC3D,MACE,sBAAsB,UACtB,cAAc,UACd,YAAY,UACZ,gBAAgB,UAChB,aAAa,QACb;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,IAC3D,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,IAC3C,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,EAC3C;AACF;AAuFO,SAAS,6BACd,OACA,eACwB;AACxB,SAAO;AAAA,IACL,KAAK;AAAA,IACL,YAAY,wBAAwB,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAaA,IAAM,kCAAuD,oBAAI,IAAI;AAAA,EACnE;AAAA,EACA;AACF,CAAC;AA8BM,SAAS,uBACd,aACyC;AACzC,MAAI,YAAY,UAAU,EAAG,QAAO;AACpC,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,YAAY,OAAO,CAAC,MAAM;AAC/B,QAAI,CAAC,gCAAgC,IAAI,EAAE,IAAI,EAAG,QAAO;AAIzD,UAAM,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO;AACnC,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,oBACP,gBACA,iBACA,aACA,MACA,SACA,mBACA,cAC8B;AAC9B,QAAM,eAAW,oDAAkC;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,eAAe;AAAA,IACzB,YAAY,mBAAmB;AAAA,IAC/B,GAAI,iBAAiB,UAAa,EAAE,aAAa;AAAA,EACnD,CAAC;AACD,QAAM,mBAAmB,UAAU;AACnC,QAAM,oBAAoB;AAAA,IACxB,eAAe;AAAA,IACf;AAAA,EACF;AAEA,MACE,kBAAkB,YAAY,UAC9B,kBAAkB,QAAQ,SAAS,oBACnC;AACA,UAAM,IAAI;AAAA,MACR,iDAAiD,eAAe,KAAK,WAAW;AAAA,IAClF;AAAA,EACF;AACA,MACE,kBAAkB,gBAAgB,UAClC,kBAAkB,YAAY,SAAS,oBACvC;AACA,UAAM,IAAI;AAAA,MACR,qDAAqD,eAAe,KAAK,WAAW;AAAA,IACtF;AAAA,EACF;AACA,MACE,kBAAkB,kBAAkB,UACpC,kBAAkB,QAAQ,cAAc,SAAS,oBACjD;AACA,UAAM,IAAI;AAAA,MACR,uDAAuD,eAAe,KAAK,WAAW;AAAA,IACxF;AAAA,EACF;AACA,MACE,kBAAkB,sBAAsB,UACxC,kBAAkB,YAAY,cAAc,SAAS,oBACrD;AACA,UAAM,IAAI;AAAA,MACR,2DAA2D,eAAe,KAAK,WAAW;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO;AACT;AAeA,IAAM,oCAAmF,oBAAI,IAE3F,CAAC,QAAQ,CAAC;AASZ,SAAS,oCAAoC,YAAgD;AAC3F,MAAI,WAAW,mBAAmB,SAAU,QAAO,WAAW;AAC9D,SAAO;AACT;AAQA,SAAS,kCAAkC,YAAqC;AAC9E,QAAM,QAAQ,oCAAoC,UAAU;AAC5D,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,MAAM,KAAK,EAAE,SAAS;AAC/B;AAsBA,SAAS,gCACP,aACA,qBACA,SACA,mBACkB;AAIlB,QAAM,gBAAgB,IAAI;AAAA,IACxB,oBAAoB,OAAO,iCAAiC,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc;AAAA,EAC3F;AACA,QAAM,SAAS,oBAAI,IAAsC;AACzD,aAAW,QAAQ,mCAAmC;AACpD,QAAI,CAAC,cAAc,IAAI,IAAI,EAAG,QAAO,IAAI,IAAI;AAAA,EAC/C;AACA,MAAI,OAAO,SAAS,EAAG,QAAO,CAAC;AAO/B,QAAM,YAA8B,CAAC;AACrC,QAAM,OAAO,oBAAI,IAAa,CAAC,WAAW,CAAC;AAC3C,QAAM,QAA+B,CAAC;AAEtC,QAAM,sBAAsB,CAAC,QAA8B;AACzD,SAAK,IAAI,QAAW,gBAAY,WAAW,EAAG,QAAO;AACrD,QAAI;AACF,aAAO,QAAQ,iBAAiB,GAAG;AAAA,IACrC,QAAQ;AAIN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,0BAA0B,CAAC,UAA4C;AAO3E,UAAM,OAAO,QAAQ,oBAAoB,MAAM,IAAI;AACnD,SAAK,KAAK,QAAW,cAAU,YAAY,EAAG,QAAO;AACrD,QAAI,KAAK,eAAe,EAAG,QAAO;AAClC,WAAO;AAAA,EACT;AAQA,QAAM,mBAAmB,CAAC,UAA0B,qBAAoC;AACtF,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,QAAO,uBAAmB,QAAQ,KAAQ,2BAAuB,QAAQ,GAAG;AAC1E,WAAK,IAAI,QAAQ;AACjB,YAAM,KAAK,QAAQ;AACnB;AAAA,IACF;AACA,QAAO,2BAAuB,QAAQ,GAAG;AACvC,UAAI,CAAC,oBAAoB,CAAC,wBAAwB,QAAQ,EAAG;AAC7D,WAAK,IAAI,QAAQ;AACjB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,SAAoC;AAC1D,QAAO,2BAAuB,IAAI,GAAG;AAKnC,YAAM,MAAM,KAAK;AACjB,UAAI,CAAI,wBAAoB,GAAG,EAAG;AAClC,YAAM,MAAM,QAAQ,oBAAoB,IAAI,QAAQ;AACpD,UAAI,CAAC,IAAK;AACV,YAAM,SAAS,oBAAoB,GAAG;AACtC,iBAAW,YAAY,OAAO,gBAAgB,CAAC,GAAG;AAChD;AAAA,UAAiB;AAAA;AAAA,UAA+B;AAAA,QAAI;AAAA,MACtD;AACA;AAAA,IACF;AAEA,UAAM,kBAAkB,KAAK;AAC7B,QAAI,CAAC,gBAAiB;AACtB,eAAW,UAAU,iBAAiB;AAKpC,UAAI,OAAO,UAAa,eAAW,eAAgB;AACnD,iBAAW,YAAY,OAAO,OAAO;AACnC,cAAM,MAAM,QAAQ,oBAAoB,SAAS,UAAU;AAC3D,YAAI,CAAC,IAAK;AACV,cAAM,SAAS,oBAAoB,GAAG;AACtC,mBAAW,YAAY,OAAO,gBAAgB,CAAC,GAAG;AAChD;AAAA,YAAiB;AAAA;AAAA,YAA+B;AAAA,UAAK;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,WAAW;AAI1B,WAAS,aAAa,GAAG,aAAa,MAAM,UAAU,OAAO,OAAO,GAAG,cAAc;AACnF,UAAM,WAAW,MAAM,UAAU;AACjC,QAAI,aAAa,OAAW;AAI5B,UAAM,WAAW,SAAS,cAAc,EAAE;AAC1C,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,iBAAiB,iBAAiB;AAAA,IACpC;AACA,eAAW,cAAc,iBAAiB;AACxC,UAAI,CAAC,OAAO,IAAI,WAAW,cAAc,EAAG;AAG5C,UAAI,CAAC,kCAAkC,UAAU,EAAG;AACpD,gBAAU,KAAK,UAAU;AACzB,aAAO,OAAO,WAAW,cAAc;AAAA,IACzC;AAEA,QAAI,OAAO,OAAO,GAAG;AACnB,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AASA,SAAS,4BACP,WACA,SACA,MACA,mBACkB;AAClB,QAAM,QAAQ,4BAA4B,WAAW,MAAM,iBAAiB,iBAAiB,CAAC;AAC9F,QAAM,YAAY,gCAAgC,WAAW,OAAO,SAAS,iBAAiB;AAC9F,MAAI,UAAU,WAAW,EAAG,QAAO,CAAC,GAAG,KAAK;AAC5C,SAAO,CAAC,GAAG,OAAO,GAAG,SAAS;AAChC;AAEO,SAAS,2BACd,aACA,SACA,OAAO,IACP,mBACA,gBACqB;AACrB,QAAM,2BAA2B,6BAA6B,cAAc;AAC5E,QAAM,kBAAkB,QAAQ,kBAAkB,WAAW;AAC7D,QAAM,cAAiB,uBAAmB,WAAW,IAChD,YAAY,MAAM,QAAQ,mBAC3B,YAAY,KAAK;AACrB,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,QAAW,SAAS,iBAAiB,eAAe;AAAA,EAC1F;AACA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,aAAa,UAAU;AAAA,IACvB,aAAa,UAAU;AAAA,EACzB;AACF;AASO,SAAS,iBACd,WACA,SACA,OAAO,IACP,mBACA,gBACA,sBACiB;AACjB,QAAM,2BAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,UAAU,MAAM,QAAQ;AACrC,QAAM,SAAsB,CAAC;AAC7B,QAAM,eAAsC,CAAC;AAC7C,QAAM,eAA+C,CAAC;AACtD,QAAM,cAA8C,CAAC;AACrD,QAAM,YAAY,QAAQ,kBAAkB,SAAS;AACrD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,QAAW,SAAS,WAAW,SAAS;AAAA,EAC9E;AAGA,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAgC,CAAC,GAAG,SAAS,aAAa,GAAG,yBAAyB;AAC5F,cAAY,KAAK,GAAG,SAAS,WAAW;AACxC,QAAM,WAAW,oBAAI,IAAa;AAClC,QAAM,kBAAgC,CAAC;AACvC,QAAM,gBAA8B,CAAC;AAErC,aAAW,UAAU,UAAU,SAAS;AACtC,QAAO,0BAAsB,MAAM,GAAG;AACpC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,WAAW;AACb,eAAO,KAAK,SAAS;AACrB,qBAAa,KAAK,CAAC,CAAC;AAAA,MACtB;AAAA,IACF,WAAc,wBAAoB,MAAM,GAAG;AACzC,YAAM,aAAa,cAAc,QAAQ,OAAO;AAChD,UAAI,YAAY;AACd,cAAM,WAAW,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAY,eAAW,aAAa;AACrF,YAAI,UAAU;AACZ,wBAAc,KAAK,UAAU;AAAA,QAC/B,OAAO;AACL,0BAAgB,KAAK,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,0BAA0B,uBAAuB,WAAW;AAClE,SAAO;AAAA,IACL;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,IAC5C,GAAI,wBAAwB,SAAS,KAAK,EAAE,aAAa,wBAAwB;AAAA,IACjF;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,qBACd,eACA,SACA,OAAO,IACP,mBACA,gBACA,sBACiB;AACjB,QAAM,2BAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,cAAc,KAAK;AAChC,QAAM,SAAsB,CAAC;AAC7B,QAAM,eAA+C,CAAC;AACtD,QAAM,cAA8C,CAAC;AACrD,QAAM,gBAAgB,QAAQ,kBAAkB,aAAa;AAC7D,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,QAAW,SAAS,eAAe,aAAa;AAAA,EACtF;AAIA,QAAM,gCAAgC;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAgC;AAAA,IACpC,GAAG,aAAa;AAAA,IAChB,GAAG;AAAA,EACL;AACA,cAAY,KAAK,GAAG,aAAa,WAAW;AAC5C,QAAM,WAAW,oBAAI,IAAa;AAElC,aAAW,UAAU,cAAc,SAAS;AAC1C,QAAO,wBAAoB,MAAM,GAAG;AAClC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAsC,kBAAkB,IAAI,OAAO,CAAC,EAAE;AAC5E,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,0BAA0B,uBAAuB,WAAW;AAClE,SAAO;AAAA,IACL;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,IAC5C,GAAI,wBAAwB,SAAS,KAAK,EAAE,aAAa,wBAAwB;AAAA,IACjF,iBAAiB,CAAC;AAAA,IAClB,eAAe,CAAC;AAAA,EAClB;AACF;AAKO,SAAS,qBACd,WACA,SACA,OAAO,IACP,mBACA,gBACA,sBAC4B;AAC5B,QAAM,UAAU,8BAA8B,UAAU,IAAI;AAC5D,MAAI,YAAY,MAAM;AACpB,UAAM,aAAa,UAAU,cAAc;AAC3C,UAAM,EAAE,KAAK,IAAI,WAAW,8BAA8B,UAAU,SAAS,CAAC;AAE9E,UAAM,WAAc,eAAW,UAAU,KAAK,IAAI,KAAK;AACvD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,eAAe,UAAU,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC,CAAC,4CAA4C,QAAQ;AAAA,IAC5H;AAAA,EACF;AAEA,QAAM,2BAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAM,yBAAyB,8CAA8C,OAAO;AACpF,MAAI,uBAAuB,SAAS,GAAG;AACrC,UAAM,aAAa,UAAU,cAAc;AAC3C,UAAM,EAAE,KAAK,IAAI,WAAW,8BAA8B,UAAU,SAAS,CAAC;AAC9E,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,eAAe,IAAI,aAAa,OAAO,OAAO,CAAC,CAAC,kEAAkE,uBAAuB,KAAK,IAAI,CAAC;AAAA,IAC5J;AAAA,EACF;AAEA,QAAM,SAAsB,CAAC;AAC7B,QAAM,eAA+C,CAAC;AACtD,QAAM,cAA8C,CAAC;AACrD,QAAM,YAAY,QAAQ,kBAAkB,SAAS;AACrD,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,QAAW,SAAS,WAAW,SAAS;AAAA,EAC9E;AACA,QAAM,cAAc,CAAC,GAAG,aAAa,WAAW;AAChD,cAAY,KAAK,GAAG,aAAa,WAAW;AAC5C,QAAM,WAAW,oBAAI,IAAa;AAElC,aAAW,UAAU,SAAS;AAC5B,QAAO,wBAAoB,MAAM,GAAG;AAClC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,0BAA0B,uBAAuB,WAAW;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,MACR;AAAA,MACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,MACzC,QAAQ;AAAA,MACR,cAAc,kBAAkB,IAAI,OAAO,CAAC,EAAE;AAAA,MAC9C;AAAA,MACA,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,MAC5C,GAAI,wBAAwB,SAAS,KAAK,EAAE,aAAa,wBAAwB;AAAA,MACjF,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,IAClB;AAAA,EACF;AACF;AAiBA,SAAS,uBACP,MACA,SACA,iBACA,mBAA0C,CAAC,GACb;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAA4C;AACxE,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,WAAW,YAAY;AAC1C,QAAM,gBAAmB,4BAAwB,YAAY,KAAK,aAAa,CAAC;AAChF,MAAI,kBAAkB,QAAW;AAC/B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAiC,CAAC;AACxC,aAAW,SAAS,eAAe;AACjC,QAAI,MAAM,SAAY,eAAW,wBAAwB;AACvD;AAAA,IACF;AACA,UAAM,cAAc,WAAW,MAAM,MAAM,KAAK,MAAM,GAAG;AACzD,QAAI,CAAC,YAAY,WAAW,KAAK,GAAG;AAClC;AAAA,IACF;AACA,eAAW,KAAK,OAAG,oCAAkB,aAAa,EAAE,QAAQ,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,EAC/E;AAEA,SAAO;AACT;AAEA,SAAS,6BACP,MACA,SACA,WACsC;AACtC,QAAM,cAAc,QAAQ,kBAAkB,IAAI;AAClD,QAAM,iBAAiB,YAAY,YAAY,SAAS;AACxD,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,cACJ,eAAe,oBACf,eAAe,cAAc;AAAA,IAC3B,CAAC,cAAiB,0BAAsB,SAAS,KAAQ,wBAAoB,SAAS;AAAA,EACxF,KACA,eAAe,eAAe,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,0BAA0B,gBAAgB,eAAe,IAAI;AAAA,IAC3E,UACE,CAAC,EAAE,eAAe,QAAW,gBAAY,aACxC,gBAAgB,UACf,mBAAmB,eACnB,YAAY,kBAAkB;AAAA,EACpC;AACF;AAEA,SAAS,yBACP,MACA,mBACS;AACT,SACE,KAAK,gBAAgB,KAAK,CAAC,kBAAkB,cAAc,KAAK,SAAS,iBAAiB,KAC1F;AAEJ;AAEA,SAAS,sBAAsB,MAAwB;AACrD,MACE,KAAK,SACD,cAAU,OACT,cAAU,YACV,cAAU,OACV,cAAU,UACV,cAAU,MACf;AACA,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,WAAW,sBAAsB,MAAM,CAAC;AACpF;AAEA,SAAS,yBACP,MACA,SACA,OAAO,oBAAI,IAAa,GACf;AACT,MAAI,KAAK,IAAI,IAAI,GAAG;AAClB,WAAO;AAAA,EACT;AACA,OAAK,IAAI,IAAI;AAEb,MAAI,KAAK,QAAW,cAAU,YAAY;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,QAAQ,GAAG;AAClB,WACE,KAAK,MAAM,SAAS,KACpB,KAAK,MAAM,MAAM,CAAC,WAAW,yBAAyB,QAAQ,SAAS,IAAI,CAAC;AAAA,EAEhF;AAEA,QAAM,iBAAiB,QAAQ,wBAAwB,IAAI;AAC3D,MAAI,mBAAmB,UAAa,mBAAmB,MAAM;AAC3D,WAAO,yBAAyB,gBAAgB,SAAS,IAAI;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,UAAyD;AAC9F,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,8BAA8B,SAAS,IAAI;AAAA,EACpD;AAEA,MAAO,sBAAkB,QAAQ,GAAG;AAClC,WAAO,CAAC,GAAG,SAAS,OAAO;AAAA,EAC7B;AAEA,MAAO,2BAAuB,QAAQ,GAAG;AACvC,UAAM,UAA4B,CAAC;AACnC,eAAW,sBAAsB,SAAS,OAAO;AAC/C,YAAM,kBAAkB,8BAA8B,kBAAkB;AACxE,UAAI,oBAAoB,MAAM;AAC5B,eAAO;AAAA,MACT;AACA,cAAQ,KAAK,GAAG,eAAe;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,MACA,MACA,aAC+B;AAC/B,QAAM,oBAAoB,qBAAqB,IAAI,EAAE;AAAA,IACnD,CAAC,QAAQ,IAAI,sBAAsB;AAAA,EACrC;AACA,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,UAAU,GAAG,aAAa,IAAI;AACrC,aAAW,iBAAiB,eAAe;AACzC,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,SAAS;AAC7B,MAAI,aAAa,SAAS,QAAQ,aAAa,UAAU,MAAM;AAC7D,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,KAAK,SAAS,WAAW,GAAG;AAC1C,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,SAAS,aAAa,KAAK;AACrD,MAAI,CAAC,sBAAsB,KAAK,iBAAiB,GAAG;AAClD,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,YAAY,KAAK,SAAS,CAAC,KAAK,YAAY;AAAA,IACvD;AAAA,IACA,YAAY,kBAAkB,MAAM,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,+BACP,MACA,SACA,MACA,aAC+B;AAC/B,QAAM,YAAY,8BAA8B,MAAM,MAAM,WAAW;AACvE,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,yBAAyB,MAAM,UAAU,iBAAiB,GAAG;AAChE,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,oCAAoC,UAAU,iBAAiB;AAAA,QAC/D,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,6BAA6B,MAAM,SAAS,UAAU,SAAS;AAChF,MAAI,aAAa,MAAM;AACrB,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,iCAAiC,UAAU,SAAS;AAAA,QACpD,UAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,UAAU;AACrB,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,wBAAwB,UAAU,SAAS;AAAA,QAC3C,UAAU;AAAA,QACV,SAAS,gBAAgB,SAAY,CAAC,kBAAkB,SAAS,aAAa,IAAI,CAAC,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,SAAS,IAAI,GAAG;AACxC,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,wBAAwB,UAAU,SAAS;AAAA,QAC3C,UAAU;AAAA,QACV,SAAS,gBAAgB,SAAY,CAAC,kBAAkB,SAAS,aAAa,IAAI,CAAC,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,yBAAyB,SAAS,MAAM,OAAO,GAAG;AACrD,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA,wBAAwB,UAAU,SAAS;AAAA,QAC3C,UAAU;AAAA,QACV,SAAS,gBAAgB,SAAY,CAAC,kBAAkB,SAAS,aAAa,IAAI,CAAC,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,wCACP,MACA,aACA,SACA,mBACgB;AAChB,QAAM,qBACJ,KAAK,gBAAgB;AAAA,IACnB,CAAC,kBAAkB,cAAc,KAAK,SAAS;AAAA,EACjD,KAAK;AACP,MAAI,qBAAqB,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,0BACH,gBAAgB,WAAW,IAAI,YAAY,gBAAgB,WAC3D,YAAsE;AACzE,MAAI,yBAAyB,kBAAkB,MAAM,QAAW;AAC9D,WAAO,uBAAuB,kBAAkB,KAAK;AAAA,EACvD;AAEA,QAAM,qBAAqB,KAAK,iBAAiB,kBAAkB;AACnE,SAAO,uBAAuB,SAAY,OAAO,QAAQ,kBAAkB,kBAAkB;AAC/F;AAEA,SAAS,yCACP,WACA,cACA,SACA,YACA,aAC2B;AAC3B,QAAM,iBAAiB,UAAU,YAAY,YAAY;AACzD,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,eAAe,oBAAoB,eAAe,eAAe,CAAC;AACtF,QAAM,aAAa,eAAe,UAAU,OAAO,eAAe,CAAC,KAAK;AACxE,QAAM,qBAAqB,cAAc,qCAAqC,WAAW,OAAO;AAChG,MAAI,uBAAuB,MAAM;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,eAAe,QAAQ,0BAA0B,gBAAgB,kBAAkB;AAEzF,MAAI,aAAa,gBAAgB,GAAG;AAClC,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,aAAa,QAAQ,GAAG;AAC1B,UAAM,iBAAiB,aAAa,MAAM;AAAA,MACxC,CAAC,WAAW,EAAE,OAAO,SAAY,cAAU,OAAU,cAAU;AAAA,IACjE;AACA,QAAI,eAAe,SAAS,KAAK,eAAe,MAAM,CAAC,WAAW,OAAO,gBAAgB,CAAC,GAAG;AAC3F,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sCAAsC,WAAsC;AACnF,SAAO,cAAc,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,QAAQ;AACnE;AAEA,SAAS,4BACP,WACA,SACA,gBACoC;AACpC,QAAM,cAAc,qCAAqC,WAAW,OAAO;AAC3E,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,4BAA4B,WAAW,aAAa,OAAO;AAAA,IAC3D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO,UAAU;AACnB;AAEA,SAAS,gCACP,OACA,sBACQ;AACR,QAAM,SAAS,sBAAsB;AACrC,SAAO,WAAW,UAAa,WAAW,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK;AAC1E;AAEA,SAAS,qCACP,MACA,SACA,OAAO,oBAAI,IAAa,GACD;AACvB,MAAI,KAAK,IAAI,IAAI,GAAG;AAClB,WAAO;AAAA,EACT;AACA,OAAK,IAAI,IAAI;AAEb,QAAM,SAAS,KAAK,eAAe,KAAK,UAAU;AAClD,MAAI,WAAW,QAAW;AACxB,UAAM,UACJ,OAAO,QAAW,gBAAY,QAAQ,QAAQ,iBAAiB,MAAM,IAAI;AAC3E,UAAM,eAAe,WAAW;AAChC,UAAM,cAAc,aAAa,cAAc;AAAA,MAC7C,CAAC,cACI,uBAAmB,SAAS,KAC5B,2BAAuB,SAAS,KAChC,2BAAuB,SAAS,KAChC,sBAAkB,SAAS;AAAA,IAClC;AACA,QAAI,gBAAgB,QAAW;AAC7B,UACK,2BAAuB,WAAW,KAClC,wBAAoB,YAAY,IAAI,KACvC,QAAQ,oBAAoB,YAAY,IAAI,MAAM,MAClD;AACA,eAAO;AAAA,UACL,QAAQ,oBAAoB,YAAY,IAAI;AAAA,UAC5C;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,WACA,WACA,SACA,YACA,aACA,gBACe;AACf,MAAI,cAAc,MAAM;AACtB,gBAAY;AAAA,MACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,gBAAgB,GAAG;AAC/B,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,UAAU,QAAQ,GAAG;AACvB,UAAM,iBAAiB,UAAU,MAAM;AAAA,MACrC,CAAC,WAAW,EAAE,OAAO,SAAY,cAAU,OAAU,cAAU;AAAA,IACjE;AACA,QAAI,eAAe,MAAM,CAAC,WAAW,OAAO,gBAAgB,CAAC,GAAG;AAC9D,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,aAAW,wBAAwB,sCAAsC,SAAS,GAAG;AACnF,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,yBAAyB,MAAM;AACjC,aAAO;AAAA,IACT;AACA,QAAI,yBAAyB,QAAW;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,4BAA4B,WAAW,SAAS,cAAc;AAC9E,MAAI,SAAS,WAAW,YAAY;AAClC,WAAO,gCAAgC,QAAQ,OAAO,eAAe,aAAa;AAAA,EACpF;AACA,MAAI,SAAS,WAAW,YAAY;AAClC,WAAO,gCAAgC,QAAQ,OAAO,eAAe,aAAa;AAAA,EACpF;AAEA,cAAY;AAAA,IACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAA8B;AACxD,MACK,uBAAmB,IAAI,KACvB,2BAAuB,IAAI,KAC3B,2BAAuB,IAAI,KAC3B,sBAAkB,IAAI,GACzB;AACA,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAAmC;AACnE,UACG,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,WAC7C,KAA+D,sBAChE,CAAC;AAEL;AAEA,SAAS,4BACP,MACA,aACA,SACQ;AACR,QAAM,WAAW,mBAAmB,WAAW;AAC/C,QAAM,gBAAgB,yBAAyB,IAAI;AACnD,SAAO,cAAc,WAAW,IAC5B,WACA,+BAA+B,UAAU,eAAe,OAAO;AACrE;AAEA,SAAS,sCACP,QACA,MACA,aACA,SACA,MACA,aACA,gBACa;AACb,QAAM,YAAY,+BAA+B,MAAM,SAAS,MAAM,WAAW;AACjF,MAAI,cAAc,MAAM;AACtB,WAAO,CAAC,GAAG,MAAM;AAAA,EACnB;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACA,MAAI,uBAAuB,MAAM;AAC/B,WAAO,CAAC,GAAG,MAAM;AAAA,EACnB;AAEA,SAAO,OAAO;AAAA,IAAI,CAAC,UACjB,MAAM,SAAS,UAAU,YACrB;AAAA,MACE,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,OAAO,mBAAmB,CAAC;AAAA,MACzC;AAAA,IACF,IACA;AAAA,EACN;AACF;AAEA,SAAS,+BACP,UACA,eACA,SACQ;AACR,QAAM,oBAAoB,cACvB;AAAA,IAAI,CAAC,iBACJ,QACG,aAAa,YAAY,EACzB,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,YAAY,EAAE;AAAA,EAC3B,EACC,OAAO,CAAC,UAAU,UAAU,EAAE;AAEjC,SAAO,kBAAkB,WAAW,IAAI,WAAW,GAAG,QAAQ,KAAK,kBAAkB,KAAK,IAAI,CAAC;AACjG;AAEA,SAAS,8BACP,MACA,SACA,MACA,cACA,UACA,YACA,gBACA,mBACA,aACsE;AACtE,QAAM,iBACJ,eAAe,SAAY,SAAY,0BAA0B,UAAU;AAC7E,MAAI,mBAAmB,QAAW;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,oBAAoB,CAAC,aACtB,4BAAwB,QAAQ,IAAI,kBAAkB,SAAS,IAAI,IAAI;AAE5E,QAAM,iBAAiB,kBAAkB,cAAc;AACvD,QAAM,oBAAuB,wBAAoB,cAAc,IAC3D,kBACC,MAAM;AACL,UAAM,mBAAmB,uBAAuB,gBAAgB,OAAO;AACvE,WAAU,wBAAoB,gBAAgB,IAAI,mBAAmB;AAAA,EACvE,GAAG;AACP,MAAI,mBAAmB,kBAAkB,QAAW;AAClD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,kBAAkB,cAAc,IAAI,CAAC,iBAAiB;AAC3D,UAAM,eAAe,QAAQ,oBAAoB,YAAY;AAU7D,UAAM,aAAa,aAAa,eAAe,aAAa,UAAU;AACtE,UAAM,iBACJ,eAAe,UAAa,WAAW,QAAW,gBAAY,QAC1D,QAAQ,iBAAiB,UAAU,IACnC;AACN,UAAM,eAAe,gBAAgB,eAAe,CAAC;AACrD,QAAI,iBAAiB,UAAa,aAAa,cAAc,EAAE,aAAa,MAAM;AAChF,YAAM,eAAe,gBAAgB,QAAQ,KAAK,YAAY,QAAQ;AACtE,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,YACN,eAAe,CAAC;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qCACP,YACA,MACA,aACA,SACA,MACA,aACA,gBAC2B;AAC3B,QAAM,YAAY,+BAA+B,MAAM,SAAS,MAAM,WAAW;AACjF,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACA,MAAI,uBAAuB,MAAM;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AAAA,IAAI,CAAC,aACrB,SAAS,SAAS,UAAU,YACxB;AAAA,MACE,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,OAAO,mBAAmB,CAAC;AAAA,MACzC;AAAA,IACF,IACA;AAAA,EACN;AACF;AASA,SAAS,iBACP,MACA,SACA,MACA,cACA,UACA,aACA,UACA,gBACA,mBACkB;AAClB,MAAI,CAAI,iBAAa,KAAK,IAAI,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,KAAK,KAAK;AACvB,QAAM,SAAS,QAAQ,kBAAkB,IAAI;AAC7C,QAAM,WAAW,KAAK,kBAAkB;AACxC,QAAM,aAAa,kBAAkB,MAAM,IAAI;AAG/C,MAAI,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,cAAgC,CAAC;AAGvC,MAAI,KAAK,QAAQ,CAAC,mCAAmC,KAAK,MAAM,OAAO,GAAG;AACxE,gBAAY;AAAA,MACV,GAAG,gCAAgC,KAAK,MAAM,SAAS,MAAM,iBAAiB;AAAA,IAChF;AAAA,EACF;AAGA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,MAAM,SAAS,QAAQ,QAAQ;AAAA,EACrE;AACA,cAAY,KAAK,GAAG,UAAU,WAAW;AACzC,cAAY,KAAK,GAAG,UAAU,WAAW;AAGzC,MAAI,cAAgC,CAAC;AAGrC,cAAY,KAAK,GAAG,UAAU,WAAW;AAGzC,QAAM,oBAAoB,8BAA8B,KAAK,aAAa,IAAI;AAC9E,MAAI,qBAAqB,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,mBAAmB,cAAc,GAAG;AACtF,gBAAY,KAAK,iBAAiB;AAAA,EACpC;AAEA,GAAC,EAAE,MAAM,YAAY,IAAI,4BAA4B,MAAM,WAAW;AACtE,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC;AAAA,IACA,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,6BACP,MACA,SACA,MACA,cACA,UACA,aACA,UACA,gBACA,mBACkB;AAClB,QAAM,OAAO,oCAAoC,KAAK,IAAI;AAC1D,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,QAAQ,kBAAkB,IAAI;AAC7C,QAAM,WAAW,KAAK,kBAAkB;AACxC,QAAM,aAAa,kBAAkB,MAAM,IAAI;AAG/C,MAAI,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,cAAgC,CAAC;AAGvC,MAAI,KAAK,QAAQ,CAAC,mCAAmC,KAAK,MAAM,OAAO,GAAG;AACxE,gBAAY;AAAA,MACV,GAAG,gCAAgC,KAAK,MAAM,SAAS,MAAM,iBAAiB;AAAA,IAChF;AAAA,EACF;AAGA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,MAAM,SAAS,QAAQ,QAAQ;AAAA,EACrE;AACA,cAAY,KAAK,GAAG,UAAU,WAAW;AACzC,cAAY,KAAK,GAAG,UAAU,WAAW;AAGzC,MAAI,cAAgC,CAAC;AAGrC,cAAY,KAAK,GAAG,UAAU,WAAW;AAEzC,GAAC,EAAE,MAAM,YAAY,IAAI,4BAA4B,MAAM,WAAW;AACtE,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC;AAAA,IACA,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,8CACP,SACU;AACV,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAAa,oBAAI,IAAY;AAEnC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAI,wBAAoB,MAAM,GAAG;AACnC;AAAA,IACF;AAEA,UAAM,OAAO,oCAAoC,OAAO,IAAI;AAC5D,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,IAAI,IAAI,GAAG;AAClB,iBAAW,IAAI,IAAI;AACnB;AAAA,IACF;AAEA,SAAK,IAAI,IAAI;AAAA,EACf;AAEA,SAAO,CAAC,GAAG,UAAU,EAAE,KAAK;AAC9B;AAEO,SAAS,oCAAoC,MAAsC;AACxF,MAAO,iBAAa,IAAI,KAAQ,oBAAgB,IAAI,KAAQ,qBAAiB,IAAI,GAAG;AAClF,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;AASA,SAAS,4BACP,MACA,aACmD;AACnD,MACE,CAAC,YAAY;AAAA,IACX,CAAC,eACC,WAAW,mBAAmB,iBAAiB,WAAW,MAAM,KAAK,EAAE,WAAW,GAAG;AAAA,EACzF,GACA;AACA,WAAO,EAAE,MAAM,aAAa,CAAC,GAAG,WAAW,EAAE;AAAA,EAC/C;AAEA,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,wBAAwB,MAAM,aAAa,QAAQ;AAEpE,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,EAAE,MAAM,aAAa,CAAC,GAAG,WAAW,EAAE;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,YAAY,OAAO,CAAC,eAAe,CAAC,SAAS,IAAI,UAAU,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,wBACP,MACA,aACA,UACU;AACV,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,kCAAkC,MAAM,aAAa,QAAQ;AAAA,IAEtE,KAAK,SAAS;AACZ,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,KAAK,QAAQ;AAAA,UAAI,CAAC,WACzB,wBAAwB,QAAQ,aAAa,QAAQ;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,kCACP,MACA,aACA,UACc;AACd,QAAM,eAAe,oBAAI,IAAoB;AAE7C,aAAW,cAAc,aAAa;AACpC,QAAI,WAAW,mBAAmB,cAAe;AAEjD,UAAM,SAAS,2BAA2B,WAAW,KAAK;AAC1D,QAAI,CAAC,OAAQ;AAIb,aAAS,IAAI,UAAU;AAEvB,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,OAAO,KAAK;AACxE,QAAI,CAAC,OAAQ;AAEb,iBAAa,IAAI,OAAO,OAAO,KAAK,GAAG,OAAO,KAAK;AAAA,EACrD;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW;AACpC,YAAM,cAAc,aAAa,IAAI,OAAO,OAAO,KAAK,CAAC;AACzD,aAAO,gBAAgB,SAAY,EAAE,GAAG,QAAQ,YAAY,IAAI;AAAA,IAClE,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BAA2B,OAAwD;AAC1F,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,QAAQ,0BAA0B,KAAK,OAAO;AACpD,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AAErC,QAAM,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC5B,MAAI,UAAU,GAAI,QAAO;AAEzB,SAAO,EAAE,OAAO,MAAM,CAAC,GAAG,MAAM;AAClC;AASO,SAAS,gBACd,MACA,SACA,MACA,cACA,UACA,YACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACU;AAIV,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,uBAAuB,gBAAgB;AAAA,MAC/C,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAGA,UAAI,wCAAsB,IAAI,GAAG;AAC/B,WAAO,EAAE,MAAM,aAAa,eAAe,UAAU;AAAA,EACvD;AAGA,MAAI,KAAK,QAAW,cAAU,QAAQ;AACpC,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,QAAW,cAAU,QAAQ;AACpC,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,SAAY,cAAU,SAAY,cAAU,gBAAgB;AACnE,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,QAAW,cAAU,SAAS;AACrC,WAAO,EAAE,MAAM,aAAa,eAAe,UAAU;AAAA,EACvD;AACA,MAAI,KAAK,QAAW,cAAU,MAAM;AAClC,WAAO,EAAE,MAAM,aAAa,eAAe,OAAO;AAAA,EACpD;AACA,MAAI,KAAK,QAAW,cAAU,WAAW;AAEvC,WAAO,EAAE,MAAM,aAAa,eAAe,OAAO;AAAA,EACpD;AACA,MAAI,KAAK,QAAW,cAAU,MAAM;AAGlC,WAAO,EAAE,MAAM,aAAa,eAAe,OAAO;AAAA,EACpD;AAGA,MAAI,KAAK,gBAAgB,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AAGA,MAAI,KAAK,gBAAgB,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AAGA,MAAI,KAAK,QAAQ,GAAG;AAClB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,YAAY,IAAI,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,IAAI,GAAG;AAC5B,UAAM,iBACJ,eAAe,SAAY,SAAY,0BAA0B,UAAU;AAC7E,UAAM,yBACJ,mBAAmB,SAAY,SAAY,uBAAuB,gBAAgB,OAAO;AAC3F,QACE,2BAA2B,UAC3B,8BAA8B,sBAAsB,MAAM,MAC1D;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QACE,2BAA2B,UAC3B,oCAAoC,sBAAsB,KAC1D,kCAAkC,MAAM,OAAO,GAC/C;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,IAAI,GAAG;AACtB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AASA,SAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AACtD;AAEA,SAAS,8BACP,MACA,SACA,MACA,cACA,UACA,YACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACiB;AACjB,MACE,EACE,KAAK,SACD,cAAU,SACT,cAAU,SACV,cAAU,SACV,cAAU,gBACV,cAAU,UACV,cAAU,UAEjB,KAAC,wCAAsB,IAAI,GAC3B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YACJ,KAAK,aAAa,cAAc,KAAQ,0BAAsB,KAC9D,kCAAkC,YAAY,OAAO;AACvD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,KAAK;AACjC,MAAI,CAAC,aAAa,SAAS,GAAG;AAC5B,UAAM,YAAY,QAAQ,oBAAoB,UAAU,IAAI;AAC5D,UAAM,cAAc;AAAA,MAClB,GAAG,4BAA4B,WAAW,MAAM,iBAAiB,iBAAiB,CAAC;AAAA,MACnF,GAAG,gCAAgC,UAAU,MAAM,SAAS,MAAM,iBAAiB;AAAA,IACrF;AAIA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA,iBAAiB,iBAAiB;AAAA,IACpC;AACA,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,cAAc,CAAC,GAAG,kBAAkB,GAAG,oBAAoB;AACjE,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,IACF;AACA,iBAAa,SAAS,IAAI;AAAA,MACxB,MAAM;AAAA,MACN,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,MACzC,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,MAC5C,GAAI,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,MAC5C,YAAY,yBAAyB,WAAW,IAAI;AAAA,IACtD;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,aAAa,MAAM,WAAW,eAAe,CAAC,EAAE;AACjE;AAEA,SAAS,kCACP,YACA,SACqC;AACrC,QAAM,WACJ,eACI,0BAAsB,UAAU,KAC/B,wBAAoB,UAAU,KAC9B,gBAAY,UAAU,KACvB,WAAW,OACX;AACN,MAAI,CAAC,YAAY,CAAI,wBAAoB,QAAQ,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,SAAO,yCAAyC,UAAU,OAAO;AACnE;AAkBA,SAAS,mCACP,MACA,YACA,SAIO;AACP,QAAM,WAAW,iBAAiB,IAAI;AACtC,QAAM,YAAY,wBAAwB,IAAI;AAE9C,MAAI,aAAa,QAAQ,cAAc,QAAW;AAChD,WAAO,EAAE,UAAU,UAAU;AAAA,EAC/B;AAEA,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,kCAAkC,YAAY,OAAO;AAC1E,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,UAAU,aAAa,KAAK,MAAM,WAAW,aAAa;AACrE;AAEA,SAAS,mCACP,UACA,SACS;AACT,MAAI,CAAI,wBAAoB,QAAQ,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,yCAAyC,UAAU,OAAO;AAC5E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,oBAAoB,UAAU,IAAI;AAC3D,SAAO,CAAC,EACN,SAAS,SACL,cAAU,SACT,cAAU,SACV,cAAU,SACV,cAAU,gBACV,cAAU,UACV,cAAU;AAEnB;AAEA,SAAS,8BACP,MACA,SACA,MACA,cACA,UACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACA,iBAA+C,oBAAI,IAA6B,GACtE;AACV,QAAM,kBAAkB,KAAK,aAAa,cAAc,KAAQ,0BAAsB;AACtF,MAAI,oBAAoB,UAAa,CAAC,eAAe,IAAI,eAAe,GAAG;AACzE,mBAAe,IAAI,eAAe;AAClC,WAAO;AAAA,MACL,QAAQ,oBAAoB,gBAAgB,IAAI;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,UAAI,wCAAsB,IAAI,GAAG;AAC/B,WAAO,EAAE,MAAM,aAAa,eAAe,UAAU;AAAA,EACvD;AACA,MAAI,KAAK,QAAW,cAAU,QAAQ;AACpC,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,QAAW,cAAU,QAAQ;AACpC,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,SAAY,cAAU,SAAY,cAAU,gBAAgB;AACnE,WAAO,EAAE,MAAM,aAAa,eAAe,SAAS;AAAA,EACtD;AACA,MAAI,KAAK,QAAW,cAAU,SAAS;AACrC,WAAO,EAAE,MAAM,aAAa,eAAe,UAAU;AAAA,EACvD;AACA,MAAI,KAAK,QAAW,cAAU,MAAM;AAClC,WAAO,EAAE,MAAM,aAAa,eAAe,OAAO;AAAA,EACpD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBACP,MACA,SACA,MACA,cACA,UACA,YACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACU;AAaV,QAAM,YAAY,mCAAmC,MAAM,YAAY,OAAO;AAC9E,MAAI,WAA0B;AAC9B,MAAI;AAKJ,MAAI,cAAc,MAAM;AACtB,UAAM,qBAAwB,2BAAuB,UAAU,SAAS,IACpE,UAAU,YACV;AACJ,QAAI,uBAAuB,QAAW;AACpC,YAAM,sBAAsB,QAAQ,oBAAoB,mBAAmB,IAAI;AAM/E,YAAM,eACJ,mBAAmB,mBAAmB,UACtC,mBAAmB,eAAe,WAAW;AAC/C,UAAI,iBAAiB,oBAAoB,QAAQ,KAAK,aAAa,mBAAmB,IAAI;AACxF,mBAAW,UAAU;AACrB,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF,OAAO;AAGL,iBAAW,UAAU;AACrB,kBAAY,UAAU;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,cAAc;AACxC,WAAO,EAAE,MAAM,aAAa,MAAM,UAAU,eAAe,CAAC,EAAE;AAAA,EAChE;AAEA,QAAM,WAAW,KAAK;AACtB,QAAM,uBAAuB,4BAA4B,YAAY,OAAO;AAC5E,QAAM,qBAAqB,qBAAqB;AAAA,IAC9C,CAAC,mBAAmB,CAAC,kBAAkB,uBAAuB,gBAAgB,OAAO,CAAC;AAAA,EACxF;AACA,QAAM,eAAe,SAAS;AAAA,IAC5B,CAAC,eAAe,EAAE,WAAW,SAAY,cAAU,OAAU,cAAU;AAAA,EACzE;AACA,QAAM,iBAAiB,aAAa,IAAI,CAAC,YAAY,WAAW;AAAA,IAC9D;AAAA,IACA,YACE,mBAAmB,WAAW,aAAa,SAAS,mBAAmB,KAAK,IAAI;AAAA,EACpF,EAAE;AACF,QAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,QAAW,cAAU,IAAI;AAChE,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI,WAAW;AACb,eAAW,CAAC,OAAO,KAAK,KAAK,2BAA2B,SAAS,EAAE,oBAAoB;AACrF,yBAAmB,IAAI,OAAO,KAAK;AAAA,IACrC;AAAA,EACF;AACA,MAAI,YAAY;AACd,eAAW,CAAC,OAAO,KAAK,KAAK,2BAA2B,UAAU,EAAE,oBAAoB;AACtF,yBAAmB,IAAI,OAAO,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,WAA+B;AACpD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAKA,UAAM,WAAW,aAAa,QAAQ;AACtC,QAAI,aAAa,UAAa,SAAS,SAAS,4BAA4B;AAC1E,aAAO,EAAE,MAAM,aAAa,MAAM,UAAU,eAAe,CAAC,EAAE;AAAA,IAChE;AACA,UAAM,cAAc,YAChB,4BAA4B,WAAW,SAAS,MAAM,iBAAiB,IACvE;AACJ,UAAM,WACJ,cAAc,SACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,IACF,IACA;AACN,iBAAa,QAAQ,IAAI;AAAA,MACvB,MAAM;AAAA,MACN,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,MACzC,MAAM;AAAA,MACN,GAAI,gBAAgB,UAAa,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,MACzE,YAAY,yBAAyB,aAAa,YAAY,IAAI;AAAA,IACpE;AACA,WAAO,EAAE,MAAM,aAAa,MAAM,UAAU,eAAe,CAAC,EAAE;AAAA,EAChE;AAEA,QAAM,oBAAoB,CAACC,aACzBA,SAAQ,IAAI,CAAC,UAAU;AACrB,UAAM,cAAc,mBAAmB,IAAI,OAAO,KAAK,CAAC;AACxD,WAAO,gBAAgB,SAAY,EAAE,OAAO,YAAY,IAAI,EAAE,MAAM;AAAA,EACtE,CAAC;AAEH,QAAMC,kBACJ,aAAa,WAAW,KAAK,aAAa,MAAM,CAAC,MAAM,EAAE,QAAW,cAAU,cAAc;AAE9F,MAAIA,iBAAgB;AAClB,UAAM,WAAqB,EAAE,MAAM,aAAa,eAAe,UAAU;AACzE,UAAM,SAAmB,UACrB;AAAA,MACE,MAAM;AAAA,MACN,SAAS,CAAC,UAAU,EAAE,MAAM,aAAa,eAAe,OAAO,CAAC;AAAA,IAClE,IACA;AACJ,WAAO,cAAc,MAAM;AAAA,EAC7B;AAEA,QAAM,oBAAoB,aAAa,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACvE,MAAI,qBAAqB,aAAa,SAAS,GAAG;AAChD,UAAM,cAAc,aAAa,OAAO,CAAC,MAAiC,EAAE,gBAAgB,CAAC;AAC7F,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,kBAAkB,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IAC5D;AACA,UAAM,SAAmB,UACrB;AAAA,MACE,MAAM;AAAA,MACN,SAAS,CAAC,UAAU,EAAE,MAAM,aAAa,eAAe,OAAO,CAAC;AAAA,IAClE,IACA;AACJ,WAAO,cAAc,MAAM;AAAA,EAC7B;AAEA,QAAM,oBAAoB,aAAa,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACvE,MAAI,qBAAqB,aAAa,SAAS,GAAG;AAChD,UAAM,cAAc,aAAa,OAAO,CAAC,MAAiC,EAAE,gBAAgB,CAAC;AAC7F,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,kBAAkB,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IAC5D;AACA,UAAM,SAAmB,UACrB;AAAA,MACE,MAAM;AAAA,MACN,SAAS,CAAC,UAAU,EAAE,MAAM,aAAa,eAAe,OAAO,CAAC;AAAA,IAClE,IACA;AACJ,WAAO,cAAc,MAAM;AAAA,EAC7B;AAEA,MAAI,eAAe,WAAW,KAAK,eAAe,CAAC,GAAG;AACpD,UAAM,QAAQ;AAAA,MACZ,eAAe,CAAC,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,CAAC,EAAE,cAAc;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAmB,UACrB;AAAA,MACE,MAAM;AAAA,MACN,SAAS,CAAC,OAAO,EAAE,MAAM,aAAa,eAAe,OAAO,CAAC;AAAA,IAC/D,IACA;AACJ,WAAO,cAAc,MAAM;AAAA,EAC7B;AAEA,QAAM,UAAU,eAAe;AAAA,IAAI,CAAC,EAAE,YAAY,YAAY,iBAAiB,MAC7E;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS;AACX,YAAQ,KAAK,EAAE,MAAM,aAAa,eAAe,OAAO,CAAC;AAAA,EAC3D;AACA,SAAO,cAAc,EAAE,MAAM,SAAS,QAAQ,CAAC;AACjD;AAEA,SAAS,iBACP,MACA,SACA,MACA,cACA,UACA,YACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACU;AACV,QAAM,WAAW,gBAAgB,IAAI,IAAI,KAAK,gBAAgB;AAC9D,QAAM,cAAc,WAAW,CAAC;AAChC,QAAM,oBAAoB,4BAA4B,YAAY,OAAO;AAEzE,QAAM,QAAQ,cACV;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACC,EAAE,MAAM,aAAa,eAAe,SAAS;AAElD,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;AASA,SAAS,qBACP,MACA,SACA,MACA,cACA,UACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACuB;AAEvB,MAAI,KAAK,cAAc,EAAE,SAAS,GAAG;AACnC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,QAAQ,mBAAmB,MAAS,cAAU,MAAM;AACtE,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAAA,IAChB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,MAAM,UAAU,UAAU;AACrC;AAEA,SAAS,0BAA0B,MAAgB,YAA6B;AAC9E,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK,SAAS;AAAA,IACvB,KAAK;AACH,aAAO,0BAA0B,KAAK,OAAO,UAAU;AAAA,IACzD,KAAK;AACH,aAAO,0BAA0B,KAAK,WAAW,UAAU;AAAA,IAC7D,KAAK;AACH,aAAO,KAAK,QAAQ,KAAK,CAAC,WAAW,0BAA0B,QAAQ,UAAU,CAAC;AAAA,IACpF,KAAK;AACH,aAAO,KAAK,WAAW;AAAA,QAAK,CAAC,aAC3B,0BAA0B,SAAS,MAAM,UAAU;AAAA,MACrD;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAUA,SAAS,iCACP,UACA,aACS;AACT,MAAI,SAAS,KAAK,WAAW,IAAI,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,UAAa,UAAU,eAAe,YAAY,SAAS,QAAW;AACxF,UAAM,OAAO,YAAY;AACzB,QAAO,2BAAuB,IAAI,KAAQ,wBAAoB,IAAI,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,QAAI,CAAI,iBAAa,IAAI,KAAK,CAAI,oBAAgB,IAAI,KAAK,CAAI,qBAAiB,IAAI,GAAG;AACrF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAkBA,SAAS,sCACP,YACA,SACA,mBACA,kBACuE;AACvE,QAAM,YAAY,kCAAkC,YAAY,OAAO;AACvE,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,YAAY,UAAU,KAAK;AAEjC,MAAI,cAAc,iBAAkB,QAAO;AAI3C,MAAI,CAAI,wBAAoB,UAAU,IAAI,EAAG,QAAO;AAMpD,MAAI,CAAC,6BAA6B,WAAW,SAAS,iBAAiB,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,WAAW,UAAU;AAChC;AASA,SAAS,6BACP,WACA,SACA,mBACS;AACT,QAAM,OAAO,UAAU,cAAc,EAAE;AACvC,QAAM,QAAQ,4BAA4B,WAAW,MAAM,iBAAiB,iBAAiB,CAAC;AAC9F,aAAW,cAAc,OAAO;AAC9B,QAAI,CAAC,kCAAkC,IAAI,WAAW,cAAc,EAAG;AACvE,QAAI,CAAC,kCAAkC,UAAU,EAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,gCAAgC,WAAW,OAAO,SAAS,iBAAiB;AAC9F,aAAW,cAAc,WAAW;AAClC,QAAI,kCAAkC,IAAI,WAAW,cAAc,EAAG,QAAO;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,kBACP,MACA,SACA,MACA,cACA,UACA,YACA,iBAAyC,6BAA6B,MAAS,GAC/E,mBACA,aACU;AACV,QAAM,uBAAuB,eAAe,CAAC;AAC7C,QAAM,WAAW,iBAAiB,IAAI;AACtC,QAAM,gBAAgB,YAAY;AAClC,QAAM,YAAY,wBAAwB,IAAI;AAY9C,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,oBAAoB,kBAAkB,aAAa;AACzD,QAAM,qBAAqB,kBAAkB,aAAa;AAC1D,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,uBACJ,sBAAsB,UAAa,uBAAuB,SAAS,IAC/D;AAAA,IACE;AAAA,IACA,uBAAuB,IAAI,CAAC,aAAa,SAAS,MAAM;AAAA,IACxD;AAAA,EACF,IACA;AACN,QAAM,mBAAmB,wBAAwB;AACjD,QAAM,0BACJ,qBAAqB,UACrB,EAAE,qBAAqB,YAAY,oBAAoB,cAAc,EAAE,aAAa;AACtF,QAAM,6BAA6B,MAAY;AAC7C,QAAI,qBAAqB,UAAa,CAAC,yBAAyB;AAC9D;AAAA,IACF;AACA,YAAQ,eAAe,cAAc,gBAAgB;AAAA,EACvD;AAEA,MAAI,SAAS,IAAI,IAAI,GAAG;AAGtB,QAAI,qBAAqB,UAAa,yBAAyB;AAC7D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe,uBAAuB,IAAI,CAAC,aAAa,SAAS,QAAQ;AAAA,MAC3E;AAAA,IACF;AACA,WAAO,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,sBAAsB,MAAM;AAAA,EACvE;AAIA,MACE,qBAAqB,UACrB,2BACA,CAAC,aAAa,gBAAgB,GAC9B;AACA,iBAAa,gBAAgB,IAAI;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY,yBAAyB,oBAAoB,IAAI;AAAA,IAC/D;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AAGjB,MACE,qBAAqB,UACrB,2BACA,aAAa,gBAAgB,GAAG,SAAS,QACzC;AACA,QAAI,aAAa,gBAAgB,EAAE,SAAS,4BAA4B;AACtE,eAAS,OAAO,IAAI;AACpB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe,uBAAuB,IAAI,CAAC,aAAa,SAAS,QAAQ;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAKA,QAAM,aAAa,aAAa,IAAI,IAChC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AACJ,MAAI,YAAY;AACd,aAAS,OAAO,IAAI;AACpB,QAAI,qBAAqB,UAAa,yBAAyB;AAC7D,YAAM,oBAAoB,0BAA0B,WAAW,WAAW,gBAAgB;AAC1F,UAAI,CAAC,mBAAmB;AACtB,mCAA2B;AAC3B,eAAO;AAAA,MACT;AACA,YAAM,cAAc,qBAChB,4BAA4B,oBAAoB,SAAS,MAAM,iBAAiB,IAChF;AACJ,YAAM,WACJ,uBAAuB,SACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,QACf;AAAA,MACF,IACA;AACN,mBAAa,gBAAgB,IAAI;AAAA,QAC/B,MAAM;AAAA,QACN,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,QACzC,MAAM;AAAA,QACN,GAAI,gBAAgB,UAAa,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,QACzE,YAAY,yBAAyB,oBAAoB,IAAI;AAAA,MAC/D;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe,uBAAuB,IAAI,CAAC,aAAa,SAAS,QAAQ;AAAA,MAC3E;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAA+B,CAAC;AAGtC,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,KAAK,cAAc,GAAG;AACvC,UAAM,cAAc,KAAK,oBAAoB,KAAK,eAAe,CAAC;AAClE,QAAI,CAAC,YAAa;AAClB,QAAI,CAAC,iCAAiC,MAAM,WAAW,EAAG;AAE1D,UAAM,WAAW,QAAQ,0BAA0B,MAAM,WAAW;AACpE,UAAM,WAAW,CAAC,EAAE,KAAK,QAAW,gBAAY;AAChD,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,gBAAgB,cAAc,IAAI,KAAK,IAAI;AACjD,UAAM,sBACJ,kBAAkB,SACX,wBAAoB,WAAW,IAChC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACG,0BAAsB,WAAW,IAClC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA,OACJ;AACN,UAAM,wBAAwB,iBAAiB;AAC/C,UAAM,uBAAuB,qBAAqB,QAAQ;AAE1D,eAAW,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,GAAI,uBAAuB,aAAa,UAAa;AAAA,QACnD,UAAU,sBAAsB;AAAA,MAClC;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,aAAa,uBAAuB,eAAe,CAAC;AAAA,MACpD,aAAa,uBAAuB,eAAe,CAAC;AAAA,MACpD,YAAY,uBAAuB,cAAc,kBAAkB,IAAI;AAAA,IACzE,CAAC;AAAA,EACH;AAEA,WAAS,OAAO,IAAI;AAEpB,QAAM,aAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,YACE,uBAAuB,WACnB,uBAAmB,kBAAkB,KACpC,2BAAuB,kBAAkB,KACzC,2BAAuB,kBAAkB,KAC1C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA;AAAA,IACN,sBAAsB;AAAA,EACxB;AAGA,MAAI,qBAAqB,UAAa,yBAAyB;AAC7D,UAAM,cAAc,qBAChB,4BAA4B,oBAAoB,SAAS,MAAM,iBAAiB,IAChF;AACJ,UAAM,WACJ,uBAAuB,SACnB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,IACF,IACA;AACN,iBAAa,gBAAgB,IAAI;AAAA,MAC/B,MAAM;AAAA,MACN,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,MACzC,MAAM;AAAA,MACN,GAAI,gBAAgB,UAAa,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,MACzE,YAAY,yBAAyB,oBAAoB,IAAI;AAAA,IAC/D;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,eAAe,uBAAuB,IAAI,CAAC,aAAa,SAAS,QAAQ;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AACT;AAiBA,SAAS,6BACP,MACA,SACA,MACA,cACA,UACA,gBACA,aACA,mBACmC;AACnC,QAAM,UAAU,CAAC,KAAK,UAAU,GAAG,KAAK,WAAW,EAAE;AAAA,IACnD,CAAC,MAAsB,GAAG,gBAAgB,QAAQ,EAAE,aAAa,SAAS;AAAA,EAC5E;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,eAAe,OAAO;AAC5B,QAAI,CAAC,aAAc;AAGnB,UAAM,YAAY,aAAa,KAAQ,sBAAkB;AACzD,QAAI,WAAW;AACb,YAAM,MAAM,oBAAI,IAA2B;AAC3C,YAAM,WAAW,QAAQ,kBAAkB,SAAS;AACpD,iBAAW,UAAU,UAAU,SAAS;AACtC,YAAO,0BAAsB,MAAM,KAAQ,iBAAa,OAAO,IAAI,GAAG;AACpE,gBAAM,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,WAAW;AACb,gBAAI,IAAI,UAAU,MAAM;AAAA,cACtB,GAAI,UAAU,aAAa,UAAa,EAAE,UAAU,UAAU,SAAS;AAAA,cACvE,aAAa,CAAC,GAAG,UAAU,WAAW;AAAA,cACtC,aAAa,CAAC,GAAG,UAAU,WAAW;AAAA,cACtC,YAAY,UAAU;AAAA,YACxB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAGA,UAAM,gBAAgB,aAAa,KAAQ,0BAAsB;AACjE,QAAI,eAAe;AACjB,aAAO;AAAA,QACL,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,kBAAkB,aAAa;AAAA,QACvC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,aAAa,KAAQ,0BAAsB;AACjE,UAAM,mBACJ,kBAAkB,SAAY,OAAO,8BAA8B,cAAc,IAAI;AACvF,QAAI,iBAAiB,qBAAqB,MAAM;AAC9C,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,kBAAkB,aAAa;AAAA,QACvC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,YACA,SACyB;AACzB,QAAM,WAAW,eAAe,SAAY,SAAY,0BAA0B,UAAU;AAC5F,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,uBAAuB,UAAU,OAAO;AACjE,MAAO,oBAAgB,gBAAgB,GAAG;AACxC,WAAO,iBAAiB;AAAA,EAC1B;AACA,MACK,wBAAoB,gBAAgB,KACpC,iBAAa,iBAAiB,QAAQ,KACzC,iBAAiB,SAAS,SAAS,WACnC,iBAAiB,gBAAgB,CAAC,GAClC;AACA,WAAO,iBAAiB,cAAc,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,4BACP,YACA,SACwB;AACxB,QAAM,WAAW,eAAe,SAAY,SAAY,0BAA0B,UAAU;AAC5F,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,QAAM,mBAAmB,uBAAuB,UAAU,OAAO;AACjE,SAAU,oBAAgB,gBAAgB,IAAI,CAAC,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAC/E;AAEA,SAAS,uBACP,UACA,SACA,UAAwC,oBAAI,IAA6B,GAC5D;AACb,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,uBAAuB,SAAS,MAAM,SAAS,OAAO;AAAA,EAC/D;AAEA,MAAI,CAAI,wBAAoB,QAAQ,KAAK,CAAI,iBAAa,SAAS,QAAQ,GAAG;AAC5E,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,yCAAyC,UAAU,OAAO;AAC5E,MAAI,cAAc,UAAa,QAAQ,IAAI,SAAS,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,SAAS;AACrB,SAAO,uBAAuB,UAAU,MAAM,SAAS,OAAO;AAChE;AAEA,SAAS,kBAAkB,UAAgC;AACzD,MACE,SAAS,SAAY,eAAW,eAChC,SAAS,SAAY,eAAW,kBAChC;AACA,WAAO;AAAA,EACT;AAEA,SACK,sBAAkB,QAAQ,MAC5B,SAAS,QAAQ,SAAY,eAAW,eACvC,SAAS,QAAQ,SAAY,eAAW;AAE9C;AAEA,SAAS,sBACP,SACA,SACA,MACA,cACA,UACA,gBACA,UACA,aACA,mBAC4B;AAC5B,QAAM,MAAM,oBAAI,IAA2B;AAC3C,aAAW,UAAU,SAAS;AAC5B,QAAO,wBAAoB,MAAM,GAAG;AAClC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,WAAW;AACb,YAAI,IAAI,UAAU,MAAM;AAAA,UACtB,GAAI,UAAU,aAAa,UAAa,EAAE,UAAU,UAAU,SAAS;AAAA,UACvE,aAAa,CAAC,GAAG,UAAU,WAAW;AAAA,UACtC,aAAa,CAAC,GAAG,UAAU,WAAW;AAAA,UACtC,YAAY,UAAU;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAOA,IAAM,wBAAwB;AAY9B,SAAS,gCACP,UACA,SACA,MACA,mBACA,QAAQ,GACU;AAClB,MAAI,CAAI,wBAAoB,QAAQ,EAAG,QAAO,CAAC;AAE/C,MAAI,SAAS,uBAAuB;AAClC,UAAM,YAAY,SAAS,SAAS,QAAQ;AAC5C,UAAM,IAAI;AAAA,MACR,6CAA6C,OAAO,qBAAqB,CAAC,cAC3D,SAAS,QAAQ,IAAI;AAAA,IAEtC;AAAA,EACF;AAEA,QAAM,YAAY,yCAAyC,UAAU,OAAO;AAC5E,MAAI,CAAC,UAAW,QAAO,CAAC;AAGxB,MAAO,sBAAkB,UAAU,IAAI,EAAG,QAAO,CAAC;AAElD,QAAM,iBAAiB;AAAA,IACrB,QAAQ,kBAAkB,UAAU,IAAI;AAAA,IACxC;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,oBAAI,IAAa;AAAA,IACjB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA,iBAAiB,mBAAmB,cAAc;AAAA,EACpD;AAKA,cAAY;AAAA,IACV,GAAG,gCAAgC,UAAU,MAAM,SAAS,MAAM,mBAAmB,QAAQ,CAAC;AAAA,EAChG;AAEA,SAAO;AACT;AAMA,SAAS,kBAAkB,MAAe,MAA0B;AAClE,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW,8BAA8B,KAAK,SAAS,CAAC;AACpF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,MAAM,OAAO;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,MAA0B;AACnD,SAAO,EAAE,SAAS,SAAS,MAAM,MAAM,GAAG,QAAQ,EAAE;AACtD;AAEA,SAAS,yBAAyB,MAA2B,MAA0B;AACrF,MAAI,CAAC,MAAM;AACT,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACA,SAAO,kBAAkB,MAAM,IAAI;AACrC;AAUA,SAAS,iBAAiB,MAA8B;AACtD,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ,cAAc;AACxB,UAAM,OAAO,OAAO,aAAa,CAAC;AAClC,QACE,SACI,uBAAmB,IAAI,KACtB,2BAAuB,IAAI,KAC3B,2BAAuB,IAAI,IAChC;AACA,YAAM,OAAU,uBAAmB,IAAI,IAAI,KAAK,MAAM,OAAO,KAAK,KAAK;AACvE,UAAI,KAAM,QAAO;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,KAAK;AACzB,MAAI,aAAa,cAAc;AAC7B,UAAM,YAAY,YAAY,aAAa,KAAQ,0BAAsB;AACzE,QAAI,WAAW;AACb,aAAO,UAAU,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,wBACP,MACqF;AACrF,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ,cAAc;AACxB,UAAM,OAAO,OAAO,aAAa,CAAC;AAClC,QACE,SACI,uBAAmB,IAAI,KACtB,2BAAuB,IAAI,KAC3B,2BAAuB,IAAI,IAChC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,KAAK;AACzB,MAAI,aAAa,cAAc;AAC7B,WAAO,YAAY,aAAa,KAAQ,0BAAsB;AAAA,EAChE;AAEA,SAAO;AACT;AA4CA,SAAS,cAAc,QAA8B,SAA4C;AAC/F,MAAI,CAAI,iBAAa,OAAO,IAAI,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,aAA8B,CAAC;AAErC,aAAW,SAAS,OAAO,YAAY;AACrC,QAAO,iBAAa,MAAM,IAAI,GAAG;AAC/B,YAAM,YAAY,iBAAiB,OAAO,OAAO;AACjD,iBAAW,KAAK,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,iBAAiB,OAAO;AAC9B,QAAM,YAAY,QAAQ,4BAA4B,MAAM;AAC5D,QAAM,aAAa,YACf,QAAQ,yBAAyB,SAAS,IAC1C,QAAQ,kBAAkB,MAAM;AAEpC,SAAO,EAAE,MAAM,YAAY,gBAAgB,WAAW;AACxD;AAEA,SAAS,iBAAiB,OAAgC,SAAwC;AAChG,QAAM,OAAU,iBAAa,MAAM,IAAI,IAAI,MAAM,KAAK,OAAO;AAC7D,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,QAAQ,kBAAkB,KAAK;AAC5C,QAAM,qBAAqB,wBAAwB,QAAQ;AAC3D,QAAM,WAAW,MAAM,kBAAkB,UAAa,MAAM,gBAAgB;AAE5E,SAAO,EAAE,MAAM,UAAU,MAAM,oBAAoB,SAAS;AAC9D;AAEA,SAAS,wBAAwB,UAAkD;AACjF,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,CAAI,wBAAoB,QAAQ,EAAG,QAAO;AAE9C,QAAM,WAAc,iBAAa,SAAS,QAAQ,IAC9C,SAAS,SAAS,OACf,oBAAgB,SAAS,QAAQ,IAClC,SAAS,SAAS,MAAM,OACxB;AAEN,MAAI,aAAa,iBAAiB,aAAa,kBAAmB,QAAO;AAEzE,QAAM,UAAU,SAAS,gBAAgB,CAAC;AAC1C,MAAI,CAAC,WAAW,CAAI,oBAAgB,OAAO,EAAG,QAAO;AAErD,MAAO,iBAAa,QAAQ,QAAQ,GAAG;AACrC,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,MAAO,oBAAgB,QAAQ,QAAQ,GAAG;AACxC,WAAO,QAAQ,SAAS,MAAM;AAAA,EAChC;AAEA,SAAO;AACT;;;ADz/GO,SAAS,gCACd,SACA,UACgB;AAChB,QAAM,eAAoB,aAAQ,QAAQ;AAC1C,QAAM,aAAa,QAAQ,cAAc,YAAY,KAAK,QAAQ,cAAc,QAAQ;AAExF,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,mDAAmD,YAAY,EAAE;AAAA,EACnF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ,eAAe;AAAA,IAChC;AAAA,EACF;AACF;AAcO,SAAS,qBACd,UACA,iBACgB;AAChB,QAAM,eAAoB,aAAQ,QAAQ;AAC1C,QAAM,UAAe,aAAQ,YAAY;AAGzC,QAAM,aAAgB,mBAAe,SAAY,QAAI,WAAW,KAAQ,OAAG,GAAG,eAAe;AAE7F,MAAI;AACJ,MAAI;AAEJ,MAAI,YAAY;AACd,UAAM,aAAgB,mBAAe,YAAe,QAAI,SAAS,KAAQ,OAAG,CAAC;AAC7E,QAAI,WAAW,OAAO;AACpB,YAAM,IAAI;AAAA,QACR,gCAAmC,iCAA6B,WAAW,MAAM,aAAa,IAAI,CAAC;AAAA,MACrG;AAAA,IACF;AAEA,UAAM,SAAY;AAAA,MAChB,WAAW;AAAA,MACR;AAAA,MACE,aAAQ,UAAU;AAAA,IACzB;AAEA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAM,gBAAgB,OAAO,OAC1B,IAAI,CAAC,MAAS,iCAA6B,EAAE,aAAa,IAAI,CAAC,EAC/D,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,gCAAgC,aAAa,EAAE;AAAA,IACjE;AAEA,sBAAkB,OAAO;AAGzB,UAAM,wBAAwB,mBAAmB,CAAC,GAAG,IAAI,CAAC,MAAW,aAAQ,CAAC,CAAC;AAC/E,gBAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,WAAW,cAAc,GAAG,oBAAoB,CAAC,CAAC;AAAA,EACvF,OAAO;AAEL,sBAAkB;AAAA,MAChB,QAAW,iBAAa;AAAA,MACxB,QAAW,eAAW;AAAA,MACtB,kBAAqB,yBAAqB;AAAA,MAC1C,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AACA,UAAM,wBAAwB,mBAAmB,CAAC,GAAG,IAAI,CAAC,MAAW,aAAQ,CAAC,CAAC;AAC/E,gBAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,UAAa,kBAAc,WAAW,eAAe;AAC3D,QAAM,aAAa,QAAQ,cAAc,YAAY;AAErD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ,eAAe;AAAA,IAChC;AAAA,EACF;AACF;AAMA,SAAS,eACP,YACA,MACA,WACA,SACU;AACV,MAAI,SAAmB;AAEvB,WAAS,MAAM,MAAqB;AAClC,QAAI,OAAQ;AAEZ,QAAI,UAAU,IAAI,KAAK,QAAQ,IAAI,MAAM,MAAM;AAC7C,eAAS;AACT;AAAA,IACF;AAEA,IAAG,iBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU;AAChB,SAAO;AACT;AASO,SAAS,gBACd,YACA,WAC4B;AAC5B,SAAO,eAAe,YAAY,WAAc,wBAAoB,CAAC,MAAM,EAAE,MAAM,IAAI;AACzF;AASO,SAAS,oBACd,YACA,eACgC;AAChC,SAAO,eAAe,YAAY,eAAkB,4BAAwB,CAAC,MAAM,EAAE,KAAK,IAAI;AAChG;AASO,SAAS,oBACd,YACA,WACgC;AAChC,SAAO,eAAe,YAAY,WAAc,4BAAwB,CAAC,MAAM,EAAE,KAAK,IAAI;AAC5F;AAEA,SAAS,0BACP,UACA,cAC8C;AAC9C,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,aAAa,SAAS,IAAI;AAC7C,SAAO,YAAY,KAAK,SAAS,WAAW,WAAW,OAAO;AAChE;AAEA,SAAS,kCACP,MACA,UACA,cACA,UACA,aACwB;AACxB,QAAM,mBAAmB,0BAA0B,UAAU,YAAY;AACzE,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAsB,iBAAiB,WAAW,IAAI,CAAC,cAAc;AAAA,IACzE,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,GAAI,SAAS,aAAa,UAAa,EAAE,UAAU,SAAS,SAAS;AAAA,IACrE,MAAM,SAAS;AAAA,IACf,UAAU,CAAC,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,aAAa,SAAS;AAAA,IACtB,YAAY,SAAS;AAAA,EACvB,EAAE;AAEF,SAAO;AAAA,IACL;AAAA,IACA,GAAI,SAAS,aAAa,UAAa,EAAE,UAAU,SAAS,SAAS;AAAA,IACrE;AAAA,IACA,cAAc,OAAO,IAAI,OAAO,CAAC,EAAE;AAAA,IACnC;AAAA,IACA,GAAI,SAAS,YAAY,SAAS,KAAK,EAAE,aAAa,CAAC,GAAG,SAAS,WAAW,EAAE;AAAA,IAChF,GAAI,YAAY,SAAS,KAAK,EAAE,aAAa,CAAC,GAAG,WAAW,EAAE;AAAA,IAC9D,iBAAiB,CAAC;AAAA,IAClB,eAAe,CAAC;AAAA,EAClB;AACF;AAEA,SAAS,uCAAuC,UAAgC;AAC9E,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,uCAAuC,SAAS,IAAI;AAAA,EAC7D;AAEA,MAAO,wBAAoB,QAAQ,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SACK,2BAAuB,QAAQ,KAClC,SAAS,MAAM,KAAK,CAAC,WAAW,uCAAuC,MAAM,CAAC;AAElF;AAEA,SAAS,wCACP,UACA,SAC0B;AAC1B,MAAO,4BAAwB,QAAQ,GAAG;AACxC,WAAO,wCAAwC,SAAS,MAAM,OAAO;AAAA,EACvE;AAEA,MAAO,sBAAkB,QAAQ,GAAG;AAClC,UAAM,gBAA0B,CAAC;AACjC,eAAW,UAAU,SAAS,SAAS;AACrC,UAAI,CAAI,wBAAoB,MAAM,GAAG;AACnC;AAAA,MACF;AAEA,YAAM,eAAe,oCAAoC,OAAO,IAAI;AACpE,UAAI,iBAAiB,MAAM;AACzB,sBAAc,KAAK,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAO,wBAAoB,QAAQ,GAAG;AACpC,WAAO,QACJ,oBAAoB,QAAQ,EAC5B,cAAc,EACd,IAAI,CAAC,aAAa,SAAS,QAAQ,CAAC;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAAS,wCACP,UACA,SACmB;AACnB,MAAI,CAAI,2BAAuB,QAAQ,GAAG;AACxC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAAa,oBAAI,IAAY;AAEnC,aAAW,UAAU,SAAS,OAAO;AACnC,UAAM,gBAAgB,wCAAwC,QAAQ,OAAO;AAC7E,QAAI,kBAAkB,MAAM;AAC1B;AAAA,IACF;AAEA,eAAW,gBAAgB,eAAe;AACxC,UAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,mBAAW,IAAI,YAAY;AAAA,MAC7B,OAAO;AACL,aAAK,IAAI,YAAY;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,UAAU,EAAE,KAAK;AAC9B;AAcO,SAAS,qBACd,UACA,UACA,mBACA,gBACA,sBACiB;AACjB,QAAM,MAAM,qBAAqB,QAAQ;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,+CACd,KACA,UACA,UACA,mBACA,gBACA,sBACoC;AACpC,QAAM,mBAAwB,aAAQ,QAAQ;AAE9C,QAAM,YAAY,gBAAgB,IAAI,YAAY,QAAQ;AAC1D,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,QACR;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,oBAAoB,IAAI,YAAY,QAAQ;AAClE,MAAI,kBAAkB,MAAM;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,QACR;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,oBAAoB,IAAI,YAAY,QAAQ;AAC9D,MAAI,cAAc,MAAM;AACtB,UAAM,SAAS;AAAA,MACb;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,OAAO,IAAI;AACb,aAAO,EAAE,IAAI,MAAM,UAAU,OAAO,SAAS;AAAA,IAC/C;AAEA,UAAM,mBACJ,OAAO,SAAS,qBAChB,oCAAoC,UAAU,IAAI,KAClD,uCAAuC,UAAU,IAAI;AACvD,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,aAAa;AAAA,UACX;AAAA,YACE,OAAO,SAAS,yBACZ,8BACA;AAAA,YACJ,OAAO;AAAA,YACP,mBAAmB,WAAW,gBAAgB;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,yBAAyB;AAAA,MAC7B,UAAU;AAAA,MACV,IAAI;AAAA,IACN;AACA,QAAI,uBAAuB,SAAS,GAAG;AACrC,YAAM,aAAa,UAAU,cAAc;AAC3C,YAAM,EAAE,KAAK,IAAI,WAAW,8BAA8B,UAAU,SAAS,CAAC;AAC9E,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,aAAa;AAAA,UACX;AAAA,YACE;AAAA,YACA,eAAe,UAAU,KAAK,IAAI,aAAa,OAAO,OAAO,CAAC,CAAC,kEAAkE,uBAAuB,KAAK,IAAI,CAAC;AAAA,YAClK,mBAAmB,WAAW,gBAAgB;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,cAA8C,CAAC,GAAG,SAAS,WAAW;AAC5E,UAAM,eAA+C,CAAC;AACtD,UAAM,WAAW;AAAA,MACf,IAAI,QAAQ,kBAAkB,SAAS;AAAA,MACvC,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,oBAAI,IAAa;AAAA,MACjB;AAAA,MACA,6BAA6B,gBAAgB,oBAAoB;AAAA,MACjE;AAAA,MACA;AAAA,IACF;AACA,UAAM,mBAAmB;AAAA,MACvB,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,qBAAqB,MAAM;AAC7B,aAAO,EAAE,IAAI,MAAM,UAAU,iBAAiB;AAAA,IAChD;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa;AAAA,QACX;AAAA,UACE;AAAA,UACA,OAAO;AAAA,UACP,mBAAmB,WAAW,gBAAgB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,aAAa;AAAA,MACX;AAAA,QACE;AAAA,QACA,SAAS,QAAQ,uDAAuD,gBAAgB;AAAA,QACxF,mBAAmB,gBAAgB;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,uCACd,KACA,UACA,UACA,mBACA,gBACA,sBACiB;AACjB,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,OAAO,IAAI;AACb,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,IAAI,MAAM,OAAO,YAAY,IAAI,CAAC,eAAe,WAAW,OAAO,EAAE,KAAK,IAAI,CAAC;AACvF;AAEA,SAAS,sBACP,MACA,SACA,iBAC8B;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,kBAAkB,CAAC;AAAA,EACrB;AACF;AAEA,SAAS,mBAAmB,MAAe,UAA8B;AACvE,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,WAAW,WAAW,8BAA8B,KAAK,SAAS,CAAC;AACzE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM,SAAS,OAAO;AAAA,IACtB,QAAQ,SAAS;AAAA,IACjB,QAAQ,KAAK,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,mBAAmB,UAA8B;AACxD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;;;AOhkBA,IAAAC,MAAoB;AACpB,IAAAC,QAAsB;AAyBf,SAAS,yBACd,YACA,SACA,SACA,mBAC2C;AAC3C,QAAM,YAAY,oBAAI,IAA0C;AAEhE,QAAM,iBAAsB,cAAQ,UAAU;AAC9C,QAAM,aAAa,QAAQ,cAAc,cAAc;AACvD,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAGA,WAAS,MAAM,MAAqB;AAClC,QAAO,qBAAiB,IAAI,KAAK,uBAAuB,MAAM,OAAO,GAAG;AACtE,kCAA4B,IAAI;AAAA,IAClC;AACA,IAAG,iBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,WAAS,4BAA4B,MAA+B;AAGlE,UAAM,cAAc,KAAK,gBAAgB,CAAC;AAC1C,QAAI,gBAAgB,QAAW;AAC7B;AAAA,IACF;AACA,UAAM,eAAe,QAAQ,oBAAoB,WAAW;AAG5D,UAAM,YAAY,uBAAuB,cAAc,OAAO;AAC9D,QAAI,cAAc,QAAW;AAE3B;AAAA,IACF;AAIA,UAAM,WAAW,2BAA2B,IAAI;AAChD,QAAI,aAAa,MAAM;AACrB;AAAA,IACF;AAKA,QAAI;AACJ,UAAM,cAAc,4BAA4B,MAAM,OAAO;AAC7D,QAAI,gBAAgB,MAAM;AAExB,YAAM,MAAM,kBAAkB,SAAS,GAAG,WAAW,IAAI,QAAQ,EAAE;AACnE,UAAI,QAAQ,QAAW;AACrB,gBAAQ,EAAE,aAAa,cAAc,IAAI;AAAA,MAC3C;AAAA,IACF;AAEA,cAAU,2BAA2B,mBAAmB,QAAQ;AAChE,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,cAAU,IAAI,WAAW,KAAK;AAAA,EAChC;AAEA,QAAM,UAAU;AAChB,SAAO;AACT;AAoBA,SAAS,uBAAuB,MAAyB,SAAkC;AACzF,MAAI,KAAK,kBAAkB,UAAa,KAAK,cAAc,WAAW,EAAG,QAAO;AAEhF,QAAM,aAAa,QAAQ,oBAAoB,KAAK,UAAU;AAC9D,MAAI,eAAe,QAAW;AAE5B,UAAM,WACJ,WAAW,QAAW,gBAAY,QAAQ,QAAQ,iBAAiB,UAAU,IAAI;AAEnF,UAAM,OAAO,SAAS,eAAe,CAAC;AACtC,QAAI,SAAS,QAAW;AAEtB,YAAM,aAAa,KAAK,cAAc,EAAE,SAAS,QAAQ,OAAO,GAAG;AACnE,aACE,SAAS,SAAS;AAAA,OAEjB,WAAW,SAAS,gBAAgB,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAEnF;AAAA,EACF;AAMA,SAAU,iBAAa,KAAK,UAAU,KAAK,KAAK,WAAW,SAAS;AACtE;AASA,SAAS,2BAA2B,MAAwC;AAC1E,QAAM,MAAM,KAAK,UAAU,CAAC;AAC5B,MAAI,QAAQ,UAAa,CAAI,8BAA0B,GAAG,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,IAAI,WAAW;AAAA,IAClC,CAAC,MACI,yBAAqB,CAAC,KAAQ,iBAAa,EAAE,IAAI,KAAK,EAAE,KAAK,SAAS;AAAA,EAC7E;AAEA,MAAI,iBAAiB,UAAa,CAAI,oBAAgB,aAAa,WAAW,GAAG;AAC/E,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,YAAY;AAClC;AAUA,SAAS,4BACP,MACA,SACe;AAIf,WAAS,OAAO,KAAK,QAAQ,CAAI,iBAAa,IAAI,GAAG,OAAO,KAAK,QAAQ;AACvE,QAAO,qBAAiB,IAAI,KAAK,sBAAsB,MAAM,OAAO,GAAG;AACrE,aAAO,8BAA8B,IAAI;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,sBAAsB,MAAyB,SAAkC;AACxF,QAAM,aAAa,QAAQ,oBAAoB,KAAK,UAAU;AAC9D,MAAI,eAAe,QAAW;AAC5B,UAAM,WACJ,WAAW,QAAW,gBAAY,QAAQ,QAAQ,iBAAiB,UAAU,IAAI;AACnF,UAAM,OAAO,SAAS,eAAe,CAAC;AACtC,QAAI,SAAS,QAAW;AACtB,YAAM,aAAa,KAAK,cAAc,EAAE,SAAS,QAAQ,OAAO,GAAG;AACnE,aACE,SAAS,SAAS,sBACjB,WAAW,SAAS,gBAAgB,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAEnF;AAAA,EACF;AAEA,SAAU,iBAAa,KAAK,UAAU,KAAK,KAAK,WAAW,SAAS;AACtE;AAQA,SAAS,8BAA8B,MAAwC;AAC7E,QAAM,MAAM,KAAK,UAAU,CAAC;AAC5B,MAAI,QAAQ,UAAa,CAAI,8BAA0B,GAAG,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,IAAI,WAAW;AAAA,IAC1B,CAAC,MACI,yBAAqB,CAAC,KACtB,iBAAa,EAAE,IAAI,KACtB,EAAE,KAAK,SAAS;AAAA,EACpB;AAEA,MAAI,SAAS,UAAa,CAAI,oBAAgB,KAAK,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,YAAY;AAC1B;AAQA,SAAS,2BACP,UACA,UACuC;AACvC,aAAW,OAAO,SAAS,YAAY;AACrC,QAAI,IAAI,UAAU,QAAW;AAC3B;AAAA,IACF;AACA,eAAW,QAAQ,IAAI,OAAO;AAC5B,UAAI,KAAK,aAAa,UAAU;AAC9B,eAAO,EAAE,aAAa,IAAI,aAAa,cAAc,KAAK;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACtQA,IAAAC,mBAAsE;AAkFtE,SAAS,kBAAkB,KAAwB,OAAwB;AACzE,QAAM,eAAW;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI,sBAAsB,SACtB,SACA;AAAA,MACE,mBAAmB,IAAI;AAAA,IACzB;AAAA,EACN;AACA,MAAI,YAAY,KAAK,GAAG,SAAS,WAAW;AAE5C,MAAI,MAAM,KAAK,SAAS,UAAU;AAChC,eAAW,YAAY,MAAM,KAAK,YAAY;AAC5C,6BAAuB,KAAK,MAAM,MAAM,QAAQ;AAAA,IAClD;AAAA,EACF;AACF;AAEA,SAAS,uBACP,KACA,YACA,UACM;AACN,QAAM,gBAAgB,GAAG,UAAU,IAAI,SAAS,IAAI;AACpD,QAAM,eAAW;AAAA,IACf;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI,sBAAsB,SACtB,SACA;AAAA,MACE,mBAAmB,IAAI;AAAA,IACzB;AAAA,EACN;AACA,MAAI,YAAY,KAAK,GAAG,SAAS,WAAW;AAE5C,MAAI,SAAS,KAAK,SAAS,UAAU;AACnC,eAAW,kBAAkB,SAAS,KAAK,YAAY;AACrD,6BAAuB,KAAK,eAAe,cAAc;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAwB,SAA8B;AAC7E,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,wBAAkB,KAAK,OAAO;AAC9B;AAAA,IACF,KAAK;AACH,iBAAW,SAAS,QAAQ,UAAU;AACpC,wBAAgB,KAAK,KAAK;AAAA,MAC5B;AACA;AAAA,IACF,KAAK;AACH,iBAAW,SAAS,QAAQ,UAAU;AACpC,wBAAgB,KAAK,KAAK;AAAA,MAC5B;AACA;AAAA,IACF,SAAS;AACP,YAAM,aAAoB;AAC1B,YAAM,IAAI,MAAM,2BAA2B,OAAO,UAAU,CAAC,EAAE;AAAA,IACjE;AAAA,EACF;AACF;AAOO,SAAS,WAAW,IAAY,SAA+C;AACpF,QAAM,MAAyB;AAAA,IAC7B,aAAa,CAAC;AAAA,IACd,mBAAmB,SAAS;AAAA,IAC5B,cAAc,GAAG;AAAA,EACnB;AAEA,aAAW,WAAW,GAAG,UAAU;AACjC,oBAAgB,KAAK,OAAO;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,aAAa,IAAI;AAAA,IACjB,OAAO,IAAI,YAAY,MAAM,CAAC,eAAe,WAAW,aAAa,OAAO;AAAA,EAC9E;AACF;;;ATvDO,SAAS,qBACd,UACA,QACA,SACc;AACd,QAAM,SAAS,6BAA6B,UAAU,QAAQ,OAAO;AACrE,MAAI,CAAC,OAAO,MAAM,OAAO,eAAe,UAAa,OAAO,aAAa,QAAW;AAClF,UAAM,IAAI,MAAM,sBAAsB,OAAO,WAAW,CAAC;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,EACnB;AACF;AAQO,SAAS,6BACd,UACA,QACA,SAC4B;AAC5B,QAAM,sBAAsB,SAAS,eAAe,CAAC;AACrD,QAAM,mBAAmB,oBAAoB;AAAA,IAC3C,CAAC,eAAe,WAAW,aAAa;AAAA,EAC1C;AACA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI;AAAA,EACrE;AACA,QAAM,mBAAmB,WAAW,IAAI;AAAA,IACtC,GAAI,SAAS,sBAAsB,UAAa;AAAA,MAC9C,mBAAmB,QAAQ;AAAA,IAC7B;AAAA,IACA,GAAI,SAAS,iBAAiB,UAAa,EAAE,cAAc,QAAQ,aAAa;AAAA,EAClF,CAAC;AACD,MAAI,CAAC,iBAAiB,OAAO;AAC3B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa,CAAC,GAAG,qBAAqB,GAAG,iBAAiB,WAAW;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,aAAa,CAAC,GAAG,qBAAqB,GAAG,iBAAiB,WAAW;AAAA,IACrE,YAAY,yBAAyB,IAAI,OAAO;AAAA,IAChD,UAAU,uBAAuB,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,sBAAsB,aAAsD;AACnF,QAAM,QAAQ,YAAY,IAAI,CAAC,eAAe;AAC5C,UAAM,UAAU,eAAe,WAAW,eAAe;AACzD,UAAM,UACJ,WAAW,iBAAiB,SAAS,IACjC,cAAc,WAAW,iBAAiB,IAAI,cAAc,EAAE,KAAK,IAAI,CAAC,MACxE;AACN,WAAO,GAAG,WAAW,IAAI,KAAK,WAAW,OAAO,KAAK,OAAO,IAAI,OAAO;AAAA,EACzE,CAAC;AAED,SAAO;AAAA,EAAgC,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AACpF;AAEA,SAAS,eAAe,UAA2D;AACjF,SAAO,GAAG,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,IAAI,OAAO,SAAS,MAAM,CAAC;AAC7E;AAuHO,SAAS,yBACd,SACyB;AACzB,QAAM,kBAAkB,QAAQ,eAAe,SAAY,CAAC,QAAQ,UAAU,IAAI;AAClF,QAAM,MAAM,qBAAqB,QAAQ,UAAU,eAAe;AAClE,QAAM,YAAY,gBAAgB,IAAI,YAAY,QAAQ,SAAS;AAEnE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,UAAU,QAAQ,SAAS,kBAAkB,QAAQ,QAAQ,EAAE;AAAA,EACjF;AAEA,QAAM,WAAW;AAAA,IACf;AAAA,IACA,IAAI;AAAA,IACJ,QAAQ;AAAA;AAAA,IAER,QAAQ;AAAA;AAAA,IAER,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,MAAM,QAAQ,SAAS;AAAA,IACzB;AAAA;AAAA,MAEE,mBAAmB,QAAQ;AAAA;AAAA,MAE3B,UAAU,QAAQ;AAAA;AAAA,MAElB,mBAAmB,QAAQ;AAAA;AAAA,MAE3B,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AACF;AAyFO,SAAS,gBACd,SACsD;AACtD,QAAM,SAAS,gCAAgC,OAAO;AACtD,MAAI,QAAQ,mBAAmB,eAAe;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,MAAM,OAAO,eAAe,UAAa,OAAO,aAAa,QAAW;AAClF,UAAM,IAAI,MAAM,sBAAsB,OAAO,WAAW,CAAC;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,EACnB;AACF;AAqDO,SAAS,2BACd,SACsD;AACtD,QAAM,SAAS,2CAA2C,OAAO;AACjE,MAAI,QAAQ,mBAAmB,eAAe;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,MAAM,OAAO,eAAe,UAAa,OAAO,aAAa,QAAW;AAClF,UAAM,IAAI,MAAM,sBAAsB,OAAO,WAAW,CAAC;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,EACnB;AACF;AASO,SAAS,wBACd,SAI4B;AAC5B,SAAO,gBAAgB;AAAA,IACrB,GAAG;AAAA,IACH,gBAAgB;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,gCACP,SAC4B;AAC5B,MAAI;AACJ,MAAI;AAGF,UAAM,kBAAkB,QAAQ,eAAe,SAAY,CAAC,QAAQ,UAAU,IAAI;AAClF,UAAM,qBAAqB,QAAQ,UAAU,eAAe;AAAA,EAC9D,SAAS,OAAO;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa,CAAC,sCAAsC,QAAQ,UAAU,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAUO,SAAS,mCACd,SAK4B;AAC5B,SAAO,2BAA2B;AAAA,IAChC,GAAG;AAAA,IACH,gBAAgB;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,2CACP,SAC4B;AAC5B,MAAI;AACJ,MAAI;AACF,UAAM,gCAAgC,QAAQ,SAAS,QAAQ,QAAQ;AAAA,EACzE,SAAS,OAAO;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa,CAAC,sCAAsC,QAAQ,UAAU,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAQO,SAAS,qBACd,SACiD;AACjD,QAAM,eAAe,oBAAI,IAA4B;AAKrD,QAAM,WAAW,eAAe,OAAO;AACvC,MAAI;AAEJ,SAAO,QAAQ,QAAQ,IAAI,CAAC,WAAW;AACrC,QAAI;AACJ,QAAI;AACF,YAAM,WAAc,QAAI,4BACpB,OAAO,WACP,OAAO,SAAS,YAAY;AAChC,YAAM,gBAAgB,aAAa,IAAI,QAAQ;AAC/C,UAAI,kBAAkB,QAAW;AAC/B,cAAM,kBAAkB,QAAQ,eAAe,SAAY,CAAC,QAAQ,UAAU,IAAI;AAClF,cAAM,qBAAqB,OAAO,UAAU,eAAe;AAC3D,qBAAa,IAAI,UAAU,GAAG;AAAA,MAChC,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,aAAO,WAAW,QAAQ;AAAA,QACxB,IAAI;AAAA,QACJ,aAAa,CAAC,sCAAsC,OAAO,UAAU,KAAK,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AAKA,QACE,QAAQ,eAAe,UACvB,SAAS,sBAAsB,UAC/B,kBAAkB,SAAS,iBAAiB,KAC5C,IAAI,YAAY,kBAChB;AACA,YAAM,YAAY;AAAA,QAChB,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,MACX;AACA,eAAS,kBAAkB,aAAa,SAAS;AACjD,yBAAmB,IAAI;AAAA,IACzB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAQO,SAAS,gCACd,SACiD;AACjD,SAAO,QAAQ,QAAQ,IAAI,CAAC,WAAW;AACrC,QAAI;AACJ,QAAI;AACF,YAAM,gCAAgC,QAAQ,SAAS,OAAO,QAAQ;AAAA,IACxE,SAAS,OAAO;AACd,aAAO,WAAW,QAAQ;AAAA,QACxB,IAAI;AAAA,QACJ,aAAa,CAAC,sCAAsC,OAAO,UAAU,KAAK,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA,0CAA0C,KAAK,OAAO,UAAU,OAAO,UAAU,OAAO;AAAA,IAC1F;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,KAAyD;AAClF,SACE,kBAAkB,OAAO,OAAQ,IAAiC,iBAAiB;AAEvF;AAYO,SAAS,qBAAqB,SAKnC;AAEA,QAAM,iBAAiB,QAAQ;AAO/B,QAAM,iBACJ,mBAAmB,UACnB,QAAQ,QAAQ,eAAe,UAC/B,QAAQ,OAAO,WAAW,SAAS,IAC/B,wBAAwB,QAAQ,OAAO,UAAU,IACjD;AAEN,SAAO;AAAA,IACL,mBAAmB,kBAAkB;AAAA;AAAA,IAErC,cAAc,QAAQ,gBAAgB,QAAQ,QAAQ;AAAA;AAAA,IAEtD,mBAAmB,QAAQ,qBAAqB,QAAQ,QAAQ;AAAA;AAAA,IAEhE,UAAU,QAAQ,YAAY,QAAQ,QAAQ;AAAA,EAChD;AACF;AAEA,SAAS,eAAe,SAKtB;AAIA,QAAM,iBACJ,QAAQ,QAAQ,eAAe,UAAa,QAAQ,OAAO,WAAW,SAAS,IAC3E,wBAAwB,QAAQ,OAAO,UAAU,IACjD;AAGN,QAAM,iBAAiB,QAAQ;AAE/B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAML,mBAAoB,kBAA2D;AAAA;AAAA,IAE/E,cAAc,QAAQ,gBAAgB,QAAQ,QAAQ;AAAA;AAAA,IAEtD,mBAAmB,QAAQ,qBAAqB,QAAQ,QAAQ;AAAA;AAAA,IAEhE,UAAU,QAAQ,YAAY,QAAQ,QAAQ;AAAA,EAChD;AACF;AAEA,SAAS,0CACP,KACA,UACA,UACA,SAC4B;AAC5B,QAAM,WAAW,eAAe,OAAO;AAKvC,MACE,QAAQ,eAAe,UACvB,SAAS,sBAAsB,UAC/B,kBAAkB,SAAS,iBAAiB,GAC5C;AACA,UAAM,YAAY;AAAA,MAChB,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,SAAS;AAAA,IACX;AACA,aAAS,kBAAkB,aAAa,SAAS;AAAA,EACnD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAQA,SAAS,mCACP,KACA,UACA,UACA,UAMA,eAC4B;AAC5B,QAAM,iBACJ;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACF,MAAI,CAAC,eAAe,IAAI;AACtB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,aAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,EAAE,MAAM,SAAS;AAAA,IACjB;AAAA,MACE,mBAAmB,SAAS;AAAA,MAC5B,UAAU,SAAS;AAAA,MACnB,mBAAmB,SAAS;AAAA,MAC5B,cAAc,SAAS;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,WACP,QACA,QACsC;AACtC,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,GAAG;AAAA,EACL;AACF;AAEA,SAAS,sCACP,UACA,OACsB;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,UAAU;AAAA,IACV,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,kBAAkB,CAAC;AAAA,EACrB;AACF;;;AUv4BA,IAAAC,MAAoB;AAyBpB,SAAS,qBAAqB,SAA6C;AACzE,SAAO;AACT;AAUO,SAAS,yBAAyB,UAAsC;AAC7E,SAAO,qBAAqB,qBAAqB,QAAQ,CAAC;AAC5D;AAWO,SAAS,oCACd,SACA,UACoB;AACpB,SAAO,qBAAqB,gCAAgC,SAAS,QAAQ,CAAC;AAChF;AAEA,SAAS,gBAAgB,SAAoD;AAC3E,QAAM,uBAAuB,QAAQ;AACrC,SAAO,QAAQ,QAAQ,oBAAoB,QAAQ,UAAU,KAAK,qBAAqB;AACzF;AAEA,SAAS,0BACP,aACwF;AACxF,SACK,uBAAmB,WAAW,KAC9B,2BAAuB,WAAW,KAClC,2BAAuB,WAAW;AAEzC;AAWO,SAAS,oBACd,SACA,aAAa,WACK;AAClB,QAAM,eAAe,gBAAgB,OAAO;AAC5C,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,eACJ,QAAQ,QACL,mBAAmB,YAAY,EAC/B,KAAK,CAAC,cAAc,UAAU,SAAS,UAAU,KAAK;AAC3D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,QAAW,gBAAY,QACvC,QAAQ,QAAQ,iBAAiB,YAAY,IAC7C;AACN;AAcO,SAAS,+BACd,SACA,aAAa,WACmE;AAChF,SACE,oBAAoB,SAAS,UAAU,GAAG,cAAc,KAAK,yBAAyB,KAAK;AAE/F;;;AC1HA,IAAAC,OAAoB;AACpB,IAAAC,mBAAkD;AA0BlD,IAAAC,oBAA2C;AAgI3C,SAAS,wBACP,QACA,kBACuB;AACvB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,qBAAqB,UAAa,EAAE,iBAAiB;AAAA,EAC3D;AACF;AAEA,SAAS,uBACP,aACwF;AACxF,SACK,wBAAmB,WAAW,KAC9B,4BAAuB,WAAW,KAClC,4BAAuB,WAAW;AAEzC;AAEA,SAAS,yBAAyB,MAAe,SAAkC;AACjF,MACE,wBAAwB,QACxB,MAAM,QAAQ,KAAK,kBAAkB,KACrC,KAAK,mBAAmB,SAAS,GACjC;AACA,WAAO;AAAA,EACT;AAEA,OAAK,KAAK,QAAW,eAAU,YAAY,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AACnB,OAAK,WAAW,cAAiB,iBAAY,eAAe,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,iBAAiB,UAA8B,EAAE,SAAS;AAC3E;AAEA,SAASC,yBACP,MACqF;AACrF,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ,iBAAiB,QAAW;AACtC,UAAM,cAAc,OAAO,aAAa,CAAC;AACzC,QAAI,gBAAgB,UAAa,uBAAuB,WAAW,GAAG;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,mBAAmB,KAAK,aAAa,cAAc,KAAQ,2BAAsB;AACvF,SAAO;AACT;AAEA,SAAS,gBAAgB,YAAiC,WAAW,iBAAyB;AAC5F,MAAI,eAAe,UAAa,UAAU,YAAY;AACpD,UAAM,YAAY;AAClB,QAAI,UAAU,SAAS,UAAgB,kBAAa,UAAU,IAAI,GAAG;AACnE,aAAO,UAAU,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,MACA,YACA,cACA,UACA,aACiB;AACjB,QAAM,SAAsB,WAAW,IAAI,CAAC,cAAc;AAAA,IACxD,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,GAAI,SAAS,aAAa,UAAa,EAAE,UAAU,SAAS,SAAS;AAAA,IACrE,MAAM,SAAS;AAAA,IACf,UAAU,CAAC,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,aAAa,SAAS;AAAA,IACtB,YAAY,SAAS;AAAA,EACvB,EAAE;AAEF,SAAO;AAAA,IACL;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC;AAAA,IACA,cAAc,OAAO,IAAI,OAAO,CAAC,EAAE;AAAA,IACnC;AAAA,IACA,GAAI,gBAAgB,UAAa,YAAY,SAAS,KAAK,EAAE,YAAY;AAAA,IACzE,iBAAiB,CAAC;AAAA,IAClB,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,EAChB;AACF;AAeA,SAAS,YAAY,UAAsE;AACzF,MAAI,UAAU,YAAY,QAAW;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AACvC,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAC/C;AAEA,SAAS,wBACP,UACA,iBACA,aACA,gBACM;AACN,QAAM,oBAAoB;AAAA,IACxB,wBAAwB,cAAc;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,UAAU,YAAY,UAAa,kBAAkB,QAAQ,SAAS,oBAAoB;AAC5F,UAAM,IAAI;AAAA,MACR,iDAAiD,eAAe,KAAK,WAAW;AAAA,IAClF;AAAA,EACF;AACA,MACE,UAAU,gBAAgB,UAC1B,kBAAkB,YAAY,SAAS,oBACvC;AACA,UAAM,IAAI;AAAA,MACR,qDAAqD,eAAe,KAAK,WAAW;AAAA,IACtF;AAAA,EACF;AACA,MACE,UAAU,kBAAkB,UAC5B,kBAAkB,QAAQ,cAAc,SAAS,oBACjD;AACA,UAAM,IAAI;AAAA,MACR,uDAAuD,eAAe,KAAK,WAAW;AAAA,IACxF;AAAA,EACF;AACA,MACE,UAAU,sBAAsB,UAChC,kBAAkB,YAAY,cAAc,SAAS,oBACrD;AACA,UAAM,IAAI;AAAA,MACR,2DAA2D,eAAe,KAAK,WAAW;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,SAAS,iBACP,UACA,cACA,cACoB;AACpB,MAAI,SAAS,SAAS,aAAa;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,SAAS,IAAI;AAC7C,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,WAAW;AAAA,IACjB,GAAI,WAAW,aAAa,UAAa,EAAE,UAAU,WAAW,SAAS;AAAA,IACzE,GAAI,WAAW,gBAAgB,UAC7B,WAAW,YAAY,SAAS,KAAK,EAAE,aAAa,WAAW,YAAY;AAAA,IAC7E,MAAM,WAAW;AAAA,EACnB;AACF;AAEA,SAAS,uBACP,MACA,cACA,UACgB;AAChB,QAAM,yBAAyB,YAAY,KAAK,QAAQ;AACxD,QAAM,iBAA4B;AAAA,IAChC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,GAAG;AAAA;AAAA;AAAA;AAAA,MAIH,SAAS,EAAE,OAAO,YAAY,QAAQ,WAAW;AAAA,IACnD;AAAA,IACA,MAAM,KAAK;AAAA,IACX,UAAU;AAAA,IACV,aAAa,CAAC;AAAA,IACd,aAAa,CAAC,GAAI,KAAK,eAAe,CAAC,CAAE;AAAA,IACzC,YAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK;AAAA,IACT;AAAA,MACE,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,WAAW;AAAA,MACX,UAAU,CAAC,cAAc;AAAA,MACzB,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAS;AAAA,MAC7D,GAAI,KAAK,gBAAgB,UACvB,KAAK,YAAY,SAAS,KAAK,EAAE,iBAAiB,KAAK,YAAY;AAAA,MACrE;AAAA,MACA,YAAY,eAAe;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,QAAQ,wBAAwB,UAAU,QAAQ;AAAA,MAClD,SAAS;AAAA,MACT,iBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAS,yBAAyB,IAAI;AAAA,IAC1C,mBAAmB,UAAU;AAAA,IAC7B,mBAAmB,UAAU;AAAA,IAC7B,cAAc,UAAU;AAAA,EAC1B,CAAC;AAED,QAAM,SAAS,OAAO,aAAa,UAAU;AAC7C,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,8EAA8E;AAAA,EAChG;AAEA,MAAI,OAAO,UAAU,UAAa,OAAO,KAAK,OAAO,KAAK,EAAE,WAAW,GAAG;AACxE,WAAO;AAAA,MACL,GAAI,OAAO,YAAY,UAAa,EAAE,SAAS,OAAO,QAAQ;AAAA,MAC9D,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,OAAO,YAAY,UAAa,EAAE,SAAS,OAAO,QAAQ;AAAA,IAC9D,GAAG;AAAA,IACH,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,4BACP,UACA,UACA,UACuB;AACvB,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,EAAE,MAAM,SAAS;AAAA,MACjB;AAAA,QACE,mBAAmB,UAAU;AAAA,QAC7B,mBAAmB,UAAU;AAAA,QAC7B,UAAU,UAAU;AAAA,QACpB,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEA,SAAS,gCACP,SACA,uBAAuB,OACvB,cACuB;AACvB,QAAM,WAAW,qBAAqB,OAAO;AAC7C,QAAM,mBACJ,wBAAwB,yBAAyB,QAAQ,MAAM,QAAQ,QAAQ,OAAO,IAClF,SACAA,yBAAwB,QAAQ,IAAI;AAC1C,MAAI,qBAAqB,QAAW;AAClC,WAAO,+BAA+B;AAAA,MACpC,GAAG;AAAA,MACH,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,QAAM,WACJ,QAAQ,YAAY,cAAc,EAAE,YAAY,QAAQ,QAAQ,WAAW;AAC7E,QAAM,eAA+C,CAAC;AACtD,QAAM,cAA8C,CAAC;AACrD,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,IACA,oBAAI,IAAa;AAAA,IACjB,QAAQ;AAAA,IACR,6BAA6B,SAAS,UAAU,QAAQ,aAAa;AAAA,IACrE,SAAS;AAAA,IACT;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,oBAAoB,YACvB,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,KAAK,WAAW,OAAO,EAAE,EAC/D,KAAK,IAAI;AACZ,UAAM,IAAI;AAAA,MACR,wEAAwE,iBAAiB;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ,gBAAgB,QAAQ,UAAU;AAAA,EACpD;AACA,QAAM,iBAAiB,sBAAsB,cAAc,UAAU,cAAc,QAAQ;AAC3F,QAAM,OAA2B;AAAA,IAC/B,GAAG;AAAA,IACH,GAAI,cAAc,SAAS,UAAa,EAAE,MAAM,aAAa,KAAK;AAAA,IAClE,GAAI,mBAAmB,UAAa,EAAE,UAAU,eAAe;AAAA,IAC/D,GAAI,cAAc,gBAAgB,UAAa,EAAE,aAAa,aAAa,YAAY;AAAA,EACzF;AAEA,MAAI,KAAK,KAAK,SAAS,UAAU;AAC/B,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,QAAQ,KAAK;AAAA,QACrB,KAAK,KAAK;AAAA,QACV;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,uBAAuB,MAAM,cAAc,QAAQ;AAAA,IAC/D,UAAU;AAAA,IACV,GAAI,KAAK,aAAa,UAAa,EAAE,kBAAkB,KAAK,SAAS;AAAA,EACvE;AACF;AAYO,SAAS,+BACd,SACuB;AACvB,QAAM,WAAW,QAAQ,YAAY,cAAc,EAAE;AACrD,QAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAO,wBAAmB,QAAQ,WAAW,GAAG;AAC9C,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAO,4BAAuB,QAAQ,WAAW,GAAG;AAClD,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAO,4BAAuB,QAAQ,WAAW,GAAG;AAClD,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AACA,QAAI,cAAc,IAAI;AACpB,aAAO,4BAA4B,cAAc,UAAU,UAAU,QAAQ;AAAA,IAC/E;AACA,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AACA,QAAI,cAAc,YAAY,SAAS,GAAG;AACxC,YAAM,oBAAoB,cAAc,YACrC,IAAI,CAAC,eAAe,GAAG,WAAW,IAAI,KAAK,WAAW,OAAO,EAAE,EAC/D,KAAK,IAAI;AACZ,YAAM,IAAI;AAAA,QACR,wEAAwE,iBAAiB;AAAA,MAC3F;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,MAAM,QAAQ,QAAQ,QAAQ,kBAAkB,QAAQ,WAAW;AAAA,QACnE,YAAY,QAAQ;AAAA,QACpB,MAAM,QAAQ,YAAY,KAAK;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,QAAQ,YAAY,KAAK;AAAA,QAC/B,GAAI,cAAc,aAAa,UAAa,EAAE,UAAU,cAAc,SAAS;AAAA,QAC/E,GAAI,cAAc,YAAY,SAAS,KAAK,EAAE,aAAa,cAAc,YAAY;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAqB,QAAQ;AACnC,SAAO;AACT;AAWO,SAAS,wBACd,SACuB;AACvB,SAAO,gCAAgC,OAAO;AAChD;AAOO,SAAS,6BACd,SACuB;AACvB,SAAO,gCAAgC;AAAA,IACrC,GAAG;AAAA,IACH,MAAM,QAAQ,QAAQ,QAAQ,kBAAkB,QAAQ,SAAS;AAAA,IACjE,YAAY,QAAQ;AAAA,IACpB,MAAM,gBAAgB,QAAQ,WAAW,WAAW;AAAA,EACtD,CAAC;AACH;AASO,SAAS,8BACd,SACuB;AACvB,QAAM,YAAY,QAAQ,QAAQ,QAAQ,4BAA4B,QAAQ,WAAW;AACzF,QAAM,aACJ,cAAc,SACV,QAAQ,QAAQ,QAAQ,yBAAyB,SAAS,IAC1D,QAAQ,QAAQ,QAAQ,kBAAkB,QAAQ,WAAW;AACnE,QAAM,OAAO,kBAAkB,QAAQ,QAAQ,SAAS,UAAU;AAClE,QAAM,aACJ,SAAS,aACJ,sBAAsB,QAAQ,YAAY,IAAI,KAC/C,QAAQ,YAAY,QACpB,QAAQ,cACP,QAAQ,YAAY,QAAQ,QAAQ;AAE3C,QAAM,eACJ,QAAQ,YAAY,SAAS,UAAgB,kBAAa,QAAQ,YAAY,IAAI,IAC9E,GAAG,QAAQ,YAAY,KAAK,IAAI,eAChC;AAEN,SAAO,gCAAgC;AAAA,IACrC,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACH;AAQO,SAAS,2BACd,SAC8B;AAC9B,QAAM,WAAW,qBAAqB,OAAO;AAC7C,QAAM,eAAW,oDAAkC;AAAA,IACjD,SAAS,QAAQ,QAAQ;AAAA,IACzB,MAAM,QAAQ;AAAA,IACd,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS,mBAAmB;AAAA,IACxC,cAAc,QAAQ;AAAA,EACxB,CAAC;AACD,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS;AAE1B,0BAAwB,UAAU,SAAS,iBAAiB,SAAS,aAAa,SAAS,QAAQ;AACnG,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAyB,MAAwB;AAC1E,MAAI,EAAE,oBAAoB,YAAY,OAAO,QAAQ,mBAAmB,YAAY;AAClF,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,eAAe,IAAI,KAAK;AAChD,MAAI,YAAY,QAAQ,qBAAqB,SAAS,IAAI,GAAG;AAO3D,UAAM,IAAI;AAAA,MACR,oDAAoD,QAAQ,aAAa,IAAI,CAAC;AAAA,IAIhF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAyB,MAAwB;AAC7E,QAAM,aAAa,KAAK,UAAU,GAAG,QAAQ;AAC7C,MAAI,eAAe,aAAa,eAAe,eAAe;AAC5D,WAAO;AAAA,EACT;AACA,SAAO,6BAA6B,KAAK,QAAQ,aAAa,IAAI,CAAC;AACrE;AAEA,SAAS,sBAAsB,UAA4D;AACzF,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,MAAO,6BAAwB,QAAQ,GAAG;AACxC,UAAM,YAAY,sBAAsB,SAAS,IAAI;AACrD,WAAO,aAAa;AAAA,EACtB;AAEA,SAAO,2BAA2B,QAAQ,IAAI,SAAS,cAAc,CAAC,IAAI;AAC5E;AAEA,SAAS,2BACP,UACuF;AACvF,SACK,yBAAoB,QAAQ,KAC5B,kBAAa,SAAS,QAAQ,KACjC,SAAS,SAAS,SAAS,aAC3B,SAAS,kBAAkB,UAC3B,SAAS,cAAc,SAAS;AAEpC;;;ACxrBO,SAAS,2BACd,SACuB;AACvB,QAAM,EAAE,UAAU,UAAU,UAAU,GAAG,cAAc,IAAI;AAC3D,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA;AAAA,IAEA,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAEA,QAAM,mBAAmB,4BAA4B,UAAU,UAAU,cAAc,QAAQ;AAC/F,QAAM,KAAK;AAAA,IACT;AAAA,IACA,EAAE,MAAM,SAAS;AAAA;AAAA,IAEjB,cAAc,aAAa,SAAY,EAAE,UAAU,cAAc,SAAS,IAAI;AAAA,EAChF;AAEA,SAAO;AAAA,IACL,YAAY,yBAAyB,IAAI,aAAa;AAAA,IACtD,UAAU,uBAAuB,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,4BACP,UACA,UACA,UACiB;AACjB,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,aAAa,SAAY,EAAE,SAAS,IAAI;AAAA,EAC1C;AACA,QAAM,gBAAgB,qBAAqB,UAAU,QAAQ;AAE7D,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,oBAAI,IAAuB;AACjD,aAAW,SAAS,eAAe;AACjC,QAAI,cAAc,IAAI,MAAM,IAAI,GAAG;AACjC,YAAM,IAAI,MAAM,oCAAoC,MAAM,IAAI,kBAAkB;AAAA,IAClF;AACA,kBAAc,IAAI,MAAM,MAAM,KAAK;AAAA,EACrC;AAEA,QAAM,eAA4B,CAAC;AAEnC,aAAW,aAAa,SAAS,QAAQ;AACvC,UAAM,eAAe,cAAc,IAAI,UAAU,IAAI;AACrD,QAAI,iBAAiB,QAAW;AAC9B,mBAAa,KAAK,SAAS;AAC3B;AAAA,IACF;AAEA,iBAAa,KAAK,kBAAkB,WAAW,cAAc,SAAS,YAAY,CAAC;AACnF,kBAAc,OAAO,UAAU,IAAI;AAAA,EACrC;AAEA,MAAI,cAAc,OAAO,GAAG;AAC1B,UAAM,gBAAgB,CAAC,GAAG,cAAc,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI;AAChE,UAAM,IAAI;AAAA,MACR,uFAAuF,aAAa;AAAA,IACtG;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,qBAAqB,UAAiD;AAC7E,QAAM,SAAsB,CAAC;AAE7B,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,eAAO,KAAK,OAAO;AACnB;AAAA,MACF,KAAK;AACH,eAAO,KAAK,GAAG,qBAAqB,QAAQ,QAAQ,CAAC;AACrD;AAAA,MACF,KAAK;AACH,eAAO,KAAK,GAAG,qBAAqB,QAAQ,QAAQ,CAAC;AACrD;AAAA,MACF,SAAS;AACP,cAAM,cAAqB;AAC3B,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,WACA,cACA,cACW;AACX,8BAA4B,WAAW,YAAY;AACnD,QAAM,WAAW,sBAAsB,UAAU,UAAU,aAAa,QAAQ;AAChF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,MAAM,eAAe,WAAW,cAAc,YAAY;AAAA,IAC1D,aAAa,iBAAiB,UAAU,aAAa,aAAa,WAAW;AAAA,EAC/E;AACF;AAEA,SAAS,4BAA4B,WAAsB,cAA+B;AACxF,MAAI,aAAa,YAAY,SAAS,GAAG;AACvC,UAAM,IAAI;AAAA,MACR,gCAAgC,UAAU,IAAI;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,aAAa,YAAY,CAAC,UAAU,UAAU;AAChD,UAAM,IAAI;AAAA,MACR,gCAAgC,UAAU,IAAI;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,eACP,WACA,cACA,cACU;AACV,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM,EAAE,MAAM,YAAY,IAAI;AAE9B,MAAI,YAAY,SAAS,YAAY,YAAY,SAAS,SAAS;AACjE,UAAM,IAAI;AAAA,MACR,gFAAgF,UAAU,IAAI;AAAA,IAChG;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,WAAW;AAClC,QAAI,CAAC,2BAA2B,WAAW,cAAc,YAAY,GAAG;AACtE,YAAM,IAAI;AAAA,QACR,gCAAgC,UAAU,IAAI;AAAA,MAChD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,sBAAsB,UAAU,WAAW,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,gCAAgC,UAAU,IAAI;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,WACA,cACA,cACS;AACT,QAAM,cAAc,aAAa;AACjC,MAAI,YAAY,SAAS,WAAW;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,qBAAqB,UAAU,MAAM,YAAY;AAC1E,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,gBAAgB,QAAQ;AACtC,WAAO,iBAAiB,SAAS,cAC7B,iBAAiB,kBAAkB,WACnC,iBAAiB,SAAS;AAAA,EAChC;AAEA,SAAO,iBAAiB,SAAS,YAAY,iBAAiB,SAAS;AACzE;AAEA,SAAS,qBACP,MACA,cACA,OAAO,oBAAI,IAAY,GACN;AACjB,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,aAAa,KAAK,IAAI;AACzC,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,OAAK,IAAI,KAAK,IAAI;AAClB,SAAO,qBAAqB,WAAW,MAAM,cAAc,IAAI;AACjE;AAEA,SAAS,sBAAsB,UAAoB,aAAgC;AACjF,MAAI,SAAS,SAAS,YAAY,MAAM;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK;AACH,aACE,YAAY,SAAS,eAAe,SAAS,kBAAkB,YAAY;AAAA,IAE/E,KAAK;AACH,aAAO,YAAY,SAAS;AAAA,IAC9B,KAAK;AACH,aACE,YAAY,SAAS,aACrB,SAAS,gBAAgB,YAAY,eACrC,SAAS,cAAc,YAAY;AAAA,IAEvC,KAAK;AACH,aAAO,YAAY,SAAS;AAAA,IAC9B,KAAK;AACH,aAAO,YAAY,SAAS,eAAe,SAAS,SAAS,YAAY;AAAA,IAC3E,KAAK;AACH,aAAO,YAAY,SAAS;AAAA,IAC9B,KAAK;AACH,aAAO,YAAY,SAAS,YAAY,SAAS,WAAW,YAAY;AAAA,IAC1E,KAAK;AAAA,IACL,KAAK;AAIH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,iBACP,iBACA,oBACkB;AAClB,QAAM,WAAW,IAAI,IAAI,gBAAgB,IAAI,aAAa,CAAC;AAC3D,QAAM,cAAc,mBAAmB;AAAA,IACrC,CAAC,eAAe,CAAC,SAAS,IAAI,cAAc,UAAU,CAAC;AAAA,EACzD;AACA,SAAO,CAAC,GAAG,iBAAiB,GAAG,WAAW;AAC5C;AAEA,SAAS,cAAc,YAAoC;AACzD,SAAO,WAAW,mBAAmB,WACjC,GAAG,WAAW,cAAc,IAAI,WAAW,YAAY,KACvD,WAAW;AACjB;;;AzB5EO,SAAS,iBACd,MACA,SACa;AACb,QAAM,SAAS,SAAS,UAAU;AAClC,SAAO,MAAM,8CAA8C;AAC3D,SAAO;AAAA,IACL,YAAY,mBAAmB,MAAM,OAAO;AAAA,IAC5C,UAAU,iBAAiB,MAAM,OAAO;AAAA,EAC1C;AACF;AAgEO,SAAS,aACd,MACA,SACoB;AACpB,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AACJ,QAAM,UAAU,aAAa,yBAAY,MAAM,EAAE,OAAO,QAAQ,CAAC;AAGjE,QAAM,eACJ,iBAAiB,UAAa,sBAAsB,UAAa,aAAa,SAC1E,EAAE,QAAQ,UAAU,IACpB;AAAA,IACE,GAAI,iBAAiB,UAAa,EAAE,aAAa;AAAA,IACjD,GAAI,sBAAsB,UAAa,EAAE,kBAAkB;AAAA,IAC3D,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,QAAQ;AAAA,EACV;AAEN,QAAM,EAAE,YAAY,UAAAC,UAAS,IAAI,iBAAiB,MAAM,YAAY;AAGpE,MAAI,CAAI,cAAW,MAAM,GAAG;AAC1B,IAAG,aAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAGA,QAAM,iBAAsB,WAAK,QAAQ,GAAG,IAAI,cAAc;AAC9D,QAAM,eAAoB,WAAK,QAAQ,GAAG,IAAI,gBAAgB;AAE9D,SAAO,MAAM,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC5D,EAAG,iBAAc,gBAAgB,KAAK,UAAU,YAAY,MAAM,MAAM,CAAC;AACzE,SAAO,MAAM,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxD,EAAG,iBAAc,cAAc,KAAK,UAAUA,WAAU,MAAM,MAAM,CAAC;AAErE,SAAO,EAAE,gBAAgB,aAAa;AACxC;","names":["import_core","import_internals","import_core","import_zod","path","import_internals","import_zod","ts","ts","ts","import_internal","ts","ts","import_internal","import_internals","import_core","ts","import_internal","import_internal","import_internal","path","result","text","provenance","members","isBooleanUnion","ts","path","import_internal","ts","ts","import_internal","import_internals","getNamedTypeDeclaration","uiSchema"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/json-schema/generator.ts","../src/canonicalize/chain-dsl-canonicalizer.ts","../src/metadata/policy.ts","../src/metadata/resolve.ts","../src/canonicalize/tsdoc-canonicalizer.ts","../src/metadata/collision-guards.ts","../src/json-schema/ir-generator.ts","../src/ui-schema/generator.ts","../src/ui-schema/schema.ts","../src/ui-schema/ir-generator.ts","../src/extensions/registry.ts","../src/json-schema/schema.ts","../src/generators/class-schema.ts","../src/analyzer/program.ts","../src/analyzer/class-analyzer.ts","../src/analyzer/jsdoc-constraints.ts","../src/analyzer/tsdoc-parser.ts","../src/extensions/resolve-custom-type.ts","../src/extensions/ts-type-utils.ts","../src/analyzer/builtin-brands.ts","../src/extensions/symbol-registry.ts","../src/validate/constraint-validator.ts","../src/static-build.ts","../src/generators/discovered-schema.ts","../src/generators/mixed-authoring.ts"],"sourcesContent":["/**\n * `@formspec/build` - Build tools for FormSpec\n *\n * This package provides generators to compile FormSpec forms into:\n * - JSON Schema 2020-12 (for validation)\n * - JSON Forms UI Schema (for rendering)\n *\n * @example\n * ```typescript\n * import { buildFormSchemas } from \"@formspec/build\";\n * import { formspec, field, group } from \"@formspec/dsl\";\n *\n * const form = formspec(\n * group(\"Customer\",\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.text(\"email\", { label: \"Email\" }),\n * ),\n * );\n *\n * const { jsonSchema, uiSchema } = buildFormSchemas(form);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { FormElement, FormSpec, LoggerLike } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { generateJsonSchema, type GenerateJsonSchemaOptions } from \"./json-schema/generator.js\";\nimport { generateUiSchema, type GenerateUiSchemaOptions } from \"./ui-schema/generator.js\";\nimport { type JsonSchema2020 } from \"./json-schema/ir-generator.js\";\nimport type { UISchema } from \"./ui-schema/types.js\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type { JsonSchema2020 } from \"./json-schema/ir-generator.js\";\nexport type { GenerateJsonSchemaOptions } from \"./json-schema/generator.js\";\nexport type { GenerateUiSchemaOptions } from \"./ui-schema/generator.js\";\nexport type {\n BuiltinConstraintBroadeningRegistration,\n ConstraintTagRegistration,\n CustomAnnotationRegistration,\n CustomConstraintRegistration,\n CustomTypeRegistration,\n ExtensionDefinition,\n AnyField,\n ArrayField,\n BooleanField,\n Conditional,\n DynamicEnumField,\n DynamicSchemaField,\n EnumOption,\n EnumOptionValue,\n FormElement,\n FormSpec,\n Group,\n NumberField,\n ObjectField,\n StaticEnumField,\n TextField,\n} from \"@formspec/core\";\n\nexport type {\n JSONSchema7,\n JSONSchemaType,\n ExtendedJSONSchema7,\n FormSpecSchemaExtensions,\n} from \"./json-schema/types.js\";\n\nexport { createExtensionRegistry } from \"./extensions/index.js\";\nexport type {\n ExtensionRegistry,\n ExtensionTypeLookupResult,\n MutableExtensionRegistry,\n} from \"./extensions/index.js\";\n/**\n * A simplified setup-time diagnostic produced by extension-registry construction.\n *\n * Re-exported here because {@link ExtensionRegistry.setupDiagnostics} (an\n * `@internal` field on a `@public` interface) references this type directly.\n * API Extractor requires every type transitively referenced through a public\n * surface to be exported from the package entry point, even when the field\n * carrying it is marked `@internal`.\n *\n * @internal\n */\nexport type { SetupDiagnostic } from \"@formspec/analysis/internal\";\nexport type { FormSpecConfig } from \"@formspec/config\";\n\nexport type {\n UISchema,\n UISchemaElement,\n UISchemaElementBase,\n UISchemaElementType,\n ControlElement,\n VerticalLayout,\n HorizontalLayout,\n GroupLayout,\n Categorization,\n Category,\n LabelElement,\n Rule,\n RuleEffect,\n RuleConditionSchema,\n SchemaBasedCondition,\n} from \"./ui-schema/types.js\";\n\nexport type {\n DetailedClassSchemasResult,\n DetailedSchemaGenerationTargetResult,\n DiscriminatorResolutionOptions,\n GenerateFromClassOptions,\n GenerateFromClassResult,\n GenerateSchemasOptions,\n GenerateSchemasBatchFromProgramOptions,\n GenerateSchemasBatchOptions,\n GenerateSchemasFromProgramOptions,\n SchemaGenerationTarget,\n StaticSchemaGenerationOptions,\n} from \"./generators/class-schema.js\";\nexport type { StaticBuildContext } from \"./static-build.js\";\nexport type {\n ValidateIROptions,\n ValidationDiagnostic,\n ValidationDiagnosticLocation,\n ValidationDiagnosticSeverity,\n ValidationResult,\n} from \"./validate/index.js\";\nexport type {\n DiscoveredTypeSchemas,\n GenerateSchemasFromDeclarationOptions,\n MetadataSourceDeclaration,\n GenerateSchemasFromParameterOptions,\n GenerateSchemasFromReturnTypeOptions,\n GenerateSchemasFromTypeOptions,\n ResolveDeclarationMetadataOptions,\n SchemaSourceDeclaration,\n} from \"./generators/discovered-schema.js\";\nexport type {\n BuildMixedAuthoringSchemasOptions,\n MixedAuthoringSchemas,\n} from \"./generators/mixed-authoring.js\";\n\n// =============================================================================\n// Zod Validation Schemas\n// =============================================================================\n\nexport { jsonSchema7Schema } from \"./json-schema/schema.js\";\nexport { uiSchema as uiSchemaSchema } from \"./ui-schema/schema.js\";\n\n// =============================================================================\n// Chain DSL Generators\n// =============================================================================\n\nexport { generateJsonSchema } from \"./json-schema/generator.js\";\nexport { generateUiSchema } from \"./ui-schema/generator.js\";\nexport {\n generateSchemasBatch,\n generateSchemasBatchFromProgram,\n generateSchemasFromClass,\n} from \"./generators/class-schema.js\";\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport { generateSchemas } from \"./generators/class-schema.js\";\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport { generateSchemasFromProgram } from \"./generators/class-schema.js\";\n/* eslint-disable @typescript-eslint/no-deprecated */\nexport {\n generateSchemasDetailed,\n generateSchemasFromProgramDetailed,\n} from \"./generators/class-schema.js\";\n/* eslint-enable @typescript-eslint/no-deprecated */\nexport {\n createStaticBuildContext,\n createStaticBuildContextFromProgram,\n resolveModuleExport,\n resolveModuleExportDeclaration,\n} from \"./static-build.js\";\nexport {\n generateSchemasFromDeclaration,\n generateSchemasFromParameter,\n generateSchemasFromReturnType,\n generateSchemasFromType,\n resolveDeclarationMetadata,\n} from \"./generators/discovered-schema.js\";\nexport { buildMixedAuthoringSchemas } from \"./generators/mixed-authoring.js\";\n\n/**\n * Result of building form schemas.\n *\n * @public\n */\nexport interface BuildResult {\n /** JSON Schema 2020-12 for validation */\n readonly jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n readonly uiSchema: UISchema;\n}\n\n/**\n * Options for building schemas from a FormSpec.\n *\n * Currently identical to `GenerateJsonSchemaOptions`. Defined separately so the\n * Chain DSL surface can grow independently in the future if needed.\n *\n * @public\n */\nexport interface BuildFormSchemasOptions\n extends GenerateJsonSchemaOptions, GenerateUiSchemaOptions {\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Builds both JSON Schema and UI Schema from a FormSpec.\n *\n * This is a convenience function that combines `generateJsonSchema`\n * and `generateUiSchema`.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * field.text(\"name\", { required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n *\n * const { jsonSchema, uiSchema } = buildFormSchemas(form);\n *\n * // Use with JSON Forms renderer\n * <JsonForms\n * schema={jsonSchema}\n * uischema={uiSchema}\n * data={formData}\n * renderers={materialRenderers}\n * />\n * ```\n *\n * @param form - The FormSpec to build schemas from\n * @returns Object containing both jsonSchema and uiSchema\n *\n * @public\n */\nexport function buildFormSchemas<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: BuildFormSchemasOptions\n): BuildResult {\n const logger = options?.logger ?? noopLogger;\n logger.debug(\"buildFormSchemas: starting schema generation\");\n return {\n jsonSchema: generateJsonSchema(form, options),\n uiSchema: generateUiSchema(form, options),\n };\n}\n\n/**\n * Options for writing schemas to disk.\n *\n * @public\n */\nexport interface WriteSchemasOptions extends GenerateJsonSchemaOptions {\n /** Output directory for the schema files */\n readonly outDir: string;\n /** Base name for the output files (without extension). Defaults to \"schema\" */\n readonly name?: string;\n /** Number of spaces for JSON indentation. Defaults to 2 */\n readonly indent?: number;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Result of writing schemas to disk.\n *\n * @public\n */\nexport interface WriteSchemasResult {\n /** Path to the generated JSON Schema file */\n readonly jsonSchemaPath: string;\n /** Path to the generated UI Schema file */\n readonly uiSchemaPath: string;\n}\n\n/**\n * Builds and writes both JSON Schema and UI Schema files to disk.\n *\n * This is a convenience function for build-time schema generation.\n * It creates the output directory if it doesn't exist.\n *\n * @example\n * ```typescript\n * import { formspec, field } from \"formspec\";\n * import { writeSchemas } from \"@formspec/build\";\n *\n * const ProductForm = formspec(\n * field.text(\"name\", { required: true }),\n * field.enum(\"status\", [\"draft\", \"active\"]),\n * );\n *\n * // Write schemas to ./generated/product-schema.json and ./generated/product-uischema.json\n * const { jsonSchemaPath, uiSchemaPath } = writeSchemas(ProductForm, {\n * outDir: \"./generated\",\n * name: \"product\",\n * });\n *\n * console.log(`Generated: ${jsonSchemaPath}, ${uiSchemaPath}`);\n * ```\n *\n * @param form - The FormSpec to build schemas from\n * @param options - Output options (directory, file name, indentation)\n * @returns Object containing paths to the generated files\n *\n * @public\n */\nexport function writeSchemas<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options: WriteSchemasOptions\n): WriteSchemasResult {\n const {\n outDir,\n name = \"schema\",\n indent = 2,\n vendorPrefix,\n enumSerialization,\n metadata,\n logger: rawLogger,\n } = options;\n const logger = (rawLogger ?? noopLogger).child({ stage: \"write\" });\n\n // Build schemas\n const buildOptions =\n vendorPrefix === undefined && enumSerialization === undefined && metadata === undefined\n ? { logger: rawLogger }\n : {\n ...(vendorPrefix !== undefined && { vendorPrefix }),\n ...(enumSerialization !== undefined && { enumSerialization }),\n ...(metadata !== undefined && { metadata }),\n logger: rawLogger,\n };\n\n const { jsonSchema, uiSchema } = buildFormSchemas(form, buildOptions);\n\n // Ensure output directory exists\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n\n // Write files\n const jsonSchemaPath = path.join(outDir, `${name}-schema.json`);\n const uiSchemaPath = path.join(outDir, `${name}-uischema.json`);\n\n logger.debug(\"writing JSON Schema\", { path: jsonSchemaPath });\n fs.writeFileSync(jsonSchemaPath, JSON.stringify(jsonSchema, null, indent));\n logger.debug(\"writing UI Schema\", { path: uiSchemaPath });\n fs.writeFileSync(uiSchemaPath, JSON.stringify(uiSchema, null, indent));\n\n return { jsonSchemaPath, uiSchemaPath };\n}\n","/**\n * JSON Schema generator for FormSpec forms.\n *\n * Routes through the canonical IR pipeline: Chain DSL → FormIR → JSON Schema 2020-12.\n */\n\nimport type { FormElement, FormSpec, LoggerLike, MetadataPolicyInput } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { canonicalizeChainDSL } from \"../canonicalize/index.js\";\nimport {\n generateJsonSchemaFromIR,\n type GenerateJsonSchemaFromIROptions,\n type JsonSchema2020,\n} from \"./ir-generator.js\";\n\n/**\n * Options for generating JSON Schema from a Chain DSL form.\n *\n * @public\n */\nexport interface GenerateJsonSchemaOptions {\n /**\n * Vendor prefix for emitted extension keywords.\n * @defaultValue \"x-formspec\"\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\";\n /** Metadata resolution policy for chain DSL generation. */\n readonly metadata?: MetadataPolicyInput | undefined;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Generates a JSON Schema 2020-12 from a FormSpec.\n *\n * All generation routes through the canonical IR. The chain DSL is first\n * canonicalized to a FormIR, then the IR-based generator produces the schema.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n *\n * const schema = generateJsonSchema(form);\n * // {\n * // $schema: \"https://json-schema.org/draft/2020-12/schema\",\n * // type: \"object\",\n * // properties: {\n * // name: { type: \"string\", title: \"Name\" },\n * // age: { type: \"number\", minimum: 0 }\n * // },\n * // required: [\"name\"]\n * // }\n * ```\n *\n * @param form - The FormSpec to convert\n * @returns A JSON Schema 2020-12 object\n *\n * @public\n */\nexport function generateJsonSchema<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: GenerateJsonSchemaOptions\n): JsonSchema2020 {\n const logger = (options?.logger ?? noopLogger).child({ stage: \"ir\" });\n const metadata = options?.metadata;\n const vendorPrefix = options?.vendorPrefix;\n const enumSerialization = options?.enumSerialization;\n logger.debug(\"canonicalizing chain DSL to IR\");\n const ir = canonicalizeChainDSL(form, metadata !== undefined ? { metadata } : undefined);\n const schemaLogger = (options?.logger ?? noopLogger).child({ stage: \"schema\" });\n schemaLogger.debug(\"generating JSON Schema from IR\");\n const internalOptions: GenerateJsonSchemaFromIROptions | undefined =\n vendorPrefix === undefined && enumSerialization === undefined\n ? undefined\n : {\n ...(vendorPrefix !== undefined && { vendorPrefix }),\n ...(enumSerialization !== undefined && { enumSerialization }),\n };\n return generateJsonSchemaFromIR(ir, internalOptions);\n}\n","/**\n * Canonicalizer that translates chain DSL `FormSpec` objects into the\n * canonical FormIR intermediate representation.\n *\n * This module maps the runtime objects produced by `@formspec/dsl` builder\n * functions (`field.*`, `group`, `when`, `formspec`) into the IR that all\n * downstream phases (validation, JSON Schema generation, UI Schema generation)\n * consume.\n */\n\nimport type {\n // Source types (chain DSL)\n AnyField,\n ArrayField,\n BooleanField,\n Conditional,\n DynamicEnumField,\n DynamicSchemaField,\n EnumOptionValue,\n FormElement,\n FormSpec,\n Group,\n NumberField,\n ObjectField,\n StaticEnumField,\n TextField,\n MetadataPolicyInput,\n} from \"@formspec/core\";\nimport type {\n // IR types\n JsonValue,\n AnnotationNode,\n ArrayTypeNode,\n ConstraintNode,\n ConditionalLayoutNode,\n DisplayNameAnnotationNode,\n DynamicTypeNode,\n EnumMember,\n EnumTypeNode,\n FieldNode,\n FormIR,\n FormIRElement,\n GroupLayoutNode,\n LengthConstraintNode,\n NumericConstraintNode,\n ObjectProperty,\n PatternConstraintNode,\n ObjectTypeNode,\n PlaceholderAnnotationNode,\n PrimitiveTypeNode,\n Provenance,\n ResolvedMetadata,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport { IR_VERSION, _getFormSpecMetadataPolicy } from \"@formspec/core/internals\";\nimport {\n getDeclarationMetadataPolicy,\n makeMetadataContext,\n normalizeMetadataPolicy,\n resolveMetadata,\n resolveFormIRMetadata,\n} from \"../metadata/index.js\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Default provenance for chain DSL nodes (no source location available). */\nconst CHAIN_DSL_PROVENANCE: Provenance = {\n surface: \"chain-dsl\",\n file: \"\",\n line: 0,\n column: 0,\n} as const;\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\nfunction isGroup(el: FormElement): el is Group<readonly FormElement[]> {\n return el._type === \"group\";\n}\n\nfunction isConditional(\n el: FormElement\n): el is Conditional<string, unknown, readonly FormElement[]> {\n return el._type === \"conditional\";\n}\n\nfunction isField(el: FormElement): el is AnyField {\n return el._type === \"field\";\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Translates a chain DSL `FormSpec` into the canonical `FormIR`.\n *\n * @param form - A form specification created via `formspec(...)` from `@formspec/dsl`\n * @returns The canonical intermediate representation\n */\ninterface CanonicalizeChainDSLOptions {\n readonly metadata?: MetadataPolicyInput;\n}\n\nexport function canonicalizeChainDSL(\n form: FormSpec<readonly FormElement[]>,\n options?: CanonicalizeChainDSLOptions\n): FormIR {\n const metadataPolicy = normalizeMetadataPolicy(\n options?.metadata ?? _getFormSpecMetadataPolicy(form)\n );\n const ir: FormIR = {\n kind: \"form-ir\",\n irVersion: IR_VERSION,\n elements: canonicalizeElements(form.elements, metadataPolicy),\n rootAnnotations: [],\n typeRegistry: {},\n provenance: CHAIN_DSL_PROVENANCE,\n };\n\n return resolveFormIRMetadata(ir, {\n policy: metadataPolicy,\n surface: \"chain-dsl\",\n // Chain DSL has no root/type-metadata authoring surface, so only resolve\n // field/type-registry metadata and enum-member labels here.\n resolveRootTypeMetadata: false,\n });\n}\n\n// =============================================================================\n// ELEMENT CANONICALIZATION\n// =============================================================================\n\n/**\n * Canonicalizes an array of chain DSL form elements into IR elements.\n */\nfunction canonicalizeElements(\n elements: readonly FormElement[],\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FormIRElement[] {\n return elements.map((element) => canonicalizeElement(element, metadataPolicy));\n}\n\n/**\n * Dispatches a single form element to its specific canonicalization function.\n */\nfunction canonicalizeElement(\n element: FormElement,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FormIRElement {\n if (isField(element)) {\n return canonicalizeField(element, metadataPolicy);\n }\n if (isGroup(element)) {\n return canonicalizeGroup(element, metadataPolicy);\n }\n if (isConditional(element)) {\n return canonicalizeConditional(element, metadataPolicy);\n }\n const _exhaustive: never = element;\n throw new Error(`Unknown element type: ${JSON.stringify(_exhaustive)}`);\n}\n\n// =============================================================================\n// FIELD CANONICALIZATION\n// =============================================================================\n\n/**\n * Dispatches a field element to its type-specific canonicalization function.\n */\nfunction canonicalizeField(\n field: AnyField,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n switch (field._field) {\n case \"text\":\n return canonicalizeTextField(field, metadataPolicy);\n case \"number\":\n return canonicalizeNumberField(field, metadataPolicy);\n case \"boolean\":\n return canonicalizeBooleanField(field, metadataPolicy);\n case \"enum\":\n return canonicalizeStaticEnumField(field, metadataPolicy);\n case \"dynamic_enum\":\n return canonicalizeDynamicEnumField(field, metadataPolicy);\n case \"dynamic_schema\":\n return canonicalizeDynamicSchemaField(field, metadataPolicy);\n case \"array\":\n return canonicalizeArrayField(field, metadataPolicy);\n case \"object\":\n return canonicalizeObjectField(field, metadataPolicy);\n default: {\n const _exhaustive: never = field;\n throw new Error(`Unknown field type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n\n// =============================================================================\n// SPECIFIC FIELD TYPE CANONICALIZERS\n// =============================================================================\n\nfunction canonicalizeTextField(\n field: TextField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"string\" };\n const constraints: ConstraintNode[] = [];\n\n if (field.minLength !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minLength\",\n value: field.minLength,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.maxLength !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maxLength\",\n value: field.maxLength,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.pattern !== undefined) {\n const c: PatternConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"pattern\",\n pattern: field.pattern,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field), field.placeholder),\n constraints\n );\n}\n\nfunction canonicalizeNumberField(\n field: NumberField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"number\" };\n const constraints: ConstraintNode[] = [];\n\n if (field.min !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minimum\",\n value: field.min,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.max !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maximum\",\n value: field.max,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n if (field.multipleOf !== undefined) {\n const c: NumericConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"multipleOf\",\n value: field.multipleOf,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field)),\n constraints\n );\n}\n\nfunction canonicalizeBooleanField(\n field: BooleanField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: PrimitiveTypeNode = { kind: \"primitive\", primitiveKind: \"boolean\" };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeStaticEnumField(\n field: StaticEnumField<string, readonly EnumOptionValue[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const members: EnumMember[] = field.options.map((opt) => {\n if (typeof opt === \"string\") {\n return { value: opt } satisfies EnumMember;\n }\n // Object option with id/label\n return { value: opt.id, displayName: opt.label } satisfies EnumMember;\n });\n\n const type: EnumTypeNode = { kind: \"enum\", members };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeDynamicEnumField(\n field: DynamicEnumField<string, string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: DynamicTypeNode = {\n kind: \"dynamic\",\n dynamicKind: \"enum\",\n sourceKey: field.source,\n parameterFields: field.params ? [...field.params] : [],\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeDynamicSchemaField(\n field: DynamicSchemaField<string>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const type: DynamicTypeNode = {\n kind: \"dynamic\",\n dynamicKind: \"schema\",\n sourceKey: field.schemaSource,\n parameterFields: [],\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\nfunction canonicalizeArrayField(\n field: ArrayField<string, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n // Array items form an object type from the sub-elements\n const itemProperties = buildObjectProperties(field.items, metadataPolicy);\n const itemsType: ObjectTypeNode = {\n kind: \"object\",\n properties: itemProperties,\n additionalProperties: true,\n };\n const type: ArrayTypeNode = { kind: \"array\", items: itemsType };\n\n const constraints: ConstraintNode[] = [];\n if (field.minItems !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"minItems\",\n value: field.minItems,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n if (field.maxItems !== undefined) {\n const c: LengthConstraintNode = {\n kind: \"constraint\",\n constraintKind: \"maxItems\",\n value: field.maxItems,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n constraints.push(c);\n }\n\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field)),\n constraints\n );\n}\n\nfunction canonicalizeObjectField(\n field: ObjectField<string, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): FieldNode {\n const properties = buildObjectProperties(field.properties, metadataPolicy);\n const type: ObjectTypeNode = {\n kind: \"object\",\n properties,\n additionalProperties: true,\n };\n return buildFieldNode(\n field.name,\n resolveFieldMetadata(field.name, field, metadataPolicy),\n type,\n field.required,\n buildAnnotations(getExplicitDisplayName(field))\n );\n}\n\n// =============================================================================\n// LAYOUT CANONICALIZATION\n// =============================================================================\n\nfunction canonicalizeGroup(\n g: Group<readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): GroupLayoutNode {\n return {\n kind: \"group\",\n label: g.label,\n elements: canonicalizeElements(g.elements, metadataPolicy),\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\nfunction canonicalizeConditional(\n c: Conditional<string, unknown, readonly FormElement[]>,\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): ConditionalLayoutNode {\n return {\n kind: \"conditional\",\n fieldName: c.field,\n // Conditional values from the chain DSL are JSON-serializable primitives\n // (strings, numbers, booleans) produced by the `is()` predicate helper.\n value: assertJsonValue(c.value),\n elements: canonicalizeElements(c.elements, metadataPolicy),\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Validates that a value is JSON-serializable (`JsonValue`).\n * The chain DSL's `is()` helper constrains conditional values to\n * JSON-compatible primitives, but the TypeScript type is `unknown`.\n * This runtime guard replaces an `as` cast with a validated assertion.\n */\nfunction assertJsonValue(v: unknown): JsonValue {\n if (v === null || typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n return v;\n }\n if (Array.isArray(v)) {\n return v.map(assertJsonValue);\n }\n if (typeof v === \"object\") {\n const result: Record<string, JsonValue> = {};\n for (const [key, val] of Object.entries(v)) {\n result[key] = assertJsonValue(val);\n }\n return result;\n }\n // Remaining types (function, symbol, bigint, undefined) are not JSON-serializable\n throw new TypeError(`Conditional value is not a valid JsonValue: ${typeof v}`);\n}\n\n/**\n * Builds a FieldNode from common field properties.\n */\nfunction buildFieldNode(\n name: string,\n metadata: ResolvedMetadata | undefined,\n type: TypeNode,\n required: boolean | undefined,\n annotations: AnnotationNode[],\n constraints: ConstraintNode[] = []\n): FieldNode {\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: required === true,\n constraints,\n annotations,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n}\n\n/**\n * Builds annotation nodes from optional label and placeholder values.\n */\nfunction buildAnnotations(label?: string, placeholder?: string): AnnotationNode[] {\n const annotations: AnnotationNode[] = [];\n\n if (label !== undefined) {\n const a: DisplayNameAnnotationNode = {\n kind: \"annotation\",\n annotationKind: \"displayName\",\n value: label,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n annotations.push(a);\n }\n\n if (placeholder !== undefined) {\n const a: PlaceholderAnnotationNode = {\n kind: \"annotation\",\n annotationKind: \"placeholder\",\n value: placeholder,\n provenance: CHAIN_DSL_PROVENANCE,\n };\n annotations.push(a);\n }\n\n return annotations;\n}\n\n/**\n * Converts an array of form elements into ObjectProperty nodes.\n * Used for ObjectField properties and ArrayField items.\n *\n * Only field elements produce properties; groups and conditionals within\n * an object/array context are recursively flattened to extract their fields.\n *\n * Fields inside conditional branches are always marked `optional: true`\n * because their presence in the data depends on the condition being met.\n * This matches the DSL's type inference behavior where conditional fields\n * produce optional properties in `InferFormSchema`.\n *\n * @param elements - The form elements to convert\n * @param insideConditional - Whether these elements are inside a conditional branch\n */\nfunction buildObjectProperties(\n elements: readonly FormElement[],\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>,\n insideConditional = false\n): ObjectProperty[] {\n const properties: ObjectProperty[] = [];\n\n for (const el of elements) {\n if (isField(el)) {\n const fieldNode = canonicalizeField(el, metadataPolicy);\n properties.push({\n name: fieldNode.name,\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n type: fieldNode.type,\n // Fields inside a conditional branch are always optional in the\n // data schema, regardless of their `required` flag — the condition\n // may not be met, so the field may be absent.\n optional: insideConditional || !fieldNode.required,\n constraints: fieldNode.constraints,\n annotations: fieldNode.annotations,\n provenance: CHAIN_DSL_PROVENANCE,\n });\n } else if (isGroup(el)) {\n // Groups inside object/array items contribute their fields by flattening.\n // Groups do not affect optionality — pass through the current state.\n properties.push(...buildObjectProperties(el.elements, metadataPolicy, insideConditional));\n } else if (isConditional(el)) {\n // Conditionals inside object/array items contribute their fields by\n // flattening, but all fields inside are forced optional.\n properties.push(...buildObjectProperties(el.elements, metadataPolicy, true));\n }\n }\n\n return properties;\n}\n\nfunction getExplicitDisplayName(field: {\n readonly label?: string;\n readonly displayName?: string;\n}): string | undefined {\n if (field.label !== undefined && field.displayName !== undefined) {\n throw new Error('Chain DSL fields cannot specify both \"label\" and \"displayName\".');\n }\n return field.displayName ?? field.label;\n}\n\nfunction resolveFieldMetadata(\n logicalName: string,\n field: {\n readonly apiName?: string;\n readonly label?: string;\n readonly displayName?: string;\n },\n metadataPolicy: ReturnType<typeof normalizeMetadataPolicy>\n): ResolvedMetadata | undefined {\n const displayName = getExplicitDisplayName(field);\n return resolveMetadata(\n {\n ...(field.apiName !== undefined && { apiName: field.apiName }),\n ...(displayName !== undefined && { displayName }),\n },\n getDeclarationMetadataPolicy(metadataPolicy, \"field\"),\n makeMetadataContext(\"chain-dsl\", \"field\", logicalName)\n );\n}\n","import type {\n EnumMemberDisplayNamePolicyInput,\n EnumMemberMetadataInferenceContext,\n MetadataAuthoringSurface,\n MetadataDeclarationKind,\n MetadataInferenceContext,\n MetadataPluralizationFn,\n MetadataPluralizationPolicyInput,\n MetadataPolicyInput,\n MetadataValuePolicyInput,\n NormalizedDeclarationMetadataPolicy,\n NormalizedEnumMemberDisplayNamePolicy,\n NormalizedEnumMemberMetadataPolicy,\n NormalizedMetadataPolicy,\n NormalizedMetadataPluralizationPolicy,\n NormalizedMetadataValuePolicy,\n} from \"@formspec/core/internals\";\nexport type {\n NormalizedDeclarationMetadataPolicy,\n NormalizedMetadataPolicy,\n} from \"@formspec/core/internals\";\n\nexport type MetadataResolutionContext = MetadataInferenceContext;\nexport type EnumMemberResolutionContext = EnumMemberMetadataInferenceContext;\n\nconst NOOP_INFLECT: MetadataPluralizationFn = () => \"\";\n\nfunction normalizePluralization(\n input: MetadataPluralizationPolicyInput | undefined\n): NormalizedMetadataPluralizationPolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: () => \"\",\n inflect: input.inflect,\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n inflect: NOOP_INFLECT,\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n inflect: NOOP_INFLECT,\n };\n}\n\nfunction normalizeScalarPolicy(\n input: MetadataValuePolicyInput | undefined\n): NormalizedMetadataValuePolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: input.infer,\n pluralization: normalizePluralization(input.pluralization),\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n pluralization: normalizePluralization(input.pluralization),\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n pluralization: normalizePluralization(input?.pluralization),\n };\n}\n\nfunction normalizeDeclarationPolicy(\n input: MetadataPolicyInput[MetadataDeclarationKind] | undefined\n): NormalizedDeclarationMetadataPolicy {\n return {\n apiName: normalizeScalarPolicy(input?.apiName),\n displayName: normalizeScalarPolicy(input?.displayName),\n };\n}\n\nfunction normalizeEnumMemberDisplayNamePolicy(\n input: EnumMemberDisplayNamePolicyInput | undefined\n): NormalizedEnumMemberDisplayNamePolicy {\n if (input?.mode === \"infer-if-missing\") {\n return {\n mode: \"infer-if-missing\",\n infer: input.infer,\n };\n }\n\n if (input?.mode === \"require-explicit\") {\n return {\n mode: \"require-explicit\",\n infer: () => \"\",\n };\n }\n\n return {\n mode: \"disabled\",\n infer: () => \"\",\n };\n}\n\nfunction normalizeEnumMemberPolicy(\n input: MetadataPolicyInput[\"enumMember\"] | undefined\n): NormalizedEnumMemberMetadataPolicy {\n return {\n displayName: normalizeEnumMemberDisplayNamePolicy(input?.displayName),\n };\n}\n\nexport function normalizeMetadataPolicy(input?: MetadataPolicyInput): NormalizedMetadataPolicy {\n return {\n type: normalizeDeclarationPolicy(input?.type),\n field: normalizeDeclarationPolicy(input?.field),\n method: normalizeDeclarationPolicy(input?.method),\n enumMember: normalizeEnumMemberPolicy(input?.enumMember),\n };\n}\n\nexport function getDeclarationMetadataPolicy(\n policy: NormalizedMetadataPolicy,\n declarationKind: MetadataDeclarationKind\n): NormalizedDeclarationMetadataPolicy {\n return policy[declarationKind];\n}\n\nexport function makeMetadataContext(\n surface: MetadataAuthoringSurface,\n declarationKind: MetadataDeclarationKind,\n logicalName: string,\n buildContext?: unknown\n): MetadataResolutionContext {\n return {\n surface,\n declarationKind,\n logicalName,\n ...(buildContext !== undefined && { buildContext }),\n };\n}\n","import type {\n EnumTypeNode,\n FieldNode,\n FormIR,\n FormIRElement,\n MetadataAuthoringSurface,\n ObjectProperty,\n ResolvedMetadata,\n ResolvedScalarMetadata,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport type {\n EnumMemberResolutionContext,\n MetadataResolutionContext,\n NormalizedDeclarationMetadataPolicy,\n NormalizedMetadataPolicy,\n} from \"./policy.js\";\n\ninterface ExplicitMetadataInput {\n readonly apiName?: string;\n readonly displayName?: string;\n readonly apiNamePlural?: string;\n readonly displayNamePlural?: string;\n}\n\ninterface ResolveFormIRMetadataOptions {\n readonly policy: NormalizedMetadataPolicy;\n readonly surface: MetadataAuthoringSurface;\n readonly buildContext?: unknown;\n readonly rootLogicalName?: string;\n readonly resolveRootTypeMetadata?: boolean;\n}\n\nfunction toExplicitScalar(value: string | undefined): ResolvedScalarMetadata | undefined {\n return value !== undefined && value.trim() !== \"\" ? { value, source: \"explicit\" } : undefined;\n}\n\nfunction toExplicitResolvedMetadata(\n explicit: ExplicitMetadataInput | undefined\n): ResolvedMetadata | undefined {\n if (explicit === undefined) {\n return undefined;\n }\n\n const apiName = toExplicitScalar(explicit.apiName);\n const displayName = toExplicitScalar(explicit.displayName);\n const apiNamePlural = toExplicitScalar(explicit.apiNamePlural);\n const displayNamePlural = toExplicitScalar(explicit.displayNamePlural);\n const metadata: ResolvedMetadata = {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction resolveScalar(\n current: ResolvedScalarMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy[\"apiName\"],\n context: MetadataResolutionContext,\n metadataLabel: \"apiName\" | \"displayName\"\n): ResolvedScalarMetadata | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit ${metadataLabel} for ${context.declarationKind} \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const inferredValue = policy.infer(context);\n return inferredValue.trim() !== \"\" ? { value: inferredValue, source: \"inferred\" } : undefined;\n}\n\nfunction resolvePlural(\n current: ResolvedScalarMetadata | undefined,\n singular: ResolvedScalarMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy[\"apiName\"][\"pluralization\"],\n context: MetadataResolutionContext,\n metadataLabel: \"apiNamePlural\" | \"displayNamePlural\"\n): ResolvedScalarMetadata | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit ${metadataLabel} for ${context.declarationKind} \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (singular === undefined || policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const pluralValue = policy.inflect({ ...context, singular: singular.value });\n return pluralValue.trim() !== \"\" ? { value: pluralValue, source: \"inferred\" } : undefined;\n}\n\nfunction resolveResolvedMetadata(\n current: ResolvedMetadata | undefined,\n policy: NormalizedDeclarationMetadataPolicy,\n context: MetadataResolutionContext\n): ResolvedMetadata | undefined {\n const apiName = resolveScalar(current?.apiName, policy.apiName, context, \"apiName\");\n const displayName = resolveScalar(\n current?.displayName,\n policy.displayName,\n context,\n \"displayName\"\n );\n const apiNamePlural = resolvePlural(\n current?.apiNamePlural,\n apiName,\n policy.apiName.pluralization,\n context,\n \"apiNamePlural\"\n );\n const displayNamePlural = resolvePlural(\n current?.displayNamePlural,\n displayName,\n policy.displayName.pluralization,\n context,\n \"displayNamePlural\"\n );\n\n if (\n apiName === undefined &&\n displayName === undefined &&\n apiNamePlural === undefined &&\n displayNamePlural === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n}\n\nfunction pickResolvedMetadataValue(\n baseValue: ResolvedScalarMetadata | undefined,\n overlayValue: ResolvedScalarMetadata | undefined\n): ResolvedScalarMetadata | undefined {\n if (overlayValue?.source === \"explicit\") {\n return overlayValue;\n }\n if (baseValue?.source === \"explicit\") {\n return baseValue;\n }\n return baseValue ?? overlayValue;\n}\n\nfunction resolveEnumMemberDisplayName(\n current: string | undefined,\n policy: NormalizedMetadataPolicy[\"enumMember\"][\"displayName\"],\n context: EnumMemberResolutionContext\n): string | undefined {\n if (current !== undefined) {\n return current;\n }\n\n if (policy.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit displayName for enum member \"${context.logicalName}\" on the ${context.surface} surface.`\n );\n }\n\n if (policy.mode !== \"infer-if-missing\") {\n return undefined;\n }\n\n const inferredValue = policy.infer(context).trim();\n return inferredValue !== \"\" ? inferredValue : undefined;\n}\n\nfunction resolveEnumTypeMetadata(\n type: EnumTypeNode,\n options: ResolveFormIRMetadataOptions\n): EnumTypeNode {\n const members = type.members.map((member) => {\n const displayName = resolveEnumMemberDisplayName(\n member.displayName,\n options.policy.enumMember.displayName,\n {\n surface: options.surface,\n logicalName: String(member.value),\n memberValue: member.value,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n }\n );\n\n if (displayName === member.displayName) {\n return member;\n }\n\n return displayName === undefined\n ? { value: member.value }\n : { value: member.value, displayName };\n });\n\n return members.some((member, index) => member !== type.members[index])\n ? { ...type, members }\n : type;\n}\n\nfunction resolveTypeNodeMetadata(type: TypeNode, options: ResolveFormIRMetadataOptions): TypeNode {\n switch (type.kind) {\n case \"array\":\n return {\n ...type,\n items: resolveTypeNodeMetadata(type.items, options),\n };\n\n case \"object\":\n return {\n ...type,\n properties: type.properties.map((property) =>\n resolveObjectPropertyMetadata(property, options)\n ),\n };\n\n case \"record\":\n return {\n ...type,\n valueType: resolveTypeNodeMetadata(type.valueType, options),\n };\n\n case \"union\":\n return {\n ...type,\n members: type.members.map((member) => resolveTypeNodeMetadata(member, options)),\n };\n\n case \"enum\":\n return resolveEnumTypeMetadata(type, options);\n\n case \"reference\":\n case \"primitive\":\n case \"dynamic\":\n case \"custom\":\n return type;\n\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\nfunction resolveObjectPropertyMetadata(\n property: ObjectProperty,\n options: ResolveFormIRMetadataOptions\n): ObjectProperty {\n const metadata = resolveResolvedMetadata(property.metadata, options.policy.field, {\n surface: options.surface,\n declarationKind: \"field\",\n logicalName: property.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...property,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(property.type, options),\n };\n}\n\nfunction resolveFieldMetadataNode(\n field: FieldNode,\n options: ResolveFormIRMetadataOptions\n): FieldNode {\n const metadata = resolveResolvedMetadata(field.metadata, options.policy.field, {\n surface: options.surface,\n declarationKind: \"field\",\n logicalName: field.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...field,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(field.type, options),\n };\n}\n\nfunction resolveFormElementMetadata(\n element: FormIRElement,\n options: ResolveFormIRMetadataOptions\n): FormIRElement {\n switch (element.kind) {\n case \"field\":\n return resolveFieldMetadataNode(element, options);\n\n case \"group\":\n return {\n ...element,\n elements: element.elements.map((child) => resolveFormElementMetadata(child, options)),\n };\n\n case \"conditional\":\n return {\n ...element,\n elements: element.elements.map((child) => resolveFormElementMetadata(child, options)),\n };\n\n default: {\n const _exhaustive: never = element;\n return _exhaustive;\n }\n }\n}\n\nfunction resolveTypeDefinitionMetadata(\n typeDefinition: TypeDefinition,\n options: ResolveFormIRMetadataOptions\n): TypeDefinition {\n const metadata = resolveResolvedMetadata(typeDefinition.metadata, options.policy.type, {\n surface: options.surface,\n declarationKind: \"type\",\n logicalName: typeDefinition.name,\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n return {\n ...typeDefinition,\n ...(metadata !== undefined && { metadata }),\n type: resolveTypeNodeMetadata(typeDefinition.type, options),\n };\n}\n\nexport function resolveMetadata(\n explicit: ExplicitMetadataInput | undefined,\n policy: NormalizedDeclarationMetadataPolicy,\n context: MetadataResolutionContext\n): ResolvedMetadata | undefined {\n return resolveResolvedMetadata(toExplicitResolvedMetadata(explicit), policy, context);\n}\n\nexport function mergeResolvedMetadata(\n baseMetadata: ResolvedMetadata | undefined,\n overlayMetadata: ResolvedMetadata | undefined\n): ResolvedMetadata | undefined {\n const apiName = pickResolvedMetadataValue(baseMetadata?.apiName, overlayMetadata?.apiName);\n const displayName = pickResolvedMetadataValue(\n baseMetadata?.displayName,\n overlayMetadata?.displayName\n );\n const apiNamePlural = pickResolvedMetadataValue(\n baseMetadata?.apiNamePlural,\n overlayMetadata?.apiNamePlural\n );\n const displayNamePlural = pickResolvedMetadataValue(\n baseMetadata?.displayNamePlural,\n overlayMetadata?.displayNamePlural\n );\n\n if (\n apiName === undefined &&\n displayName === undefined &&\n apiNamePlural === undefined &&\n displayNamePlural === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(apiName !== undefined && { apiName }),\n ...(displayName !== undefined && { displayName }),\n ...(apiNamePlural !== undefined && { apiNamePlural }),\n ...(displayNamePlural !== undefined && { displayNamePlural }),\n };\n}\n\nexport function getSerializedName(\n logicalName: string,\n metadata: ResolvedMetadata | undefined\n): string {\n return metadata?.apiName?.value ?? logicalName;\n}\n\nexport function getDisplayName(metadata: ResolvedMetadata | undefined): string | undefined {\n return metadata?.displayName?.value;\n}\n\nexport function resolveFormIRMetadata(ir: FormIR, options: ResolveFormIRMetadataOptions): FormIR {\n const metadata =\n options.resolveRootTypeMetadata === false\n ? ir.metadata\n : resolveResolvedMetadata(ir.metadata, options.policy.type, {\n surface: options.surface,\n declarationKind: \"type\",\n logicalName: options.rootLogicalName ?? ir.name ?? \"FormSpec\",\n ...(options.buildContext !== undefined && { buildContext: options.buildContext }),\n });\n\n return {\n ...ir,\n ...(metadata !== undefined && { metadata }),\n elements: ir.elements.map((element) => resolveFormElementMetadata(element, options)),\n typeRegistry: Object.fromEntries(\n Object.entries(ir.typeRegistry).map(([name, definition]) => [\n name,\n resolveTypeDefinitionMetadata(definition, options),\n ])\n ),\n };\n}\n","/**\n * TSDoc canonicalizer — assembles an {@link IRClassAnalysis} into a canonical\n * {@link FormIR}, applying layout metadata from `@Group` and `@ShowWhen`\n * TSDoc tags.\n *\n * The analysis functions in `class-analyzer.ts` produce `FieldNode[]`,\n * `fieldLayouts`, and `typeRegistry` directly. This canonicalizer uses\n * the layout metadata to wrap fields in `GroupLayoutNode` and\n * `ConditionalLayoutNode` elements.\n */\n\nimport type {\n FormIR,\n FormIRElement,\n FieldNode,\n GroupLayoutNode,\n ConditionalLayoutNode,\n Provenance,\n} from \"@formspec/core/internals\";\nimport { IR_VERSION } from \"@formspec/core/internals\";\nimport type { IRClassAnalysis, FieldLayoutMetadata } from \"../analyzer/class-analyzer.js\";\nimport { normalizeMetadataPolicy, resolveFormIRMetadata } from \"../metadata/index.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\n\n/**\n * Source-level metadata for provenance tracking.\n */\nexport interface TSDocSource {\n /** Absolute path to the source file. */\n readonly file: string;\n}\n\ninterface CanonicalizeTSDocOptions {\n readonly metadata?: MetadataPolicyInput;\n}\n\n/**\n * Wraps an {@link IRClassAnalysis} (from `analyzeClassToIR`,\n * `analyzeInterfaceToIR`, or `analyzeTypeAliasToIR`) into a canonical\n * {@link FormIR}.\n *\n * Fields with `@Group` TSDoc tags are grouped into `GroupLayoutNode` elements.\n * Fields with `@ShowWhen` TSDoc tags are wrapped in `ConditionalLayoutNode` elements.\n * When both are present, the conditional wraps the field inside the group.\n *\n * @param analysis - IR analysis result (fields are already FieldNode[])\n * @param source - Optional source file metadata for provenance\n * @returns The canonical FormIR\n */\nexport function canonicalizeTSDoc(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: CanonicalizeTSDocOptions\n): FormIR {\n const file = source?.file ?? \"\";\n\n const provenance: Provenance = {\n surface: \"tsdoc\",\n file,\n line: 1,\n column: 0,\n };\n\n const elements = assembleElements(analysis.fields, analysis.fieldLayouts, provenance);\n\n const ir: FormIR = {\n kind: \"form-ir\",\n name: analysis.name,\n irVersion: IR_VERSION,\n elements,\n ...(analysis.metadata !== undefined && { metadata: analysis.metadata }),\n typeRegistry: analysis.typeRegistry,\n ...(analysis.annotations !== undefined &&\n analysis.annotations.length > 0 && { rootAnnotations: analysis.annotations }),\n ...(analysis.annotations !== undefined &&\n analysis.annotations.length > 0 && { annotations: analysis.annotations }),\n provenance,\n };\n\n return resolveFormIRMetadata(ir, {\n policy: normalizeMetadataPolicy(options?.metadata),\n surface: \"tsdoc\",\n });\n}\n\n/**\n * Assembles flat fields and their layout metadata into a tree of\n * `FormIRElement[]` with groups and conditionals.\n *\n * Fields are processed in order. Consecutive fields with the same\n * `@Group` label are collected into a single `GroupLayoutNode`.\n * Fields with `@ShowWhen` are wrapped in `ConditionalLayoutNode`.\n */\nfunction assembleElements(\n fields: readonly FieldNode[],\n layouts: readonly FieldLayoutMetadata[],\n provenance: Provenance\n): readonly FormIRElement[] {\n const elements: FormIRElement[] = [];\n\n // Group consecutive fields with the same group label together.\n // We use an ordered map to preserve insertion order of groups.\n const groupMap = new Map<string, FormIRElement[]>();\n const topLevelOrder: (\n | { type: \"group\"; label: string }\n | { type: \"element\"; element: FormIRElement }\n )[] = [];\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const layout = layouts[i];\n if (!field || !layout) continue;\n\n // Wrap in conditional if @ShowWhen is present\n const element = wrapInConditional(field, layout, provenance);\n\n if (layout.groupLabel !== undefined) {\n const label = layout.groupLabel;\n let groupElements = groupMap.get(label);\n if (!groupElements) {\n groupElements = [];\n groupMap.set(label, groupElements);\n topLevelOrder.push({ type: \"group\", label });\n }\n groupElements.push(element);\n } else {\n topLevelOrder.push({ type: \"element\", element });\n }\n }\n\n // Assemble the final element array in order\n for (const entry of topLevelOrder) {\n if (entry.type === \"group\") {\n const groupElements = groupMap.get(entry.label);\n if (groupElements) {\n const groupNode: GroupLayoutNode = {\n kind: \"group\",\n label: entry.label,\n elements: groupElements,\n provenance,\n };\n elements.push(groupNode);\n // Clear so duplicate group labels in topLevelOrder don't re-emit\n groupMap.delete(entry.label);\n }\n } else {\n elements.push(entry.element);\n }\n }\n\n return elements;\n}\n\n/**\n * Wraps a field in a `ConditionalLayoutNode` if the layout has `showWhen` metadata.\n */\nfunction wrapInConditional(\n field: FieldNode,\n layout: FieldLayoutMetadata,\n provenance: Provenance\n): FormIRElement {\n if (layout.showWhen === undefined) {\n return field;\n }\n\n const conditional: ConditionalLayoutNode = {\n kind: \"conditional\",\n fieldName: layout.showWhen.field,\n value: layout.showWhen.value,\n elements: [field],\n provenance,\n };\n\n return conditional;\n}\n","import type {\n FieldNode,\n FormIR,\n FormIRElement,\n ObjectProperty,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport { getSerializedName } from \"./resolve.js\";\n\ninterface SerializedNameEntry {\n readonly logicalName: string;\n readonly serializedName: string;\n readonly category: \"field\" | \"object property\" | \"type definition\";\n}\n\nfunction assertUniqueSerializedNames(entries: readonly SerializedNameEntry[], scope: string): void {\n const seen = new Map<string, SerializedNameEntry>();\n\n for (const entry of entries) {\n const previous = seen.get(entry.serializedName);\n if (previous !== undefined) {\n if (previous.logicalName === entry.logicalName && previous.category === entry.category) {\n continue;\n }\n throw new Error(\n `Serialized name collision in ${scope}: ${previous.category} \"${previous.logicalName}\" and ${entry.category} \"${entry.logicalName}\" both resolve to \"${entry.serializedName}\".`\n );\n }\n seen.set(entry.serializedName, entry);\n }\n}\n\nfunction collectFlattenedFields(elements: readonly FormIRElement[]): FieldNode[] {\n const fields: FieldNode[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n fields.push(element);\n break;\n case \"group\":\n case \"conditional\":\n fields.push(...collectFlattenedFields(element.elements));\n break;\n default: {\n const exhaustive: never = element;\n void exhaustive;\n }\n }\n }\n\n return fields;\n}\n\nfunction validateObjectProperties(properties: readonly ObjectProperty[], scope: string): void {\n assertUniqueSerializedNames(\n properties.map((property) => ({\n logicalName: property.name,\n serializedName: getSerializedName(property.name, property.metadata),\n category: \"object property\" as const,\n })),\n scope\n );\n\n for (const property of properties) {\n validateTypeNode(\n property.type,\n `${scope}.${getSerializedName(property.name, property.metadata)}`\n );\n }\n}\n\nfunction validateTypeNode(type: TypeNode, scope: string): void {\n switch (type.kind) {\n case \"array\":\n validateTypeNode(type.items, `${scope}[]`);\n break;\n case \"object\":\n validateObjectProperties(type.properties, scope);\n break;\n case \"record\":\n validateTypeNode(type.valueType, `${scope}.*`);\n break;\n case \"union\":\n type.members.forEach((member, index) => {\n validateTypeNode(member, `${scope}|${String(index)}`);\n });\n break;\n case \"reference\":\n case \"primitive\":\n case \"enum\":\n case \"dynamic\":\n case \"custom\":\n break;\n default: {\n const exhaustive: never = type;\n void exhaustive;\n }\n }\n}\n\nfunction validateTypeDefinitions(typeRegistry: FormIR[\"typeRegistry\"]): void {\n const definitions = Object.values(typeRegistry);\n assertUniqueSerializedNames(\n definitions.map((definition) => ({\n logicalName: definition.name,\n serializedName: getSerializedName(definition.name, definition.metadata),\n category: \"type definition\" as const,\n })),\n \"$defs\"\n );\n\n for (const definition of definitions) {\n validateTypeDefinition(definition);\n }\n}\n\nfunction validateTypeDefinition(definition: TypeDefinition): void {\n validateTypeNode(\n definition.type,\n `type \"${getSerializedName(definition.name, definition.metadata)}\"`\n );\n}\n\nexport function assertNoSerializedNameCollisions(ir: FormIR): void {\n assertUniqueSerializedNames(\n collectFlattenedFields(ir.elements).map((field) => ({\n logicalName: field.name,\n serializedName: getSerializedName(field.name, field.metadata),\n category: \"field\" as const,\n })),\n \"form root\"\n );\n\n for (const field of collectFlattenedFields(ir.elements)) {\n validateTypeNode(field.type, `field \"${getSerializedName(field.name, field.metadata)}\"`);\n }\n\n validateTypeDefinitions(ir.typeRegistry);\n}\n","/**\n * JSON Schema 2020-12 generator that consumes the canonical FormIR.\n *\n * This generator is a pure function of the IR. It never consults the TypeScript\n * AST or surface syntax directly — only the IR (per the JSON Schema vocabulary spec §1.2).\n *\n * @see https://json-schema.org/draft/2020-12/schema\n * @see https://json-schema.org/draft/2020-12/schema\n */\n\nimport type {\n FormIR,\n FormIRElement,\n FieldNode,\n TypeNode,\n PrimitiveTypeNode,\n EnumTypeNode,\n ArrayTypeNode,\n ObjectTypeNode,\n RecordTypeNode,\n UnionTypeNode,\n ReferenceTypeNode,\n DynamicTypeNode,\n CustomTypeNode,\n ConstraintNode,\n AnnotationNode,\n ObjectProperty,\n} from \"@formspec/core/internals\";\nimport type { ResolvedMetadata } from \"@formspec/core\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport { getDisplayName, getSerializedName } from \"../metadata/index.js\";\nimport { assertNoSerializedNameCollisions } from \"../metadata/collision-guards.js\";\n\n// =============================================================================\n// OUTPUT TYPE\n// =============================================================================\n\n/**\n * A JSON Schema 2020-12 document, sub-schema, or keyword collection.\n *\n * This interface covers the subset of JSON Schema 2020-12 that this generator\n * emits, plus an index signature for custom `x-formspec-*` extension keywords.\n *\n * @public\n */\nexport interface JsonSchema2020 {\n /** Declared JSON Schema dialect URI for the document root. */\n $schema?: string;\n /** Reference to another schema location. */\n $ref?: string;\n /** Named reusable schema definitions keyed by definition name. */\n $defs?: Record<string, JsonSchema2020>;\n /** JSON Schema type keyword for the current node. */\n type?: string;\n /** Object properties keyed by property name. */\n properties?: Record<string, JsonSchema2020>;\n /** Property names that must be present on object values. */\n required?: string[];\n /** Item schema applied to array elements. */\n items?: JsonSchema2020;\n /** Whether, or how, additional object properties are allowed. */\n additionalProperties?: boolean | JsonSchema2020;\n /** Closed set of allowed scalar values. */\n enum?: readonly (string | number)[];\n /** Literal value the instance must equal. */\n const?: unknown;\n /** Schemas that must all validate successfully. */\n allOf?: readonly JsonSchema2020[];\n /** Schemas of which exactly one should validate successfully. */\n oneOf?: readonly JsonSchema2020[];\n /** Schemas of which at least one may validate successfully. */\n anyOf?: readonly JsonSchema2020[];\n // Constraints\n /** Inclusive numeric lower bound. */\n minimum?: number;\n /** Inclusive numeric upper bound. */\n maximum?: number;\n /** Exclusive numeric lower bound. */\n exclusiveMinimum?: number;\n /** Exclusive numeric upper bound. */\n exclusiveMaximum?: number;\n /** Required numeric step interval. */\n multipleOf?: number;\n /** Inclusive minimum string length. */\n minLength?: number;\n /** Inclusive maximum string length. */\n maxLength?: number;\n /** Inclusive minimum array length. */\n minItems?: number;\n /** Inclusive maximum array length. */\n maxItems?: number;\n /** Regular expression pattern applied to string values. */\n pattern?: string;\n /** Whether array elements must be unique. */\n uniqueItems?: boolean;\n /** Format hint for downstream validators and tooling. */\n format?: string;\n // Annotations\n /** Human-readable title for the schema node. */\n title?: string;\n /** Human-readable description for the schema node. */\n description?: string;\n /** Default value suggested for the schema node. */\n default?: unknown;\n /** Whether the schema node is deprecated. */\n deprecated?: boolean;\n // Extensions (open for vendor-prefixed keywords, e.g., x-formspec-*, x-stripe-*)\n // The vendor prefix is configurable (white-labelable).\n /** Additional vendor-prefixed extension keywords. */\n [key: `x-${string}`]: unknown;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\n/**\n * Mutable accumulator passed through the generation traversal.\n *\n * Using a context object rather than return-value threading keeps the\n * recursive generators simple and avoids repeated object spreading.\n */\ninterface GeneratorContext {\n /** Named type schemas collected during traversal, keyed by reference name. */\n readonly defs: Record<string, JsonSchema2020>;\n /** Logical type name to serialized `$defs` key. */\n readonly typeNameMap: Readonly<Record<string, string>>;\n /** Original type registry for reference lookups and property-name mapping. */\n readonly typeRegistry: Readonly<FormIR[\"typeRegistry\"]>;\n /** Optional extension registry for resolving custom IR nodes. */\n readonly extensionRegistry: ExtensionRegistry | undefined;\n /** Vendor prefix passed through to extension toJsonSchema handlers. */\n readonly vendorPrefix: string;\n /** Selected JSON Schema representation for enum-like values. */\n readonly enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\";\n}\n\n/**\n * Options for generating JSON Schema from a canonical FormIR.\n *\n * @internal\n */\nexport interface GenerateJsonSchemaFromIROptions {\n /**\n * Registry used to resolve custom types, constraints, and annotations.\n *\n * JSON Schema generation throws when custom IR nodes are present without a\n * matching registration in this registry.\n */\n readonly extensionRegistry?: ExtensionRegistry | undefined;\n /**\n * Vendor prefix passed to extension `toJsonSchema` hooks.\n * @defaultValue \"x-formspec\"\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n}\n\n/**\n * Normalizes enum serialization input so JavaScript callers still get a\n * runtime validation error for unsupported values.\n */\nfunction parseEnumSerialization(value: unknown): GeneratorContext[\"enumSerialization\"] {\n switch (value) {\n case undefined:\n case \"enum\":\n return \"enum\";\n case \"oneOf\":\n return \"oneOf\";\n case \"smart-size\":\n return \"smart-size\";\n default:\n throw new Error(\n `Invalid enumSerialization \"${String(value)}\". Expected \"enum\", \"oneOf\", or \"smart-size\".`\n );\n }\n}\n\nfunction makeContext(options?: GenerateJsonSchemaFromIROptions): GeneratorContext {\n const vendorPrefix = options?.vendorPrefix ?? \"x-formspec\";\n const enumSerialization = parseEnumSerialization(options?.enumSerialization);\n if (!vendorPrefix.startsWith(\"x-\")) {\n throw new Error(\n `Invalid vendorPrefix \"${vendorPrefix}\". Extension JSON Schema keywords must start with \"x-\".`\n );\n }\n\n return {\n defs: {},\n typeNameMap: {},\n typeRegistry: {},\n extensionRegistry: options?.extensionRegistry,\n vendorPrefix,\n enumSerialization,\n };\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Generates a JSON Schema 2020-12 object from a canonical FormIR.\n *\n * Groups and conditionals are flattened — they influence UI layout but do not\n * affect the data schema. All fields appear at the level they would occupy in\n * the output data.\n *\n * Named types in the `typeRegistry` are emitted as `$defs` entries and\n * referenced via `$ref` (per PP7 — high-fidelity output).\n *\n * @example\n * ```typescript\n * import { canonicalizeDSL } from \"./canonicalize/index.js\";\n * import { generateJsonSchemaFromIR } from \"./json-schema/ir-generator.js\";\n * import { formspec, field } from \"@formspec/dsl\";\n *\n * const form = formspec(\n * field.text(\"name\", { label: \"Name\", required: true }),\n * field.number(\"age\", { min: 0 }),\n * );\n * const ir = canonicalizeDSL(form);\n * const schema = generateJsonSchemaFromIR(ir);\n * // {\n * // $schema: \"https://json-schema.org/draft/2020-12/schema\",\n * // type: \"object\",\n * // properties: {\n * // name: { type: \"string\", title: \"Name\" },\n * // age: { type: \"number\", minimum: 0 }\n * // },\n * // required: [\"name\"]\n * // }\n * ```\n *\n * Advanced API — most consumers should use `generateJsonSchema()` or\n * `buildFormSchemas()`, which canonicalize form definitions automatically.\n * Callers of this function are responsible for providing pre-canonicalized IR.\n *\n * @param ir - The canonical FormIR produced by a canonicalizer\n * @returns A plain JSON-serializable JSON Schema 2020-12 object\n *\n * @internal\n */\nexport function generateJsonSchemaFromIR(\n ir: FormIR,\n options?: GenerateJsonSchemaFromIROptions\n): JsonSchema2020 {\n assertNoSerializedNameCollisions(ir);\n\n const ctx = {\n ...makeContext(options),\n typeRegistry: ir.typeRegistry,\n typeNameMap: Object.fromEntries(\n Object.entries(ir.typeRegistry).map(([name, typeDef]) => [\n name,\n getSerializedName(name, typeDef.metadata),\n ])\n ),\n };\n\n // Seed $defs from the type registry so referenced types are available even if\n // the field tree traversal never visits them (e.g., unreferenced types added\n // by a TSDoc canonicalizer pass).\n for (const [name, typeDef] of Object.entries(ir.typeRegistry)) {\n const schemaName = ctx.typeNameMap[name] ?? name;\n ctx.defs[schemaName] = generateTypeNode(typeDef.type, ctx);\n applyResolvedMetadata(ctx.defs[schemaName], typeDef.metadata);\n if (typeDef.constraints && typeDef.constraints.length > 0) {\n applyConstraints(ctx.defs[schemaName], typeDef.constraints, ctx);\n }\n if (typeDef.annotations && typeDef.annotations.length > 0) {\n applyAnnotations(ctx.defs[schemaName], typeDef.annotations, ctx, typeDef.type);\n }\n }\n\n const properties: Record<string, JsonSchema2020> = {};\n const required: string[] = [];\n\n collectFields(ir.elements, properties, required, ctx);\n\n // Deduplicate required (same field can appear across conditional branches).\n const uniqueRequired = [...new Set(required)];\n\n const result: JsonSchema2020 = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n type: \"object\",\n properties,\n ...(uniqueRequired.length > 0 && { required: uniqueRequired }),\n };\n applyResolvedMetadata(result, ir.metadata);\n\n if (ir.annotations && ir.annotations.length > 0) {\n applyAnnotations(result, ir.annotations, ctx);\n }\n\n if (Object.keys(ctx.defs).length > 0) {\n result.$defs = ctx.defs;\n }\n\n return result;\n}\n\n// =============================================================================\n// ELEMENT TRAVERSAL\n// =============================================================================\n\n/**\n * Recursively visits all IR elements, collecting field schemas and required names.\n *\n * Groups and conditionals are transparent to the schema — their children are\n * lifted to the enclosing level (per the JSON Schema vocabulary spec §1.2).\n */\nfunction collectFields(\n elements: readonly FormIRElement[],\n properties: Record<string, JsonSchema2020>,\n required: string[],\n ctx: GeneratorContext\n): void {\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n properties[getSerializedFieldName(element)] = generateFieldSchema(element, ctx);\n if (element.required) {\n required.push(getSerializedFieldName(element));\n }\n break;\n\n case \"group\":\n // Groups are UI-only; flatten children into the enclosing schema.\n collectFields(element.elements, properties, required, ctx);\n break;\n\n case \"conditional\":\n // Conditional visibility is UI-only; all fields remain in the schema.\n collectFields(element.elements, properties, required, ctx);\n break;\n\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n}\n\n// =============================================================================\n// FIELD SCHEMA GENERATION\n// =============================================================================\n\n/**\n * Generates the JSON Schema sub-schema for a single FieldNode.\n */\nfunction generateFieldSchema(field: FieldNode, ctx: GeneratorContext): JsonSchema2020 {\n const schema = generateTypeNode(field.type, ctx);\n const itemStringSchema =\n schema.type === \"array\" && schema.items?.type === \"string\" ? schema.items : undefined;\n\n // Partition constraints into direct (no path) and path-targeted.\n const directConstraints: ConstraintNode[] = [];\n const itemConstraints: ConstraintNode[] = [];\n const pathConstraints: ConstraintNode[] = [];\n for (const c of field.constraints) {\n if (c.path) {\n pathConstraints.push(c);\n } else if (itemStringSchema !== undefined && isStringItemConstraint(c)) {\n itemConstraints.push(c);\n } else {\n directConstraints.push(c);\n }\n }\n\n // Apply direct constraints. multipleOf:1 on a number type is a special case:\n // it promotes the type to \"integer\" and removes the multipleOf keyword.\n applyConstraints(schema, directConstraints, ctx);\n\n if (itemStringSchema !== undefined) {\n applyConstraints(itemStringSchema, itemConstraints, ctx);\n }\n\n // Apply annotations (title, description, default, deprecated, etc.).\n const rootAnnotations: AnnotationNode[] = [];\n const itemAnnotations: AnnotationNode[] = [];\n for (const annotation of field.annotations) {\n if (itemStringSchema !== undefined && annotation.annotationKind === \"format\") {\n itemAnnotations.push(annotation);\n } else {\n rootAnnotations.push(annotation);\n }\n }\n\n applyResolvedMetadata(schema, field.metadata);\n applyAnnotations(schema, rootAnnotations, ctx, field.type);\n if (itemStringSchema !== undefined) {\n applyAnnotations(itemStringSchema, itemAnnotations, ctx);\n }\n\n // If no path-targeted constraints, return as-is.\n if (pathConstraints.length === 0) {\n return schema;\n }\n\n return applyPathTargetedConstraints(schema, pathConstraints, ctx, field.type);\n}\n\n/**\n * Returns true if a constraint should be applied to the `items` schema of a\n * primitive `string[]` rather than the array itself.\n *\n * `@const` is intentionally excluded: arrays cannot carry primitive const\n * constraints in FormSpec, so `@const` on `string[]` remains a validation\n * error instead of targeting the item schema.\n */\nfunction isStringItemConstraint(constraint: ConstraintNode): boolean {\n switch (constraint.constraintKind) {\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Applies path-targeted constraints to a schema using JSON Schema 2020-12\n * sibling keywords wherever possible.\n *\n * For $ref schemas: merges property overrides as sibling keywords alongside\n * `$ref`. JSON Schema 2020-12 §10.2.1 allows keywords to appear next to\n * `$ref`; the draft-07 restriction that required `allOf` composition no\n * longer applies. Sibling emission preserves `$defs` deduplication and\n * produces leaner output downstream renderers can consume directly (#364).\n *\n * For inline object schemas: merges property overrides flat into\n * `properties`. Declaring the key in `properties` legitimizes it regardless\n * of `additionalProperties`, so no `allOf` wrapper is needed even when the\n * base is closed (#366, #382 Site 1).\n *\n * For already-composed `allOf` schemas: flatten to siblings when the\n * composition is expressible that way under 2020-12; otherwise append the\n * override as another `allOf` member (#382 Site 2).\n *\n * For array schemas: recurse into the `items` sub-schema.\n *\n * @see https://github.com/mike-north/formspec/issues/364\n * @see https://github.com/mike-north/formspec/issues/366\n * @see https://github.com/mike-north/formspec/issues/382\n * @see https://json-schema.org/draft/2020-12/json-schema-core — §10.2.1 sibling keywords\n */\nfunction applyPathTargetedConstraints(\n schema: JsonSchema2020,\n pathConstraints: readonly ConstraintNode[],\n ctx: GeneratorContext,\n typeNode?: TypeNode\n): JsonSchema2020 {\n // Array transparency: path-targeted constraints target the item type.\n if (schema.type === \"array\" && schema.items) {\n const referencedType =\n typeNode?.kind === \"reference\" ? resolveReferencedType(typeNode, ctx) : undefined;\n const nestedType =\n typeNode?.kind === \"array\"\n ? typeNode.items\n : referencedType?.kind === \"array\"\n ? referencedType.items\n : undefined;\n schema.items = applyPathTargetedConstraints(schema.items, pathConstraints, ctx, nestedType);\n return schema;\n }\n\n const propertyOverrides = buildPropertyOverrides(pathConstraints, typeNode, ctx);\n const nullableValueBranch = getNullableUnionValueSchema(schema);\n\n if (nullableValueBranch !== undefined) {\n const updatedNullableValueBranch = applyPathTargetedConstraints(\n nullableValueBranch,\n pathConstraints,\n ctx,\n resolveTraversableTypeNode(typeNode, ctx)\n );\n if (schema.oneOf !== undefined) {\n schema.oneOf = schema.oneOf.map((branch) =>\n branch === nullableValueBranch ? updatedNullableValueBranch : branch\n );\n }\n return schema;\n }\n\n // $ref schema: add property overrides as sibling keywords alongside $ref.\n // JSON Schema 2020-12 §10.2.1 explicitly permits sibling keywords next to\n // $ref, unlike draft-07 where $ref caused all siblings to be ignored. Using\n // sibling keywords avoids unnecessary allOf composition and preserves $defs\n // deduplication. (Fixes #364.)\n //\n // Invariant: upstream reference resolution produces `$ref` schemas that do\n // not carry their own `properties` key, so this spread-then-overwrite is\n // safe today. If that ever changes, the override must still win — merge\n // explicitly via `properties: { ...schema.properties, ...propertyOverrides }`.\n if (schema.$ref) {\n return {\n ...schema,\n properties: propertyOverrides,\n };\n }\n\n // Inline object schema: merge property overrides directly into siblings.\n //\n // Previously missing-property overrides were composed via `allOf` to keep\n // `additionalProperties` semantics intact. JSON Schema 2020-12 (§10.2.1)\n // lets us express this as a single flat object: merge the override into\n // `properties` (which legitimizes the key even under\n // `additionalProperties: false`) and preserve `additionalProperties`/`type`\n // as siblings. Downstream renderers that do not unwrap `allOf` can now see\n // the override. (Fixes #366 and #382 Site 1.)\n if (schema.type === \"object\" && schema.properties) {\n for (const [target, overrideSchema] of Object.entries(propertyOverrides)) {\n // Own-property lookup + defineProperty guard against prototype-pollution\n // vectors when a path target names a key like `__proto__`:\n // - Plain `obj[target] = value` assignment with target === \"__proto__\"\n // invokes the Object.prototype `__proto__` setter, replacing the\n // object's [[Prototype]] instead of adding an own property.\n // - `Object.defineProperty` bypasses the setter and writes an own\n // data property, so the override lands where we expect.\n // `Object.hasOwn` (not `in`) rejects inherited members like\n // `constructor`, avoiding a mis-merge into Object.prototype.constructor.\n if (Object.hasOwn(schema.properties, target)) {\n const existing = schema.properties[target];\n if (existing) {\n mergeSchemaOverride(existing, overrideSchema);\n continue;\n }\n }\n Object.defineProperty(schema.properties, target, {\n value: overrideSchema,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return schema;\n }\n\n // Pre-composed allOf base: flatten to siblings when the composition is\n // expressible that way under 2020-12; otherwise append as a new allOf\n // member. Expressible-as-siblings means the allOf has a single member whose\n // keys do not conflict with the override's keys (mirrors the $ref-sibling\n // fix in #365 above). (Fixes #382 Site 2.)\n if (schema.allOf) {\n const overrideMember: JsonSchema2020 = { properties: propertyOverrides };\n const flattened = tryFlattenAllOfToSiblings(schema, overrideMember);\n if (flattened !== undefined) {\n return flattened;\n }\n schema.allOf = [...schema.allOf, overrideMember];\n return schema;\n }\n\n // Fallback: for non-object/non-$ref schemas, path-targeted constraints do not\n // apply in a meaningful way. Return the original schema unchanged and rely\n // on validation diagnostics to surface misuse of path-based constraints.\n return schema;\n}\n\n// =============================================================================\n// TYPE NODE GENERATION\n// =============================================================================\n\n/**\n * Converts a TypeNode to a JSON Schema sub-schema.\n *\n * This function is intentionally exhaustive — all TypeNode variants are handled.\n * TypeScript's exhaustiveness check via the default branch ensures new variants\n * added to the IR are caught at compile time.\n */\nfunction generateTypeNode(type: TypeNode, ctx: GeneratorContext): JsonSchema2020 {\n switch (type.kind) {\n case \"primitive\":\n return generatePrimitiveType(type);\n\n case \"enum\":\n return generateEnumType(type, ctx);\n\n case \"array\":\n return generateArrayType(type, ctx);\n\n case \"object\":\n return generateObjectType(type, ctx);\n\n case \"record\":\n return generateRecordType(type, ctx);\n\n case \"union\":\n return generateUnionType(type, ctx);\n\n case \"reference\":\n return generateReferenceType(type, ctx);\n\n case \"dynamic\":\n return generateDynamicType(type);\n\n case \"custom\":\n return generateCustomType(type, ctx);\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Maps primitive IR types to JSON Schema type keywords.\n *\n * Note: `integer` is NOT a primitive kind in the IR. Integer semantics are\n * expressed via a `multipleOf: 1` constraint on a number type; `applyConstraints`\n * handles the promotion (per the JSON Schema vocabulary spec §2.1).\n */\nfunction generatePrimitiveType(type: PrimitiveTypeNode): JsonSchema2020 {\n return {\n type:\n type.primitiveKind === \"integer\" || type.primitiveKind === \"bigint\"\n ? \"integer\"\n : type.primitiveKind,\n };\n}\n\n/**\n * Generates JSON Schema for a static enum type.\n *\n * Enum emission is caller-configurable. The default `enum` mode keeps the\n * compact keyword and adds a complete vendor-prefixed display-name map when\n * any member label is available. The `oneOf` mode emits per-member `const`\n * entries, and includes `title` only when the member has an explicit\n * `@displayName` that differs from the value — omitting redundant titles\n * such as `{ \"const\": \"USD\", \"title\": \"USD\" }` (#310). `smart-size`\n * chooses `oneOf` only when any effective title differs from the serialized\n * enum value.\n */\nfunction generateEnumType(type: EnumTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n if (\n ctx.enumSerialization === \"oneOf\" ||\n (ctx.enumSerialization === \"smart-size\" && shouldSerializeEnumAsOneOf(type))\n ) {\n return {\n oneOf: type.members.map((m) => {\n const stringValue = String(m.value);\n const title =\n m.displayName !== undefined && m.displayName !== stringValue ? m.displayName : undefined;\n return title !== undefined ? { const: m.value, title } : { const: m.value };\n }),\n };\n }\n\n const schema: JsonSchema2020 = { enum: type.members.map((m) => m.value) };\n if (ctx.enumSerialization === \"smart-size\") {\n return schema;\n }\n\n const displayNames = buildEnumDisplayNameExtension(type);\n if (displayNames !== undefined) {\n // Emit either no extension at all or a complete map for every member.\n schema[`${ctx.vendorPrefix}-display-names` as `x-${string}`] = displayNames;\n }\n return schema;\n}\n\n/**\n * `smart-size` can stay compact when every visible title would only restate\n * the enum value. Any distinct title requires `oneOf` so that label survives.\n */\nfunction shouldSerializeEnumAsOneOf(type: EnumTypeNode): boolean {\n return type.members.some((member) => {\n const title = member.displayName ?? String(member.value);\n return title !== String(member.value);\n });\n}\n\nfunction buildEnumDisplayNameExtension(type: EnumTypeNode): Record<string, string> | undefined {\n if (!type.members.some((member) => member.displayName !== undefined)) {\n return undefined;\n }\n\n const displayNames: Record<string, string> = Object.create(null) as Record<string, string>;\n for (const member of type.members) {\n const key = String(member.value);\n if (Object.hasOwn(displayNames, key)) {\n throw new Error(\n `Enum display-name key \"${key}\" is ambiguous after stringification. ` +\n `Use oneOf serialization for mixed string/number enum values that collide.`\n );\n }\n displayNames[key] = member.displayName ?? key;\n }\n\n return displayNames;\n}\n\n/**\n * Generates JSON Schema for an array type.\n * Per 2020-12, `items` is a single schema (not an array); tuple types use\n * `prefixItems` + `items: false`.\n */\nfunction generateArrayType(type: ArrayTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return {\n type: \"array\",\n items: generateTypeNode(type.items, ctx),\n };\n}\n\n/**\n * Generates JSON Schema for an object type.\n *\n * `additionalProperties` is emitted only when the IR explicitly closes the\n * object. Ordinary static object types now canonicalize to\n * `additionalProperties: true`, which omits the keyword per spec 003 §2.5.\n */\nfunction generateObjectType(type: ObjectTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n const properties: Record<string, JsonSchema2020> = {};\n const required: string[] = [];\n\n for (const prop of type.properties) {\n const propertyName = getSerializedObjectPropertyName(prop);\n properties[propertyName] = generatePropertySchema(prop, ctx);\n if (!prop.optional) {\n required.push(propertyName);\n }\n }\n\n const schema: JsonSchema2020 = { type: \"object\", properties };\n\n if (required.length > 0) {\n schema.required = required;\n }\n\n if (!type.additionalProperties) {\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Generates JSON Schema for a record (dictionary) type per spec 003 §2.5.\n *\n * `Record<string, T>` and `{ [k: string]: T }` both emit:\n * `{ \"type\": \"object\", \"additionalProperties\": <T schema> }`\n *\n * No `properties` key is emitted — the record has no named properties.\n */\nfunction generateRecordType(type: RecordTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return {\n type: \"object\",\n additionalProperties: generateTypeNode(type.valueType, ctx),\n };\n}\n\n/**\n * Generates a schema for an ObjectProperty, applying its use-site constraints\n * and annotations (per the JSON Schema vocabulary spec §5.4 — inline allOf at use site).\n */\nfunction generatePropertySchema(prop: ObjectProperty, ctx: GeneratorContext): JsonSchema2020 {\n const schema = generateTypeNode(prop.type, ctx);\n applyConstraints(schema, prop.constraints, ctx);\n applyResolvedMetadata(schema, prop.metadata);\n applyAnnotations(schema, prop.annotations, ctx, prop.type);\n return schema;\n}\n\n/**\n * Generates JSON Schema for a union type.\n *\n * Union handling strategy (per spec 003):\n * - Boolean shorthand: `true | false` → `{ type: \"boolean\" }` (not oneOf/anyOf)\n * - Nullable unions: `T | null` → `{ \"oneOf\": [<T schema>, { \"type\": \"null\" }] }` (§2.3)\n * - All other unions → `anyOf` (members may overlap; discriminated union\n * detection is deferred to a future phase per design doc 003 §7.4)\n */\nfunction generateUnionType(type: UnionTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n // Boolean shorthand: union of true-literal and false-literal → type: \"boolean\"\n if (isBooleanUnion(type)) {\n return { type: \"boolean\" };\n }\n\n // Nullable union: `T | null` → oneOf per spec 003 §2.3.\n // A nullable union is any union where exactly one member is the null primitive.\n if (isNullableUnion(type)) {\n return {\n oneOf: type.members.map((m) => generateTypeNode(m, ctx)),\n };\n }\n\n // Default: anyOf for non-discriminated object unions (spec 003 §7.4).\n // Discriminated union detection (shared required property with distinct consts)\n // is deferred to a future phase.\n return {\n anyOf: type.members.map((m) => generateTypeNode(m, ctx)),\n };\n}\n\n/**\n * Returns true if the union is `true | false` (boolean shorthand).\n */\nfunction isBooleanUnion(type: UnionTypeNode): boolean {\n if (type.members.length !== 2) return false;\n const kinds = type.members.map((m) => m.kind);\n // Both must be primitives; check if both are \"boolean\" primitives.\n // The IR currently does not have a boolean literal node, so boolean union\n // is represented as two primitive boolean members.\n return (\n kinds.every((k) => k === \"primitive\") &&\n type.members.every((m) => m.kind === \"primitive\" && m.primitiveKind === \"boolean\")\n );\n}\n\n/**\n * Returns true if the union is a nullable wrapper union (`T | null` for any T).\n *\n * A nullable union is a two-member union where exactly one member is the `null`\n * primitive type and the other member is any non-null type.\n * Per spec 003 §2.3, nullable unions map to `oneOf` (not `anyOf`).\n */\nfunction isNullableUnion(type: UnionTypeNode): boolean {\n if (type.members.length !== 2) return false;\n const nullCount = type.members.filter(\n (m) => m.kind === \"primitive\" && m.primitiveKind === \"null\"\n ).length;\n return nullCount === 1;\n}\n\n/**\n * Generates JSON Schema for a reference type.\n *\n * The referenced type's schema is stored in `$defs` (seeded from the type\n * registry before traversal begins). The reference simply emits a `$ref`.\n */\nfunction generateReferenceType(type: ReferenceTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n return { $ref: `#/$defs/${getSerializedTypeName(type.name, ctx)}` };\n}\n\nfunction getSerializedFieldName(field: Pick<FieldNode, \"name\" | \"metadata\">): string {\n return getSerializedName(field.name, field.metadata);\n}\n\nfunction getSerializedObjectPropertyName(\n property: Pick<ObjectProperty, \"name\" | \"metadata\">\n): string {\n return getSerializedName(property.name, property.metadata);\n}\n\nfunction getSerializedTypeName(logicalName: string, ctx: GeneratorContext): string {\n return ctx.typeNameMap[logicalName] ?? logicalName;\n}\n\nfunction applyResolvedMetadata(\n schema: JsonSchema2020,\n metadata: ResolvedMetadata | undefined\n): void {\n const displayName = getDisplayName(metadata);\n if (displayName !== undefined) {\n schema.title = displayName;\n }\n}\n\nfunction resolveReferencedType(\n type: ReferenceTypeNode,\n ctx: GeneratorContext\n): TypeNode | undefined {\n return ctx.typeRegistry[type.name]?.type;\n}\n\nfunction dereferenceTypeNode(\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n if (typeNode?.kind !== \"reference\") {\n return typeNode;\n }\n\n return resolveReferencedType(typeNode, ctx);\n}\n\nfunction unwrapNullableTypeNode(typeNode: TypeNode | undefined): TypeNode | undefined {\n if (typeNode?.kind !== \"union\" || !isNullableUnion(typeNode)) {\n return typeNode;\n }\n\n return typeNode.members.find(\n (member) => !(member.kind === \"primitive\" && member.primitiveKind === \"null\")\n );\n}\n\nfunction resolveTraversableTypeNode(\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n const dereferenced = dereferenceTypeNode(typeNode, ctx);\n const unwrapped = unwrapNullableTypeNode(dereferenced);\n\n if (unwrapped !== dereferenced) {\n return resolveTraversableTypeNode(unwrapped, ctx);\n }\n\n return dereferenced;\n}\n\nfunction resolveSerializedPropertyName(\n logicalName: string,\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): string {\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n return resolveSerializedPropertyName(logicalName, effectiveType.items, ctx);\n }\n\n if (effectiveType?.kind === \"object\") {\n const property = effectiveType.properties.find((candidate) => candidate.name === logicalName);\n return property === undefined ? logicalName : getSerializedObjectPropertyName(property);\n }\n\n return logicalName;\n}\n\nfunction resolveTargetTypeNode(\n logicalName: string,\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): TypeNode | undefined {\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n return resolveTargetTypeNode(logicalName, effectiveType.items, ctx);\n }\n\n if (effectiveType?.kind !== \"object\") {\n return undefined;\n }\n\n return effectiveType.properties.find((candidate) => candidate.name === logicalName)?.type;\n}\n\nfunction buildPropertyOverrides(\n pathConstraints: readonly ConstraintNode[],\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): Record<string, JsonSchema2020> {\n const byTarget = new Map<string, ConstraintNode[]>();\n\n for (const constraint of pathConstraints) {\n const target = constraint.path?.segments[0];\n if (!target) {\n continue;\n }\n const grouped = byTarget.get(target) ?? [];\n grouped.push(constraint);\n byTarget.set(target, grouped);\n }\n\n // Null-prototype map so path-targeted keys like `__proto__` or `constructor`\n // become own properties rather than invoking Object.prototype setters or\n // matching inherited members. This is the upstream half of the\n // prototype-pollution hardening at Site 1 in `applyPathTargetedConstraints`:\n // without it, `overrides[\"__proto__\"] = ...` replaces this map's own\n // [[Prototype]] and `Object.entries(overrides)` yields `[]`, silently\n // dropping the constraint before the Site 1 guard can run.\n const overrides = Object.create(null) as Record<string, JsonSchema2020>;\n for (const [target, constraints] of byTarget) {\n const resolvedName = resolveSerializedPropertyName(target, typeNode, ctx);\n const schema = buildPathOverrideSchema(\n constraints.map(stripLeadingPathSegment),\n resolveTargetTypeNode(target, typeNode, ctx),\n ctx\n );\n Object.defineProperty(overrides, resolvedName, {\n value: schema,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n return overrides;\n}\n\nfunction buildPathOverrideSchema(\n constraints: readonly ConstraintNode[],\n typeNode: TypeNode | undefined,\n ctx: GeneratorContext\n): JsonSchema2020 {\n const schema: JsonSchema2020 = {};\n const directConstraints: ConstraintNode[] = [];\n const nestedConstraints: ConstraintNode[] = [];\n\n for (const constraint of constraints) {\n if (constraint.path === undefined || constraint.path.segments.length === 0) {\n directConstraints.push(constraint);\n } else {\n nestedConstraints.push(constraint);\n }\n }\n\n applyConstraints(schema, directConstraints, ctx);\n\n if (nestedConstraints.length === 0) {\n return schema;\n }\n\n const effectiveType = resolveTraversableTypeNode(typeNode, ctx);\n if (effectiveType?.kind === \"array\") {\n schema.items = buildPathOverrideSchema(nestedConstraints, effectiveType.items, ctx);\n return schema;\n }\n\n schema.properties = buildPropertyOverrides(nestedConstraints, effectiveType, ctx);\n return schema;\n}\n\n/**\n * Attempts to flatten a pre-composed `allOf` schema into sibling keywords\n * when the JSON Schema 2020-12 evaluation semantics allow it.\n *\n * Flattening is safe when the allOf has **exactly one** member and that\n * member's keys do not collide with either the outer schema's keys or the\n * new override member's keys. In that case we lift the single member's\n * keys up alongside the outer schema and attach the override as siblings —\n * producing `{ <outer keys...>, <member keys...>, <override keys...> }`.\n *\n * When flattening is not safe (multiple members, or key collisions that\n * would silently overwrite one contribution), returns `undefined` and the\n * caller falls back to appending an `allOf` member.\n *\n * The single-member restriction is a conservative scope choice, not a\n * JSON Schema 2020-12 semantic constraint. In-tree emission paths only\n * ever produce single-member `allOf` wrappers. Multi-member `allOf`\n * reaches this helper only from user-supplied `toJsonSchema` hooks,\n * where the multiple members typically represent intentional composition\n * that should not be silently flattened. Pairwise-disjoint N-member\n * flattening is semantically valid but is not performed today because\n * no current producer requires it.\n *\n * Mirrors the `$ref`-sibling fix at `ir-generator.ts:492-497` (issue #364).\n *\n * @see https://github.com/mike-north/formspec/issues/382 Site 2\n * @see https://json-schema.org/draft/2020-12/json-schema-core — §10.2.1 sibling keywords\n */\nfunction tryFlattenAllOfToSiblings(\n schema: JsonSchema2020,\n overrideMember: JsonSchema2020\n): JsonSchema2020 | undefined {\n if (schema.allOf?.length !== 1) {\n return undefined;\n }\n\n // Defensive-only; required under `noUncheckedIndexedAccess`.\n const [soleMember] = schema.allOf;\n if (soleMember === undefined) {\n return undefined;\n }\n\n // Outer schema sans allOf — what the siblings would sit next to.\n const { allOf: _allOf, ...outerRest } = schema;\n\n const outerKeys = new Set(Object.keys(outerRest));\n const memberKeys = new Set(Object.keys(soleMember));\n const overrideKeys = new Set(Object.keys(overrideMember));\n\n // Any overlap between the three contributions would silently overwrite\n // one side — keep `allOf` to preserve both under 2020-12 evaluation.\n for (const key of memberKeys) {\n if (outerKeys.has(key) || overrideKeys.has(key)) {\n return undefined;\n }\n }\n for (const key of overrideKeys) {\n if (outerKeys.has(key)) {\n return undefined;\n }\n }\n\n return {\n ...outerRest,\n ...soleMember,\n ...overrideMember,\n };\n}\n\nfunction mergeSchemaOverride(target: JsonSchema2020, override: JsonSchema2020): void {\n const nullableValueBranch = getNullableUnionValueSchema(target);\n if (nullableValueBranch !== undefined) {\n mergeSchemaOverride(nullableValueBranch, override);\n return;\n }\n\n if (override.properties !== undefined) {\n // Fresh maps use a null prototype so `__proto__`-named path segments can\n // land as own properties. Existing maps are preserved as-is — when they\n // came from `buildPropertyOverrides` they are already null-prototype; when\n // they came from an external `toJsonSchema` hook they are a plain object\n // whose own-property shape we do not modify.\n const mergedProperties =\n target.properties ?? (Object.create(null) as Record<string, JsonSchema2020>);\n for (const [name, propertyOverride] of Object.entries(override.properties)) {\n const existing = Object.hasOwn(mergedProperties, name) ? mergedProperties[name] : undefined;\n if (existing === undefined) {\n // `defineProperty` bypasses the `__proto__` setter on regular-prototype\n // maps; safe no-op on null-prototype maps. See the hardening comment\n // at Site 1 in `applyPathTargetedConstraints` for the full rationale.\n Object.defineProperty(mergedProperties, name, {\n value: propertyOverride,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n mergeSchemaOverride(existing, propertyOverride);\n }\n }\n target.properties = mergedProperties;\n }\n\n if (override.items !== undefined) {\n if (target.items === undefined) {\n target.items = override.items;\n } else {\n mergeSchemaOverride(target.items, override.items);\n }\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (key === \"properties\" || key === \"items\") {\n continue;\n }\n // `defineProperty` guards against the same prototype-pollution vector as\n // the nested-properties branch above, for completeness. Schema keywords\n // like `minimum`/`type` are never `__proto__`, but callers reach this\n // code path through recursion from path-targeted overrides where the\n // boundary is not locally enforceable.\n Object.defineProperty(target, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n}\n\nfunction stripLeadingPathSegment(constraint: ConstraintNode): ConstraintNode {\n const segments = constraint.path?.segments;\n if (segments === undefined || segments.length === 0) {\n return constraint;\n }\n\n const [, ...rest] = segments;\n if (rest.length === 0) {\n const { path: _path, ...stripped } = constraint;\n return stripped;\n }\n\n return {\n ...constraint,\n path: { segments: rest },\n };\n}\n\nfunction getNullableUnionValueSchema(schema: JsonSchema2020): JsonSchema2020 | undefined {\n if (schema.oneOf?.length !== 2) {\n return undefined;\n }\n\n const valueSchema = schema.oneOf.find((branch) => branch.type !== \"null\");\n const nullSchema = schema.oneOf.find((branch) => branch.type === \"null\");\n return valueSchema !== undefined && nullSchema !== undefined ? valueSchema : undefined;\n}\n\n/**\n * Generates JSON Schema for a dynamic type (runtime-resolved enum or schema).\n *\n * Dynamic enums emit `x-formspec-source` and optionally `x-formspec-params`.\n * Dynamic schemas emit `x-formspec-schemaSource` with `additionalProperties: true`\n * since the actual schema is determined at runtime (per the JSON Schema vocabulary spec §3.2).\n */\nfunction generateDynamicType(type: DynamicTypeNode): JsonSchema2020 {\n if (type.dynamicKind === \"enum\") {\n const schema: JsonSchema2020 = {\n type: \"string\",\n \"x-formspec-source\": type.sourceKey,\n };\n if (type.parameterFields.length > 0) {\n schema[\"x-formspec-params\"] = [...type.parameterFields];\n }\n return schema;\n }\n\n // dynamicKind === \"schema\"\n return {\n type: \"object\",\n additionalProperties: true,\n \"x-formspec-schemaSource\": type.sourceKey,\n };\n}\n\n// =============================================================================\n// CONSTRAINT APPLICATION\n// =============================================================================\n\n/**\n * Applies constraint nodes onto an existing JSON Schema object (mutates in place).\n *\n * All callers pass freshly-created objects so there is no aliasing risk.\n *\n * Special rule (per the JSON Schema vocabulary spec §2.1): `multipleOf: 1` on a `\"number\"` type\n * promotes to `\"integer\"` and suppresses the `multipleOf` keyword (integer is a\n * subtype of number; expressing it via multipleOf:1 is redundant).\n *\n * Path-targeted constraints are handled separately by `applyPathTargetedConstraints`.\n */\nfunction applyConstraints(\n schema: JsonSchema2020,\n constraints: readonly ConstraintNode[],\n ctx: GeneratorContext\n): void {\n for (const constraint of constraints) {\n switch (constraint.constraintKind) {\n case \"minimum\":\n schema.minimum = constraint.value;\n break;\n\n case \"maximum\":\n schema.maximum = constraint.value;\n break;\n\n case \"exclusiveMinimum\":\n schema.exclusiveMinimum = constraint.value;\n break;\n\n case \"exclusiveMaximum\":\n schema.exclusiveMaximum = constraint.value;\n break;\n\n case \"multipleOf\": {\n const { value } = constraint;\n if (value === 1 && schema.type === \"number\") {\n // Promote number → integer; omit the multipleOf keyword (redundant).\n schema.type = \"integer\";\n } else {\n schema.multipleOf = value;\n }\n break;\n }\n\n case \"minLength\":\n schema.minLength = constraint.value;\n break;\n\n case \"maxLength\":\n schema.maxLength = constraint.value;\n break;\n\n case \"minItems\":\n schema.minItems = constraint.value;\n break;\n\n case \"maxItems\":\n schema.maxItems = constraint.value;\n break;\n\n case \"pattern\":\n schema.pattern = constraint.pattern;\n break;\n\n case \"uniqueItems\":\n schema.uniqueItems = constraint.value;\n break;\n\n case \"const\":\n schema.const = constraint.value;\n break;\n\n case \"allowedMembers\":\n // EnumMemberConstraintNode — not yet emitted to JSON Schema (Phase 6 validation).\n break;\n\n case \"custom\":\n applyCustomConstraint(schema, constraint, ctx);\n break;\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = constraint;\n void _exhaustive;\n }\n }\n }\n}\n\n// =============================================================================\n// ANNOTATION APPLICATION\n// =============================================================================\n\n/**\n * Applies annotation nodes onto an existing JSON Schema object (mutates in place).\n *\n * Mapping per the JSON Schema vocabulary spec §2.8:\n * - `displayName` → `title`\n * - `description` → `description` (from summary text, spec 002 §2.3)\n * - `remarks` → `x-<vendor>-remarks` (from @remarks, spec 003 §3.2)\n * - `defaultValue` → `default`\n * - `deprecated` → `deprecated: true` (2020-12 standard annotation)\n * - `format` → `format`\n *\n * UI-only annotations (`placeholder`, `formatHint`) are silently ignored here —\n * they belong in the UI Schema, not the data schema.\n */\nfunction applyAnnotations(\n schema: JsonSchema2020,\n annotations: readonly AnnotationNode[],\n ctx: GeneratorContext,\n typeNode?: TypeNode\n): void {\n for (const annotation of annotations) {\n switch (annotation.annotationKind) {\n case \"displayName\":\n schema.title ??= annotation.value;\n break;\n\n case \"description\":\n schema.description = annotation.value;\n break;\n\n case \"remarks\":\n schema[`${ctx.vendorPrefix}-remarks` as `x-${string}`] = annotation.value;\n break;\n\n case \"defaultValue\":\n schema.default = coerceDefaultValue(annotation.value, typeNode, schema, ctx);\n break;\n\n case \"format\":\n schema.format = annotation.value;\n break;\n\n case \"deprecated\":\n schema.deprecated = true;\n if (annotation.message !== undefined && annotation.message !== \"\") {\n schema[`${ctx.vendorPrefix}-deprecation-description` as `x-${string}`] =\n annotation.message;\n }\n break;\n\n case \"placeholder\":\n // UI-only — belongs in UI Schema, not emitted here.\n break;\n\n case \"formatHint\":\n // UI-only — belongs in UI Schema, not emitted here.\n break;\n\n case \"custom\":\n applyCustomAnnotation(schema, annotation, ctx);\n break;\n\n default: {\n // TypeScript exhaustiveness guard.\n const _exhaustive: never = annotation;\n void _exhaustive;\n }\n }\n }\n}\n\n/**\n * Coerces a `@defaultValue` literal to match the serialized shape of the\n * field's type.\n *\n * `@defaultValue` arguments are parsed as JavaScript literals (numbers,\n * booleans, strings, etc.) by the TSDoc parser and injected into the emitted\n * JSON Schema as-is. For custom types whose `toJsonSchema` output differs in\n * runtime shape from the parsed literal (for example, `Decimal` maps to\n * `{ type: \"string\" }` but authors naturally write `@defaultValue 9.99`),\n * emitting the literal unchanged produces a schema where `default` is\n * inconsistent with `type` — the emitted `default` would fail validation\n * against the very schema declaring it (see GitHub issue #358).\n *\n * Coercion strategy:\n * 1. If the underlying type is a custom type with a `serializeDefault` hook,\n * delegate fully to the extension.\n * 2. Otherwise, fall back to best-effort inference based on the `type` keyword\n * on the already-emitted schema: when the emitted schema has\n * `type: \"string\"`, coerce primitive non-string literals currently handled\n * by this function (`number`, `boolean`, and `bigint`) to strings. Other\n * values are left unchanged unless the extension provides\n * `serializeDefault`.\n * 3. For non-custom types, pass the value through unchanged.\n */\nfunction coerceDefaultValue(\n value: unknown,\n typeNode: TypeNode | undefined,\n emittedSchema: JsonSchema2020,\n ctx: GeneratorContext\n): unknown {\n if (typeNode?.kind !== \"custom\") {\n return value;\n }\n const registration = ctx.extensionRegistry?.findType(typeNode.typeId);\n if (registration === undefined) {\n return value;\n }\n\n if (registration.serializeDefault !== undefined) {\n return registration.serializeDefault(value, typeNode.payload);\n }\n\n // Inference fallback: reuse the already-emitted schema from generateCustomType\n // rather than invoking `toJsonSchema` a second time — that call may be\n // expensive and is not required to be pure.\n const declaredType = (emittedSchema as Record<string, unknown>)[\"type\"];\n if (declaredType === \"string\" && typeof value !== \"string\") {\n // Coerce number/boolean/bigint literals into their string form so the\n // emitted `default` conforms to the custom type's JSON Schema `type`.\n // Non-finite numbers (NaN, Infinity, -Infinity) are not representable in\n // JSON Schema and would stringify to values like \"NaN\" that the author\n // almost certainly did not mean — pass them through unchanged and let\n // downstream validation surface the issue.\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n return value;\n }\n return String(value);\n }\n if (typeof value === \"boolean\") {\n return String(value);\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n }\n\n return value;\n}\n\nfunction generateCustomType(type: CustomTypeNode, ctx: GeneratorContext): JsonSchema2020 {\n const registration = ctx.extensionRegistry?.findType(type.typeId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom type \"${type.typeId}\" without a matching extension registration`\n );\n }\n\n // Trust boundary: extensions are responsible for returning valid JSON Schema.\n // Core only depends on Record<string, unknown> here, so we cast at the edge.\n return registration.toJsonSchema(type.payload, ctx.vendorPrefix) as JsonSchema2020;\n}\n\n/**\n * JSON Schema keywords that vocabulary-mode constraints (`emitsVocabularyKeywords`)\n * must not overwrite. Includes standard JSON Schema keywords (2020-12 and legacy):\n * structural (`type`, `properties`, `$ref`), annotation (`title`, `description`),\n * and validation (`minimum`, `maximum`, `minLength`, etc.).\n *\n * Integer types are now builtin (via `__integerBrand`), so standard numeric\n * constraints (`@minimum`, `@maximum`, etc.) are handled natively by the IR\n * pipeline — extensions never need to emit these keywords.\n */\nconst VOCABULARY_MODE_BLOCKED_KEYWORDS = new Set([\n \"$schema\",\n \"$ref\",\n \"$defs\",\n \"$id\",\n \"$anchor\",\n \"$dynamicRef\",\n \"$dynamicAnchor\",\n \"$vocabulary\",\n \"$comment\",\n \"type\",\n \"enum\",\n \"const\",\n \"properties\",\n \"patternProperties\",\n \"additionalProperties\",\n \"required\",\n \"items\",\n \"prefixItems\",\n \"additionalItems\",\n \"contains\",\n \"allOf\",\n \"oneOf\",\n \"anyOf\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n \"minimum\",\n \"maximum\",\n \"exclusiveMinimum\",\n \"exclusiveMaximum\",\n \"multipleOf\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"minItems\",\n \"maxItems\",\n \"uniqueItems\",\n \"minProperties\",\n \"maxProperties\",\n \"minContains\",\n \"maxContains\",\n \"format\",\n \"title\",\n \"description\",\n \"default\",\n \"deprecated\",\n \"readOnly\",\n \"writeOnly\",\n \"examples\",\n \"dependentRequired\",\n \"dependentSchemas\",\n \"propertyNames\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\",\n \"contentEncoding\",\n \"contentMediaType\",\n \"contentSchema\",\n]);\n\nfunction applyCustomConstraint(\n schema: JsonSchema2020,\n constraint: Extract<ConstraintNode, { constraintKind: \"custom\" }>,\n ctx: GeneratorContext\n): void {\n const registration = ctx.extensionRegistry?.findConstraint(constraint.constraintId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom constraint \"${constraint.constraintId}\" without a matching extension registration`\n );\n }\n\n const extensionSchema = registration.toJsonSchema(constraint.payload, ctx.vendorPrefix);\n\n if (registration.emitsVocabularyKeywords) {\n // Vocabulary-mode: assign keywords directly without prefix enforcement.\n // Guard against accidental collisions with standard JSON Schema keywords.\n const target = schema as Record<string, unknown>;\n for (const [key, value] of Object.entries(extensionSchema)) {\n if (VOCABULARY_MODE_BLOCKED_KEYWORDS.has(key)) {\n throw new Error(\n `Custom constraint \"${constraint.constraintId}\" with emitsVocabularyKeywords ` +\n `must not overwrite standard JSON Schema keyword \"${key}\"`\n );\n }\n target[key] = value;\n }\n } else {\n assignVendorPrefixedExtensionKeywords(\n schema,\n extensionSchema,\n ctx.vendorPrefix,\n `custom constraint \"${constraint.constraintId}\"`\n );\n }\n}\n\nfunction applyCustomAnnotation(\n schema: JsonSchema2020,\n annotation: Extract<AnnotationNode, { annotationKind: \"custom\" }>,\n ctx: GeneratorContext\n): void {\n const registration = ctx.extensionRegistry?.findAnnotation(annotation.annotationId);\n if (registration === undefined) {\n throw new Error(\n `Cannot generate JSON Schema for custom annotation \"${annotation.annotationId}\" without a matching extension registration`\n );\n }\n\n if (registration.toJsonSchema === undefined) {\n return;\n }\n\n assignVendorPrefixedExtensionKeywords(\n schema,\n registration.toJsonSchema(annotation.value, ctx.vendorPrefix),\n ctx.vendorPrefix,\n `custom annotation \"${annotation.annotationId}\"`\n );\n}\n\nfunction assignVendorPrefixedExtensionKeywords(\n schema: JsonSchema2020,\n extensionSchema: Record<string, unknown>,\n vendorPrefix: string,\n source: string\n): void {\n for (const [key, value] of Object.entries(extensionSchema)) {\n if (!key.startsWith(`${vendorPrefix}-`)) {\n throw new Error(\n `Cannot apply ${source}: extension hooks may only emit \"${vendorPrefix}-*\" JSON Schema keywords`\n );\n }\n schema[key as `x-${string}`] = value;\n }\n}\n","/**\n * JSON Forms UI Schema generator for FormSpec forms.\n *\n * Routes through the canonical IR pipeline: Chain DSL → FormIR → UI Schema.\n */\n\nimport type { FormElement, FormSpec, LoggerLike, MetadataPolicyInput } from \"@formspec/core\";\nimport { noopLogger } from \"@formspec/core\";\nimport { canonicalizeChainDSL } from \"../canonicalize/index.js\";\nimport { generateUiSchemaFromIR } from \"./ir-generator.js\";\nimport type { UISchema } from \"./types.js\";\n\n/**\n * Options for generating a UI Schema from a Chain DSL form.\n *\n * @public\n */\nexport interface GenerateUiSchemaOptions {\n /** Metadata resolution policy for chain DSL UI generation. */\n readonly metadata?: MetadataPolicyInput | undefined;\n /**\n * Optional logger for diagnostic output. Defaults to a no-op logger so\n * existing callers produce no output.\n */\n readonly logger?: LoggerLike | undefined;\n}\n\n/**\n * Generates a JSON Forms UI Schema from a FormSpec.\n *\n * All generation routes through the canonical IR. The chain DSL is first\n * canonicalized to a FormIR, then the IR-based generator produces the schema.\n *\n * @example\n * ```typescript\n * const form = formspec(\n * group(\"Customer\",\n * field.text(\"name\", { label: \"Name\" }),\n * ),\n * when(\"status\", \"draft\",\n * field.text(\"notes\", { label: \"Notes\" }),\n * ),\n * );\n *\n * const uiSchema = generateUiSchema(form);\n * // {\n * // type: \"VerticalLayout\",\n * // elements: [\n * // {\n * // type: \"Group\",\n * // label: \"Customer\",\n * // elements: [\n * // { type: \"Control\", scope: \"#/properties/name\", label: \"Name\" }\n * // ]\n * // },\n * // {\n * // type: \"Control\",\n * // scope: \"#/properties/notes\",\n * // label: \"Notes\",\n * // rule: {\n * // effect: \"SHOW\",\n * // condition: { scope: \"#/properties/status\", schema: { const: \"draft\" } }\n * // }\n * // }\n * // ]\n * // }\n * ```\n *\n * @param form - The FormSpec to convert\n * @returns A JSON Forms UI Schema\n *\n * @public\n */\nexport function generateUiSchema<E extends readonly FormElement[]>(\n form: FormSpec<E>,\n options?: GenerateUiSchemaOptions\n): UISchema {\n const logger = (options?.logger ?? noopLogger).child({ stage: \"ir\" });\n logger.debug(\"canonicalizing chain DSL to IR for UI Schema generation\");\n const ir = canonicalizeChainDSL(\n form,\n options?.metadata !== undefined ? { metadata: options.metadata } : undefined\n );\n const schemaLogger = (options?.logger ?? noopLogger).child({ stage: \"schema\" });\n schemaLogger.debug(\"generating UI Schema from IR\");\n return generateUiSchemaFromIR(ir);\n}\n","/**\n * Zod schemas for JSON Forms UI Schema.\n *\n * These schemas are the source of truth for UI Schema validation.\n * TypeScript types are derived from these schemas via `z.infer<>`.\n *\n * @see https://jsonforms.io/docs/uischema/\n */\n\nimport { z } from \"zod\";\nimport type { UISchema } from \"./types.js\";\n\n// =============================================================================\n// Primitive helpers\n// =============================================================================\n\n/** JSON Pointer string (e.g., \"#/properties/fieldName\") */\nconst jsonPointerSchema = z.string();\n\n// =============================================================================\n// Rule Effect and Element Type enums\n// =============================================================================\n\n/**\n * Zod schema for rule effect values.\n *\n * @internal\n */\nexport const ruleEffectSchema = z.enum([\"SHOW\", \"HIDE\", \"ENABLE\", \"DISABLE\"]);\n\n/**\n * Zod schema for UI Schema element type strings.\n *\n * @internal\n */\nexport const uiSchemaElementTypeSchema = z.enum([\n \"Control\",\n \"VerticalLayout\",\n \"HorizontalLayout\",\n \"Group\",\n \"Categorization\",\n \"Category\",\n \"Label\",\n]);\n\n// =============================================================================\n// Rule Condition Schema (recursive)\n// =============================================================================\n\n// Forward-declare the recursive TypeScript type.\n// We use an interface here (rather than z.infer<>) because the recursive\n// z.lazy() type annotation requires us to pre-declare the shape.\n/**\n * JSON Schema subset used in rule conditions.\n *\n * @internal\n */\ninterface RuleConditionSchema {\n const?: unknown;\n enum?: readonly unknown[];\n type?: string;\n not?: RuleConditionSchema;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minLength?: number;\n properties?: Record<string, RuleConditionSchema>;\n required?: string[];\n allOf?: RuleConditionSchema[];\n}\n\n/**\n * Zod schema for the rule-condition JSON Schema subset.\n *\n * @internal\n */\nexport const ruleConditionSchema: z.ZodType<RuleConditionSchema> = z.lazy(() =>\n z\n .object({\n const: z.unknown().optional(),\n enum: z.array(z.unknown()).readonly().optional(),\n type: z.string().optional(),\n not: ruleConditionSchema.optional(),\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n exclusiveMinimum: z.number().optional(),\n exclusiveMaximum: z.number().optional(),\n minLength: z.number().optional(),\n properties: z.record(z.string(), ruleConditionSchema).optional(),\n required: z.array(z.string()).optional(),\n allOf: z.array(ruleConditionSchema).optional(),\n })\n .strict()\n) as z.ZodType<RuleConditionSchema>;\n\n// =============================================================================\n// Schema-Based Condition and Rule\n// =============================================================================\n\n/**\n * Zod schema for a schema-based rule condition.\n *\n * @internal\n */\nexport const schemaBasedConditionSchema = z\n .object({\n scope: jsonPointerSchema,\n schema: ruleConditionSchema,\n })\n .strict();\n\n/**\n * Zod schema for a UI Schema rule.\n *\n * @internal\n */\nexport const ruleSchema = z\n .object({\n effect: ruleEffectSchema,\n condition: schemaBasedConditionSchema,\n })\n .strict();\n\n/**\n * Rule for conditional element visibility/enablement.\n *\n * @internal\n */\ntype Rule = z.infer<typeof ruleSchema>;\n\n// =============================================================================\n// UI Schema Element Schemas (recursive via z.lazy)\n// =============================================================================\n\n// Forward-declare UISchemaElement so layout schemas can reference it.\n// We declare the type up-front and wire the Zod schema below.\n/**\n * Union of all UI Schema element types.\n *\n * @internal\n */\ntype UISchemaElement =\n | ControlElement\n | VerticalLayout\n | HorizontalLayout\n | GroupLayout\n | Categorization\n | Category\n | LabelElement;\n\n// The Zod schema for UISchemaElement is defined as a const using z.lazy(),\n// which defers evaluation until first use. This allows all element schemas\n// below to be referenced even though they are declared after this line.\n/**\n * Zod schema for any UI Schema element.\n *\n * @internal\n */\nexport const uiSchemaElementSchema: z.ZodType<UISchemaElement> = z.lazy(() =>\n z.union([\n controlSchema,\n verticalLayoutSchema,\n horizontalLayoutSchema,\n groupLayoutSchema,\n categorizationSchema,\n categorySchema,\n labelElementSchema,\n ])\n) as z.ZodType<UISchemaElement>;\n\n// -----------------------------------------------------------------------------\n// Control\n// -----------------------------------------------------------------------------\n\n/**\n * Zod schema for a Control element.\n *\n * @internal\n */\nexport const controlSchema = z\n .object({\n type: z.literal(\"Control\"),\n scope: jsonPointerSchema,\n label: z.union([z.string(), z.literal(false)]).optional(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * A Control element that binds to a JSON Schema property.\n *\n * @internal\n */\ntype ControlElement = z.infer<typeof controlSchema>;\n\n// -----------------------------------------------------------------------------\n// VerticalLayout\n// -----------------------------------------------------------------------------\n\n// Pre-declare the interface so the Zod schema can reference UISchemaElement.\n/**\n * A vertical layout element.\n *\n * @internal\n */\ninterface VerticalLayout {\n type: \"VerticalLayout\";\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a vertical layout element.\n *\n * @internal\n */\nexport const verticalLayoutSchema: z.ZodType<VerticalLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"VerticalLayout\"),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// HorizontalLayout\n// -----------------------------------------------------------------------------\n\n/**\n * A horizontal layout element.\n *\n * @internal\n */\ninterface HorizontalLayout {\n type: \"HorizontalLayout\";\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a horizontal layout element.\n *\n * @internal\n */\nexport const horizontalLayoutSchema: z.ZodType<HorizontalLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"HorizontalLayout\"),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// GroupLayout\n// -----------------------------------------------------------------------------\n\n/**\n * A group element with a label.\n *\n * @internal\n */\ninterface GroupLayout {\n type: \"Group\";\n label: string;\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a group layout element.\n *\n * @internal\n */\nexport const groupLayoutSchema: z.ZodType<GroupLayout> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Group\"),\n label: z.string(),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// Category\n// -----------------------------------------------------------------------------\n\n/**\n * A Category element, used inside a Categorization layout.\n *\n * @internal\n */\ninterface Category {\n type: \"Category\";\n label: string;\n elements: UISchemaElement[];\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a category element.\n *\n * @internal\n */\nexport const categorySchema: z.ZodType<Category> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Category\"),\n label: z.string(),\n elements: z.array(uiSchemaElementSchema),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// Categorization\n// -----------------------------------------------------------------------------\n\n/**\n * A Categorization element (tab-based layout).\n *\n * @internal\n */\ninterface Categorization {\n type: \"Categorization\";\n elements: Category[];\n label?: string | undefined;\n rule?: Rule | undefined;\n options?: Record<string, unknown> | undefined;\n [k: string]: unknown;\n}\n\n/**\n * Zod schema for a categorization element.\n *\n * @internal\n */\nexport const categorizationSchema: z.ZodType<Categorization> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"Categorization\"),\n elements: z.array(categorySchema),\n label: z.string().optional(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n);\n\n// -----------------------------------------------------------------------------\n// LabelElement\n// -----------------------------------------------------------------------------\n\n/**\n * Zod schema for a Label element.\n *\n * @internal\n */\nexport const labelElementSchema = z\n .object({\n type: z.literal(\"Label\"),\n text: z.string(),\n rule: ruleSchema.optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * A Label element for displaying static text.\n *\n * @internal\n */\ntype LabelElement = z.infer<typeof labelElementSchema>;\n\n// =============================================================================\n// Root UISchema\n// =============================================================================\n\n/**\n * Zod schema for the root UI Schema (layout types only).\n *\n * @public\n */\nexport const uiSchema: z.ZodType<UISchema> = z.lazy(() =>\n z.union([verticalLayoutSchema, horizontalLayoutSchema, groupLayoutSchema, categorizationSchema])\n) as z.ZodType<UISchema>;\n","/**\n * JSON Forms UI Schema generator that operates on the canonical FormIR.\n *\n * This generator consumes the IR produced by the Canonicalize phase and\n * produces a JSON Forms UI Schema. All downstream UI Schema generation\n * should use this module for UI Schema generation.\n */\n\nimport type { FormIR, FormIRElement, FieldNode, GroupLayoutNode } from \"@formspec/core/internals\";\nimport { getDisplayName, getSerializedName } from \"../metadata/index.js\";\nimport { assertNoSerializedNameCollisions } from \"../metadata/collision-guards.js\";\nimport type {\n UISchema,\n UISchemaElement,\n ControlElement,\n GroupLayout,\n Rule,\n RuleConditionSchema,\n} from \"./types.js\";\nimport { uiSchema as uiSchemaValidator } from \"./schema.js\";\nimport { z } from \"zod\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Parses a value through a Zod schema, converting validation errors to a\n * descriptive Error.\n */\nfunction parseOrThrow<T>(schema: z.ZodType<T>, value: unknown, label: string): T {\n try {\n return schema.parse(value);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(\n `Generated ${label} failed validation:\\n${error.issues.map((i) => ` ${i.path.join(\".\")}: ${i.message}`).join(\"\\n\")}`\n );\n }\n throw error;\n }\n}\n\n/**\n * Converts a field name to a JSON Pointer scope string.\n */\nfunction fieldToScope(fieldName: string): string {\n return `#/properties/${fieldName}`;\n}\n\n/**\n * Creates a SHOW rule for a single conditional field/value pair.\n */\nfunction createShowRule(fieldName: string, value: unknown): Rule {\n return {\n effect: \"SHOW\",\n condition: {\n scope: fieldToScope(fieldName),\n schema: { const: value },\n },\n };\n}\n\n/**\n * Combines two SHOW rules into a single rule using an allOf condition.\n *\n * When elements are nested inside multiple conditionals, all parent conditions\n * must be met for the element to be visible. This function flattens both\n * conditions into a single rule using a top-level allOf so JSON Forms evaluates\n * every predicate simultaneously without nesting rule fragments.\n */\nfunction flattenConditionSchema(scope: string, schema: RuleConditionSchema): RuleConditionSchema[] {\n if (schema.allOf === undefined) {\n if (scope === \"#\") {\n return [schema];\n }\n\n const fieldName = scope.replace(\"#/properties/\", \"\");\n return [\n {\n properties: {\n [fieldName]: schema,\n },\n },\n ];\n }\n\n return schema.allOf.flatMap((member) => flattenConditionSchema(scope, member));\n}\n\nfunction combineRules(parentRule: Rule, childRule: Rule): Rule {\n return {\n effect: \"SHOW\",\n condition: {\n scope: \"#\",\n schema: {\n allOf: [\n ...flattenConditionSchema(parentRule.condition.scope, parentRule.condition.schema),\n ...flattenConditionSchema(childRule.condition.scope, childRule.condition.schema),\n ],\n },\n },\n };\n}\n\nfunction getFieldDisplayName(field: FieldNode): string | undefined {\n const resolvedDisplayName = getDisplayName(field.metadata);\n if (resolvedDisplayName !== undefined) {\n return resolvedDisplayName;\n }\n\n return field.annotations.find((annotation) => annotation.annotationKind === \"displayName\")?.value;\n}\n\n// =============================================================================\n// ELEMENT CONVERSION\n// =============================================================================\n\n/**\n * Converts a FieldNode from the IR to a ControlElement.\n *\n * The label prefers resolved metadata, with annotation fallback for callers\n * that still construct IR without the metadata resolver pass.\n */\nfunction fieldNodeToControl(\n field: FieldNode,\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): ControlElement {\n const placeholderAnnotation = field.annotations.find((a) => a.annotationKind === \"placeholder\");\n const serializedName =\n fieldNameMap.get(field.name) ?? getSerializedName(field.name, field.metadata);\n const displayName = getFieldDisplayName(field);\n\n const control: ControlElement = {\n type: \"Control\",\n scope: fieldToScope(serializedName),\n ...(displayName !== undefined && { label: displayName }),\n ...(placeholderAnnotation !== undefined && {\n options: { placeholder: placeholderAnnotation.value },\n }),\n ...(parentRule !== undefined && { rule: parentRule }),\n };\n\n return control;\n}\n\n/**\n * Converts a GroupLayoutNode from the IR to a GroupLayout element.\n *\n * The group's children are recursively converted; the optional parent rule is\n * forwarded to nested elements so that a group inside a conditional inherits\n * the visibility rule.\n */\nfunction groupNodeToLayout(\n group: GroupLayoutNode,\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): GroupLayout {\n return {\n type: \"Group\",\n label: group.label,\n elements: irElementsToUiSchema(group.elements, fieldNameMap, parentRule),\n ...(parentRule !== undefined && { rule: parentRule }),\n };\n}\n\n/**\n * Converts an array of IR elements to UI Schema elements.\n *\n * @param elements - The IR elements to convert\n * @param parentRule - Optional rule inherited from a parent ConditionalLayoutNode\n * @returns Array of UI Schema elements\n */\nfunction irElementsToUiSchema(\n elements: readonly FormIRElement[],\n fieldNameMap: ReadonlyMap<string, string>,\n parentRule?: Rule\n): UISchemaElement[] {\n const result: UISchemaElement[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\": {\n result.push(fieldNodeToControl(element, fieldNameMap, parentRule));\n break;\n }\n\n case \"group\": {\n result.push(groupNodeToLayout(element, fieldNameMap, parentRule));\n break;\n }\n\n case \"conditional\": {\n // Build the rule for this conditional level.\n const newRule = createShowRule(\n fieldNameMap.get(element.fieldName) ?? element.fieldName,\n element.value\n );\n // Combine with the inherited parent rule for nested conditionals.\n const combinedRule = parentRule !== undefined ? combineRules(parentRule, newRule) : newRule;\n // Children are flattened into the parent container with the combined\n // rule attached.\n const childElements = irElementsToUiSchema(element.elements, fieldNameMap, combinedRule);\n result.push(...childElements);\n break;\n }\n\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n throw new Error(\"Unhandled IR element kind\");\n }\n }\n }\n\n return result;\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Generates a JSON Forms UI Schema from a canonical `FormIR`.\n *\n * Mapping rules:\n * - `FieldNode` → `ControlElement` with `scope: \"#/properties/<name>\"`\n * - resolved `displayName` metadata → `label` on the `ControlElement`\n * - `displayName` annotation → fallback `label` when metadata is absent\n * - `GroupLayoutNode` → `GroupLayout` with recursively converted `elements`\n * - `ConditionalLayoutNode` → children flattened with a `SHOW` rule\n * - Nested conditionals → combined `allOf` rule\n * - Root wrapper is always `{ type: \"VerticalLayout\", elements: [...] }`\n *\n * @example\n * ```typescript\n * const ir = canonicalizeDSL(\n * formspec(\n * group(\"Customer\", field.text(\"name\", { label: \"Name\" })),\n * when(is(\"status\", \"draft\"), field.text(\"notes\", { label: \"Notes\" })),\n * )\n * );\n *\n * const uiSchema = generateUiSchemaFromIR(ir);\n * // {\n * // type: \"VerticalLayout\",\n * // elements: [\n * // {\n * // type: \"Group\",\n * // label: \"Customer\",\n * // elements: [{ type: \"Control\", scope: \"#/properties/name\", label: \"Name\" }]\n * // },\n * // {\n * // type: \"Control\",\n * // scope: \"#/properties/notes\",\n * // label: \"Notes\",\n * // rule: { effect: \"SHOW\", condition: { scope: \"#/properties/status\", schema: { const: \"draft\" } } }\n * // }\n * // ]\n * // }\n * ```\n *\n * @param ir - The canonical FormIR produced by the Canonicalize phase\n * @returns A validated JSON Forms UI Schema\n */\nexport function generateUiSchemaFromIR(ir: FormIR): UISchema {\n assertNoSerializedNameCollisions(ir);\n const fieldNameMap = collectFieldNameMap(ir.elements);\n const result: UISchema = {\n type: \"VerticalLayout\",\n elements: irElementsToUiSchema(ir.elements, fieldNameMap),\n };\n\n return parseOrThrow(uiSchemaValidator, result, \"UI Schema\");\n}\n\nfunction collectFieldNameMap(elements: readonly FormIRElement[]): ReadonlyMap<string, string> {\n const map = new Map<string, string>();\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n map.set(element.name, getSerializedName(element.name, element.metadata));\n break;\n case \"group\":\n case \"conditional\":\n for (const [key, value] of collectFieldNameMap(element.elements)) {\n map.set(key, value);\n }\n break;\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n\n return map;\n}\n","/**\n * Extension registry for resolving custom types, constraints, and annotations\n * during JSON Schema generation and IR validation.\n *\n * The registry is created from a list of {@link ExtensionDefinition} objects\n * and provides O(1) lookup by fully-qualified ID (extensionId + \"/\" + name).\n *\n * @packageDocumentation\n */\n\nimport type * as ts from \"typescript\";\nimport type {\n ExtensionDefinition,\n CustomTypeRegistration,\n CustomConstraintRegistration,\n CustomAnnotationRegistration,\n ConstraintTagRegistration,\n BuiltinConstraintBroadeningRegistration,\n} from \"@formspec/core/internals\";\nimport {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n} from \"@formspec/core/internals\";\nimport {\n getTagDefinition,\n normalizeFormSpecTagName,\n getRegistryLogger,\n _validateExtensionSetup,\n logSetupDiagnostics,\n type ExtensionTagSource,\n type SetupDiagnostic,\n} from \"@formspec/analysis/internal\";\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * The result of a successful extension type lookup.\n *\n * Returned by {@link ExtensionRegistry.findTypeByName},\n * {@link ExtensionRegistry.findTypeByBrand}, and\n * {@link ExtensionRegistry.findTypeBySymbol}.\n *\n * @public\n */\nexport interface ExtensionTypeLookupResult {\n /** The fully-qualified extension ID (e.g., \"x-stripe/monetary\"). */\n readonly extensionId: string;\n /** The custom type registration matched by this lookup. */\n readonly registration: CustomTypeRegistration;\n}\n\n/**\n * A registry of extensions that provides lookup by fully-qualified ID.\n *\n * Type IDs follow the format: `<extensionId>/<typeName>`\n * Constraint IDs follow the format: `<extensionId>/<constraintName>`\n * Annotation IDs follow the format: `<extensionId>/<annotationName>`\n *\n * @public\n */\nexport interface ExtensionRegistry {\n /** The extensions registered in this registry (in registration order). */\n readonly extensions: readonly ExtensionDefinition[];\n\n /**\n * Setup diagnostics detected during registry construction.\n *\n * These diagnostics represent configuration errors in the extension\n * registrations — e.g. unsupported TypeScript built-in type overrides,\n * invalid type-name identifiers, or duplicate registrations. They are\n * computed ONCE at `createExtensionRegistry` call time (§4 Phase 4 Slice C)\n * and carried on the registry so consumers can emit them without re-running\n * the validation on every analysis call.\n *\n * Consumers should check this array at the start of each analysis pass and\n * short-circuit if it is non-empty — the registry is unusable for\n * constraint-type validation when setup diagnostics are present.\n *\n * @internal\n */\n readonly setupDiagnostics: readonly SetupDiagnostic[];\n\n /**\n * Look up a custom type registration by its fully-qualified type ID.\n *\n * @param typeId - The fully-qualified type ID (e.g., \"x-stripe/monetary/Decimal\").\n * @returns The registration if found, otherwise `undefined`.\n */\n findType(typeId: string): CustomTypeRegistration | undefined;\n /**\n * Look up a custom type registration by a TypeScript-facing type name.\n *\n * This is used during TSDoc/class analysis to resolve extension-defined\n * custom types from source-level declarations.\n */\n findTypeByName(typeName: string): ExtensionTypeLookupResult | undefined;\n /**\n * Look up a custom type registration by a brand identifier.\n *\n * This is used during class analysis to resolve extension-defined custom types\n * via structural brand detection (`unique symbol` computed property keys).\n * Brand identifiers are stored as plain strings, so they must be unique\n * across all extensions loaded into the registry.\n *\n * @param brand - The identifier text of the `unique symbol` brand variable.\n */\n findTypeByBrand(brand: string): ExtensionTypeLookupResult | undefined;\n\n /**\n * Look up a custom type by its TypeScript symbol identity.\n *\n * Built from `defineCustomType<T>()` type parameter extraction in the config file.\n * This is the most precise detection path — it uses `ts.Symbol` identity, which is\n * immune to import aliases and name collisions.\n *\n * Returns `undefined` until {@link MutableExtensionRegistry.setSymbolMap} has been\n * called (i.e., before the TypeScript program is available), or when the symbol is\n * not registered via a type parameter.\n *\n * @param symbol - The canonical TypeScript symbol to look up.\n */\n findTypeBySymbol(symbol: ts.Symbol): ExtensionTypeLookupResult | undefined;\n\n /**\n * Look up a custom constraint registration by its fully-qualified constraint ID.\n *\n * @param constraintId - The fully-qualified constraint ID.\n * @returns The registration if found, otherwise `undefined`.\n */\n findConstraint(constraintId: string): CustomConstraintRegistration | undefined;\n /**\n * Look up a TSDoc custom constraint-tag registration by tag name.\n */\n findConstraintTag(tagName: string):\n | {\n readonly extensionId: string;\n readonly registration: ConstraintTagRegistration;\n }\n | undefined;\n /**\n * Look up built-in tag broadening for a given custom type ID.\n */\n findBuiltinConstraintBroadening(\n typeId: string,\n tagName: string\n ):\n | {\n readonly extensionId: string;\n readonly registration: BuiltinConstraintBroadeningRegistration;\n }\n | undefined;\n\n /**\n * Look up a custom annotation registration by its fully-qualified annotation ID.\n *\n * @param annotationId - The fully-qualified annotation ID.\n * @returns The registration if found, otherwise `undefined`.\n */\n findAnnotation(annotationId: string): CustomAnnotationRegistration | undefined;\n}\n\n/**\n * Mutable extension registry used internally by the build pipeline.\n *\n * Extends {@link ExtensionRegistry} with `setSymbolMap`, which must be called\n * after the TypeScript program is created. Consumer code should accept only\n * the read-only {@link ExtensionRegistry} interface.\n *\n * @public\n */\nexport interface MutableExtensionRegistry extends ExtensionRegistry {\n /**\n * Sets the symbol map built from config AST analysis.\n *\n * Called after the TypeScript program is created and the config file is analyzed.\n * Prior to this call, {@link ExtensionRegistry.findTypeBySymbol} always returns\n * `undefined`.\n *\n * @param map - A map from canonical `ts.Symbol` to the matching registry entry.\n */\n setSymbolMap(map: Map<ts.Symbol, ExtensionTypeLookupResult>): void;\n}\n\n// =============================================================================\n// IMPLEMENTATION\n// =============================================================================\n\nconst BUILTIN_METADATA_TAGS = new Set([\"apiName\", \"displayName\"]);\n\nfunction buildConstraintTagSources(\n extensions: readonly ExtensionDefinition[]\n): readonly ExtensionTagSource[] {\n return extensions.map((extension) => ({\n extensionId: extension.extensionId,\n ...(extension.constraintTags !== undefined\n ? {\n constraintTags: extension.constraintTags.map((tag) => ({\n tagName: normalizeFormSpecTagName(tag.tagName),\n })),\n }\n : {}),\n // Include customTypes so _validateExtensionSetup can check tsTypeNames for\n // unsupported built-in overrides and invalid identifier patterns.\n ...(extension.types !== undefined\n ? {\n customTypes: extension.types.map((type) => ({\n // tsTypeNames: deprecated in favour of symbol-based detection, but\n // still required for name-based validation in _validateExtensionSetup\n // until the bridge is fully retired (see §synthetic-checker-retirement §4C).\n tsTypeNames: type.tsTypeNames ?? [type.typeName],\n })),\n }\n : {}),\n }));\n}\n\n/**\n * Creates an extension registry from a list of extension definitions.\n *\n * The registry indexes all types, constraints, and annotations by their\n * fully-qualified IDs (`<extensionId>/<name>`) for O(1) lookup during\n * generation and validation.\n *\n * @param extensions - The extension definitions to register.\n * @returns An {@link ExtensionRegistry} instance.\n * @throws If duplicate type/constraint/annotation IDs are detected across extensions.\n *\n * @public\n */\nexport function createExtensionRegistry(\n extensions: readonly ExtensionDefinition[]\n): MutableExtensionRegistry {\n // §8.3c — log registry construction at debug so setup-diagnostic emission is\n // observable across repeated calls (e.g. snapshot-driven consumers per §9 #19).\n const registryLog = getRegistryLogger();\n registryLog.debug(\"createExtensionRegistry: constructing\", {\n extensionCount: extensions.length,\n extensionIds: extensions.map((e) => e.extensionId),\n });\n\n // §4 Phase 4 Slice C — validate extension type-name registrations ONCE at\n // construction time. Consumers pull `registry.setupDiagnostics` at the start\n // of each analysis pass instead of re-running validation per synthetic batch.\n const extensionTagSources = buildConstraintTagSources(extensions);\n const setupDiagnostics = _validateExtensionSetup(extensionTagSources);\n logSetupDiagnostics(registryLog, {\n diagnosticCount: setupDiagnostics.length,\n codes: setupDiagnostics.map((d) => d.kind),\n });\n\n // extensionTagSources is already computed above for _validateExtensionSetup;\n // reuse it here to avoid a second pass over the extensions array.\n const reservedTagSources = extensionTagSources;\n let symbolMap = new Map<ts.Symbol, ExtensionTypeLookupResult>();\n const typeMap = new Map<string, CustomTypeRegistration>();\n const typeNameMap = new Map<string, ExtensionTypeLookupResult>();\n const brandMap = new Map<string, ExtensionTypeLookupResult>();\n const constraintMap = new Map<string, CustomConstraintRegistration>();\n const constraintTagMap = new Map<\n string,\n { readonly extensionId: string; readonly registration: ConstraintTagRegistration }\n >();\n const builtinBroadeningMap = new Map<\n string,\n { readonly extensionId: string; readonly registration: BuiltinConstraintBroadeningRegistration }\n >();\n const annotationMap = new Map<string, CustomAnnotationRegistration>();\n const metadataSlotMap = new Map<string, true>();\n const metadataTagMap = new Map<string, true>();\n\n for (const ext of extensions) {\n if (ext.types !== undefined) {\n for (const type of ext.types) {\n const qualifiedId = `${ext.extensionId}/${type.typeName}`;\n if (typeMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom type ID: \"${qualifiedId}\"`);\n }\n typeMap.set(qualifiedId, type);\n\n for (const sourceTypeName of type.tsTypeNames ?? [type.typeName]) {\n if (typeNameMap.has(sourceTypeName)) {\n throw new Error(`Duplicate custom type source name: \"${sourceTypeName}\"`);\n }\n typeNameMap.set(sourceTypeName, {\n extensionId: ext.extensionId,\n registration: type,\n });\n }\n\n if (type.brand !== undefined) {\n if (type.brand === \"__integerBrand\") {\n throw new Error(\n `Brand \"__integerBrand\" is reserved for the builtin Integer type and cannot be registered by extensions`\n );\n }\n if (brandMap.has(type.brand)) {\n throw new Error(`Duplicate custom type brand: \"${type.brand}\"`);\n }\n brandMap.set(type.brand, {\n extensionId: ext.extensionId,\n registration: type,\n });\n }\n\n if (type.builtinConstraintBroadenings !== undefined) {\n for (const broadening of type.builtinConstraintBroadenings) {\n const key = `${qualifiedId}:${broadening.tagName}`;\n if (builtinBroadeningMap.has(key)) {\n throw new Error(`Duplicate built-in constraint broadening: \"${key}\"`);\n }\n builtinBroadeningMap.set(key, {\n extensionId: ext.extensionId,\n registration: broadening,\n });\n }\n }\n }\n }\n\n if (ext.constraints !== undefined) {\n for (const constraint of ext.constraints) {\n const qualifiedId = `${ext.extensionId}/${constraint.constraintName}`;\n if (constraintMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom constraint ID: \"${qualifiedId}\"`);\n }\n constraintMap.set(qualifiedId, constraint);\n }\n }\n\n if (ext.constraintTags !== undefined) {\n for (const tag of ext.constraintTags) {\n const canonicalTagName = normalizeFormSpecTagName(tag.tagName);\n if (constraintTagMap.has(canonicalTagName)) {\n throw new Error(`Duplicate custom constraint tag: \"@${canonicalTagName}\"`);\n }\n constraintTagMap.set(canonicalTagName, {\n extensionId: ext.extensionId,\n registration: tag,\n });\n }\n }\n\n if (ext.annotations !== undefined) {\n for (const annotation of ext.annotations) {\n const qualifiedId = `${ext.extensionId}/${annotation.annotationName}`;\n if (annotationMap.has(qualifiedId)) {\n throw new Error(`Duplicate custom annotation ID: \"${qualifiedId}\"`);\n }\n annotationMap.set(qualifiedId, annotation);\n }\n }\n\n if (ext.metadataSlots !== undefined) {\n for (const slot of ext.metadataSlots) {\n if (metadataSlotMap.has(slot.slotId)) {\n throw new Error(`Duplicate metadata slot ID: \"${slot.slotId}\"`);\n }\n metadataSlotMap.set(slot.slotId, true);\n\n const canonicalTagName = normalizeFormSpecTagName(slot.tagName);\n if (slot.allowBare === false && (slot.qualifiers?.length ?? 0) === 0) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" must allow bare usage or declare at least one qualifier.`\n );\n }\n if (metadataTagMap.has(canonicalTagName)) {\n throw new Error(`Duplicate metadata tag: \"@${canonicalTagName}\"`);\n }\n if (BUILTIN_METADATA_TAGS.has(canonicalTagName)) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with built-in metadata tags.`\n );\n }\n if (constraintTagMap.has(canonicalTagName)) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${canonicalTagName}\".`\n );\n }\n if (\n Object.hasOwn(\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName(canonicalTagName)\n )\n ) {\n throw new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${normalizeConstraintTagName(canonicalTagName)}\".`\n );\n }\n const existingTag = getTagDefinition(canonicalTagName, reservedTagSources);\n if (existingTag !== null) {\n throw BUILTIN_METADATA_TAGS.has(existingTag.canonicalName)\n ? new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with built-in metadata tags.`\n )\n : new Error(\n `Metadata tag \"@${canonicalTagName}\" conflicts with existing FormSpec tag \"@${existingTag.canonicalName}\".`\n );\n }\n metadataTagMap.set(canonicalTagName, true);\n }\n }\n }\n\n registryLog.debug(\"createExtensionRegistry: complete\", {\n typeCount: typeMap.size,\n constraintCount: constraintMap.size,\n constraintTagCount: constraintTagMap.size,\n broadeningCount: builtinBroadeningMap.size,\n annotationCount: annotationMap.size,\n metadataSlotCount: metadataSlotMap.size,\n setupDiagnosticCount: setupDiagnostics.length,\n });\n\n return {\n extensions,\n setupDiagnostics,\n findType: (typeId: string) => typeMap.get(typeId),\n findTypeByName: (typeName: string) => typeNameMap.get(typeName),\n findTypeByBrand: (brand: string) => brandMap.get(brand),\n findTypeBySymbol: (symbol: ts.Symbol) => symbolMap.get(symbol),\n setSymbolMap: (map) => {\n symbolMap = map;\n },\n findConstraint: (constraintId: string) => constraintMap.get(constraintId),\n findConstraintTag: (tagName: string) => constraintTagMap.get(normalizeFormSpecTagName(tagName)),\n findBuiltinConstraintBroadening: (typeId: string, tagName: string) =>\n builtinBroadeningMap.get(`${typeId}:${tagName}`),\n findAnnotation: (annotationId: string) => annotationMap.get(annotationId),\n };\n}\n","/**\n * Zod schemas for JSON Schema output validation.\n *\n * These schemas cover the subset of JSON Schema that FormSpec generates,\n * plus the FormSpec-specific `x-formspec-*` extension properties.\n *\n * @see https://json-schema.org/draft/2020-12/schema\n */\n\nimport { z } from \"zod\";\nimport type { JSONSchema7 } from \"./types.js\";\n\n// =============================================================================\n// JSON Schema type enum\n// =============================================================================\n\n/**\n * Zod schema for JSON Schema primitive type strings.\n *\n * @public\n */\nexport const jsonSchemaTypeSchema = z.enum([\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"object\",\n \"array\",\n \"null\",\n]);\n\n// =============================================================================\n// JSON Schema validator schema (recursive)\n// =============================================================================\n\n// We annotate with z.ZodType<JSONSchema7> for the recursive self-reference.\n// The @ts-expect-error is required because exactOptionalPropertyTypes:true causes\n// Zod's inferred output type for optional fields (`T | undefined`) to be\n// incompatible with the JSONSchema7 interface's exact optional fields (`T?`).\n// The runtime behavior is correct: z.optional() will strip `undefined` values\n// during parsing and correctly handle absent keys.\n//\n/**\n * Zod schema for the legacy JSON Schema 7 subset used by `@formspec/build`.\n *\n * @public\n */\n// @ts-expect-error -- exactOptionalPropertyTypes: Zod optional infers `T | undefined`\n// but JSONSchema7 uses exact optional `?:` which disallows explicit undefined.\nexport const jsonSchema7Schema: z.ZodType<JSONSchema7> = z.lazy(() =>\n z\n .object({\n $schema: z.string().optional(),\n $id: z.string().optional(),\n $ref: z.string().optional(),\n\n // Metadata\n title: z.string().optional(),\n description: z.string().optional(),\n deprecated: z.boolean().optional(),\n\n // Type\n type: z.union([jsonSchemaTypeSchema, z.array(jsonSchemaTypeSchema)]).optional(),\n\n // String validation\n minLength: z.number().optional(),\n maxLength: z.number().optional(),\n pattern: z.string().optional(),\n\n // Number validation\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n exclusiveMinimum: z.number().optional(),\n exclusiveMaximum: z.number().optional(),\n\n // Enum\n enum: z\n .array(z.union([z.string(), z.number(), z.boolean(), z.null()]))\n .readonly()\n .optional(),\n const: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n\n // Object\n properties: z.record(z.string(), jsonSchema7Schema).optional(),\n required: z.array(z.string()).optional(),\n additionalProperties: z.union([z.boolean(), jsonSchema7Schema]).optional(),\n\n // Array\n items: z.union([jsonSchema7Schema, z.array(jsonSchema7Schema)]).optional(),\n minItems: z.number().optional(),\n maxItems: z.number().optional(),\n\n // Composition\n allOf: z.array(jsonSchema7Schema).optional(),\n anyOf: z.array(jsonSchema7Schema).optional(),\n oneOf: z.array(jsonSchema7Schema).optional(),\n not: jsonSchema7Schema.optional(),\n\n // Conditional\n if: jsonSchema7Schema.optional(),\n then: jsonSchema7Schema.optional(),\n else: jsonSchema7Schema.optional(),\n\n // Format\n format: z.string().optional(),\n\n // Default\n default: z.unknown().optional(),\n\n // FormSpec extensions\n \"x-formspec-source\": z.string().optional(),\n \"x-formspec-params\": z.array(z.string()).readonly().optional(),\n \"x-formspec-schemaSource\": z.string().optional(),\n })\n // passthrough preserves arbitrary x-formspec-* extension properties\n // added by custom constraint tags without causing validation failures\n .passthrough()\n);\n","/**\n * Class schema generator.\n *\n * Generates JSON Schema 2020-12 and JSON Forms UI Schema from statically\n * analyzed class/interface/type alias declarations, routing through the\n * canonical FormIR pipeline.\n */\n\nimport * as ts from \"typescript\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\nimport type { FormSpecConfig } from \"@formspec/config\";\nimport {\n analyzeNamedTypeToIRFromProgramContextDetailed,\n createProgramContext,\n createProgramContextFromProgram,\n findClassByName,\n type AnalyzeNamedTypeToIRDetailedResult,\n type ProgramContext,\n} from \"../analyzer/program.js\";\nimport {\n analyzeClassToIR,\n type DiscriminatorResolutionOptions,\n type IRClassAnalysis,\n} from \"../analyzer/class-analyzer.js\";\nimport { canonicalizeTSDoc, type TSDocSource } from \"../canonicalize/index.js\";\nimport {\n generateJsonSchemaFromIR,\n type GenerateJsonSchemaFromIROptions,\n type JsonSchema2020,\n} from \"../json-schema/ir-generator.js\";\nimport {\n createExtensionRegistry,\n type ExtensionRegistry,\n type MutableExtensionRegistry,\n} from \"../extensions/index.js\";\nimport { buildSymbolMapFromConfig } from \"../extensions/symbol-registry.js\";\nimport { generateUiSchemaFromIR } from \"../ui-schema/ir-generator.js\";\nimport { validateIR, type ValidationDiagnostic } from \"../validate/index.js\";\n\nexport type { DiscriminatorResolutionOptions } from \"../analyzer/class-analyzer.js\";\n\n/**\n * Generated schemas for a class.\n *\n * @beta\n */\nexport interface ClassSchemas {\n /** JSON Schema 2020-12 for validation */\n jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n uiSchema: UISchema;\n}\n\n/**\n * Non-throwing schema generation result with structured diagnostics.\n *\n * @public\n */\nexport interface DetailedClassSchemasResult {\n /** Whether schema generation completed without error-severity diagnostics. */\n readonly ok: boolean;\n /** Collected analysis and validation diagnostics for this target. */\n readonly diagnostics: readonly ValidationDiagnostic[];\n /** JSON Schema 2020-12 for validation, when generation succeeds. */\n readonly jsonSchema?: JsonSchema2020 | undefined;\n /** JSON Forms UI Schema for rendering, when generation succeeds. */\n readonly uiSchema?: UISchema | undefined;\n}\n\n/**\n * A batch target for non-throwing schema generation.\n *\n * @public\n */\nexport interface SchemaGenerationTarget {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze. */\n readonly typeName: string;\n}\n\n/**\n * Batch options for non-throwing schema generation.\n *\n * @public\n */\nexport interface GenerateSchemasBatchOptions extends StaticSchemaGenerationOptions {\n /** Targets to analyze and generate. */\n readonly targets: readonly SchemaGenerationTarget[];\n}\n\n/**\n * Batch options for non-throwing schema generation using an existing program.\n *\n * @public\n */\nexport interface GenerateSchemasBatchFromProgramOptions extends StaticSchemaGenerationOptions {\n /** Existing TypeScript program supplied by the caller. */\n readonly program: ts.Program;\n /** Targets to analyze and generate. */\n readonly targets: readonly SchemaGenerationTarget[];\n}\n\n/**\n * Result for a single target in a batch generation request.\n *\n * @public\n */\nexport interface DetailedSchemaGenerationTargetResult extends DetailedClassSchemasResult {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias that was analyzed. */\n readonly typeName: string;\n}\n\n/**\n * Generates JSON Schema 2020-12 and UI Schema from an IR class analysis.\n *\n * Routes through the canonical IR pipeline:\n * IRClassAnalysis → canonicalizeTSDoc → FormIR → JSON Schema / UI Schema\n *\n * @param analysis - The IR analysis result (from analyzeClassToIR, analyzeInterfaceToIR, or analyzeTypeAliasToIR)\n * @param source - Optional source file metadata for provenance\n * @returns Generated JSON Schema and UI Schema\n */\nexport function generateClassSchemas(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: GenerateJsonSchemaFromIROptions & { metadata?: MetadataPolicyInput | undefined }\n): ClassSchemas {\n const result = generateClassSchemasDetailed(analysis, source, options);\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema 2020-12 and UI Schema from an IR class analysis\n * without throwing on validation diagnostics.\n *\n * @public\n */\nexport function generateClassSchemasDetailed(\n analysis: IRClassAnalysis,\n source?: TSDocSource,\n options?: GenerateJsonSchemaFromIROptions & { metadata?: MetadataPolicyInput | undefined }\n): DetailedClassSchemasResult {\n const analysisDiagnostics = analysis.diagnostics ?? [];\n const errorDiagnostics = analysisDiagnostics.filter(\n (diagnostic) => diagnostic.severity === \"error\"\n );\n if (errorDiagnostics.length > 0) {\n return {\n ok: false,\n diagnostics: analysisDiagnostics,\n };\n }\n\n const ir = canonicalizeTSDoc(\n analysis,\n source,\n options?.metadata !== undefined ? { metadata: options.metadata } : undefined\n );\n const validationResult = validateIR(ir, {\n ...(options?.extensionRegistry !== undefined && {\n extensionRegistry: options.extensionRegistry,\n }),\n ...(options?.vendorPrefix !== undefined && { vendorPrefix: options.vendorPrefix }),\n });\n if (!validationResult.valid) {\n return {\n ok: false,\n diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],\n };\n }\n\n return {\n ok: true,\n diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],\n jsonSchema: generateJsonSchemaFromIR(ir, options),\n uiSchema: generateUiSchemaFromIR(ir),\n };\n}\n\nfunction formatValidationError(diagnostics: readonly ValidationDiagnostic[]): string {\n const lines = diagnostics.map((diagnostic) => {\n const primary = formatLocation(diagnostic.primaryLocation);\n const related =\n diagnostic.relatedLocations.length > 0\n ? ` [related: ${diagnostic.relatedLocations.map(formatLocation).join(\", \")}]`\n : \"\";\n return `${diagnostic.code}: ${diagnostic.message} (${primary})${related}`;\n });\n\n return `FormSpec validation failed:\\n${lines.map((line) => `- ${line}`).join(\"\\n\")}`;\n}\n\nfunction formatLocation(location: ValidationDiagnostic[\"primaryLocation\"]): string {\n return `${location.file}:${String(location.line)}:${String(location.column)}`;\n}\n\n/**\n * Shared options for schema generation flows that support custom extensions.\n *\n * @public\n */\nexport interface StaticSchemaGenerationOptions {\n /**\n * FormSpec project configuration. When provided, resolves `extensionRegistry`,\n * `vendorPrefix`, `enumSerialization`, and `metadata` from the config object.\n * Direct options take precedence over config values.\n */\n readonly config?: FormSpecConfig | undefined;\n /**\n * Registry used to resolve custom types, constraints, and annotations.\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly extensionRegistry?: ExtensionRegistry | undefined;\n /**\n * Vendor prefix for emitted extension keywords.\n * @defaultValue \"x-formspec\"\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly vendorPrefix?: string | undefined;\n /**\n * JSON Schema representation to use for static enums.\n * @defaultValue \"enum\"\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly enumSerialization?: \"enum\" | \"oneOf\" | \"smart-size\";\n /**\n * Metadata resolution policy for static schema generation.\n * @deprecated Provide a `FormSpecConfig` via the `config` option instead.\n */\n readonly metadata?: MetadataPolicyInput | undefined;\n /** Discriminator-specific schema generation behavior. */\n readonly discriminator?: DiscriminatorResolutionOptions | undefined;\n /**\n * Absolute path to the FormSpec config file (e.g., `formspec.config.ts`).\n *\n * When provided alongside a `config` that includes extensions, the build\n * pipeline includes the config file in the TypeScript program and extracts\n * `defineCustomType<T>()` type parameters. This enables symbol-based custom\n * type detection — the most precise resolution path, immune to import aliases\n * and name collisions.\n *\n * Obtain this from `loadFormSpecConfig()`:\n * ```typescript\n * const { config, configPath } = await loadFormSpecConfig();\n * await generateSchemas({ filePath, typeName, config, configPath, errorReporting: \"throw\" });\n * ```\n */\n readonly configPath?: string | undefined;\n}\n\n/**\n * Options for generating schemas from a decorated class.\n *\n * @public\n */\nexport interface GenerateFromClassOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file */\n filePath: string;\n /** Class name to analyze */\n className: string;\n}\n\n/**\n * Result of generating schemas from a decorated class.\n *\n * @public\n */\nexport interface GenerateFromClassResult {\n /** JSON Schema 2020-12 for validation */\n jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering */\n uiSchema: UISchema;\n}\n\n/**\n * Options for generating schemas from a named type inside an existing TypeScript program.\n *\n * @public\n */\nexport interface GenerateSchemasFromProgramOptions extends StaticSchemaGenerationOptions {\n /** Existing TypeScript program supplied by the caller. */\n readonly program: ts.Program;\n /** Path to the TypeScript source file */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze */\n readonly typeName: string;\n /**\n * Controls whether error-severity diagnostics throw or are returned in the result.\n */\n readonly errorReporting: \"throw\" | \"diagnostics\";\n}\n\n/**\n * Generates JSON Schema and UI Schema from a decorated TypeScript class.\n *\n * This is a high-level entry point that handles the entire pipeline:\n * creating a TypeScript program, finding the class, analyzing it to IR,\n * and generating schemas — all in one call.\n *\n * @example\n * ```typescript\n * const result = generateSchemasFromClass({\n * filePath: \"./src/forms.ts\",\n * className: \"UserForm\",\n * });\n * console.log(result.jsonSchema);\n * ```\n *\n * @param options - File path, class name, and optional compiler options\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemasFromClass(\n options: GenerateFromClassOptions\n): GenerateFromClassResult {\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n const ctx = createProgramContext(options.filePath, additionalFiles);\n const classDecl = findClassByName(ctx.sourceFile, options.className);\n\n if (!classDecl) {\n throw new Error(`Class \"${options.className}\" not found in ${options.filePath}`);\n }\n\n const analysis = analyzeClassToIR(\n classDecl,\n ctx.checker,\n options.filePath,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n options.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n options.metadata,\n options.discriminator\n );\n return generateClassSchemas(\n analysis,\n { file: options.filePath },\n {\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n extensionRegistry: options.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix,\n }\n );\n}\n\n/**\n * Options for generating schemas from a named type (class, interface, or type alias).\n *\n * @public\n */\nexport interface GenerateSchemasOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file */\n readonly filePath: string;\n /** Name of the exported class, interface, or type alias to analyze */\n readonly typeName: string;\n /**\n * Controls whether error-severity diagnostics throw or are returned in the result.\n */\n readonly errorReporting: \"throw\" | \"diagnostics\";\n}\n\ntype GenerateSchemasImplementationOptions = StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n readonly errorReporting?: \"throw\" | \"diagnostics\" | undefined;\n};\n\ntype GenerateSchemasFromProgramImplementationOptions = StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n readonly errorReporting?: \"throw\" | \"diagnostics\" | undefined;\n};\n\n/**\n * Generates JSON Schema and UI Schema from a named TypeScript\n * type — a decorated class, an interface with TSDoc tags, or a type alias.\n *\n * This is the recommended entry point. It automatically detects whether\n * the name resolves to a class, interface, or type alias and uses the\n * appropriate IR analysis pipeline.\n *\n * @example\n * ```typescript\n * const result = generateSchemas({\n * filePath: \"./src/config.ts\",\n * typeName: \"DiscountConfig\",\n * errorReporting: \"throw\",\n * });\n * ```\n */\n/**\n * Generates JSON Schema and UI Schema from a named type and throws when\n * generation reports error-severity diagnostics.\n *\n * @param options - File path, type name, and explicit throw-on-error reporting\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemas(\n options: GenerateSchemasOptions & { readonly errorReporting: \"throw\" }\n): GenerateFromClassResult;\n/**\n * Generates JSON Schema and UI Schema from a named type and returns structured\n * diagnostics instead of throwing on validation or analysis failures.\n *\n * @param options - File path, type name, and explicit diagnostics reporting\n * @returns Structured generation result with diagnostics\n *\n * @public\n */\nexport function generateSchemas(\n options: GenerateSchemasOptions & { readonly errorReporting: \"diagnostics\" }\n): DetailedClassSchemasResult;\n/**\n * Generates JSON Schema and UI Schema from a named type.\n *\n * @deprecated Pass `errorReporting` explicitly. Omitting it defaults to `\"throw\"` only for backward compatibility.\n * @param options - File path and type name\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\n/* eslint-disable @typescript-eslint/unified-signatures */\nexport function generateSchemas(\n options: StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n }\n): GenerateFromClassResult;\n/* eslint-enable @typescript-eslint/unified-signatures */\nexport function generateSchemas(\n options: GenerateSchemasImplementationOptions\n): GenerateFromClassResult | DetailedClassSchemasResult {\n const result = generateSchemasDetailedInternal(options);\n if (options.errorReporting === \"diagnostics\") {\n return result;\n }\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program supplied by the caller.\n *\n * This low-level entry point lets downstream tooling reuse a host-owned\n * `Program` for both FormSpec extraction and other TypeScript analysis.\n */\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and throws when generation reports error-severity diagnostics.\n *\n * @param options - Host program, file path, type name, and explicit throw-on-error reporting\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramOptions & { readonly errorReporting: \"throw\" }\n): GenerateFromClassResult;\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and returns structured diagnostics instead of throwing on\n * validation or analysis failures.\n *\n * @param options - Host program, file path, type name, and explicit diagnostics reporting\n * @returns Structured generation result with diagnostics\n *\n * @public\n */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramOptions & { readonly errorReporting: \"diagnostics\" }\n): DetailedClassSchemasResult;\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program.\n *\n * @deprecated Pass `errorReporting` explicitly. Omitting it defaults to `\"throw\"` only for backward compatibility.\n * @param options - Host program, file path, and type name\n * @returns Generated JSON Schema and UI Schema\n *\n * @public\n */\n/* eslint-disable @typescript-eslint/unified-signatures */\nexport function generateSchemasFromProgram(\n options: StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n }\n): GenerateFromClassResult;\n/* eslint-enable @typescript-eslint/unified-signatures */\nexport function generateSchemasFromProgram(\n options: GenerateSchemasFromProgramImplementationOptions\n): GenerateFromClassResult | DetailedClassSchemasResult {\n const result = generateSchemasFromProgramDetailedInternal(options);\n if (options.errorReporting === \"diagnostics\") {\n return result;\n }\n if (!result.ok || result.jsonSchema === undefined || result.uiSchema === undefined) {\n throw new Error(formatValidationError(result.diagnostics));\n }\n\n return {\n jsonSchema: result.jsonSchema,\n uiSchema: result.uiSchema,\n };\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type and returns structured\n * diagnostics instead of throwing on validation or analysis failures.\n * @deprecated Use `generateSchemas({ ...options, errorReporting: \"diagnostics\" })` instead.\n *\n * @public\n */\nexport function generateSchemasDetailed(\n options: StaticSchemaGenerationOptions & {\n readonly filePath: string;\n readonly typeName: string;\n }\n): DetailedClassSchemasResult {\n return generateSchemas({\n ...options,\n errorReporting: \"diagnostics\",\n });\n}\n\nfunction generateSchemasDetailedInternal(\n options: GenerateSchemasImplementationOptions\n): DetailedClassSchemasResult {\n let ctx: ProgramContext;\n try {\n // Include the config file in the program when provided so that the config\n // AST is available for symbol-based type-parameter extraction.\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n ctx = createProgramContext(options.filePath, additionalFiles);\n } catch (error) {\n return {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)],\n };\n }\n\n return generateSchemasFromDetailedProgramContext(\n ctx,\n options.filePath,\n options.typeName,\n options\n );\n}\n\n/**\n * Generates JSON Schema and UI Schema from a named type within an existing\n * TypeScript program and returns structured diagnostics instead of throwing on\n * validation or analysis failures.\n * @deprecated Use `generateSchemasFromProgram({ ...options, errorReporting: \"diagnostics\" })` instead.\n *\n * @public\n */\nexport function generateSchemasFromProgramDetailed(\n options: StaticSchemaGenerationOptions & {\n readonly program: ts.Program;\n readonly filePath: string;\n readonly typeName: string;\n }\n): DetailedClassSchemasResult {\n return generateSchemasFromProgram({\n ...options,\n errorReporting: \"diagnostics\",\n });\n}\n\nfunction generateSchemasFromProgramDetailedInternal(\n options: GenerateSchemasFromProgramImplementationOptions\n): DetailedClassSchemasResult {\n let ctx: ProgramContext;\n try {\n ctx = createProgramContextFromProgram(options.program, options.filePath);\n } catch (error) {\n return {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(options.filePath, error)],\n };\n }\n\n return generateSchemasFromDetailedProgramContext(\n ctx,\n options.filePath,\n options.typeName,\n options\n );\n}\n\n/**\n * Generates schemas for many targets and returns per-target diagnostics instead\n * of failing on the first problem.\n *\n * @public\n */\nexport function generateSchemasBatch(\n options: GenerateSchemasBatchOptions\n): readonly DetailedSchemaGenerationTargetResult[] {\n const contextCache = new Map<string, ProgramContext>();\n\n // Resolve options once. The symbol map is rebuilt whenever a new ts.Program is\n // encountered — ts.Symbol identity is program-specific, so a map built from one\n // program must not be used to look up symbols from a different program.\n const resolved = resolveOptions(options);\n let symbolMapProgram: ts.Program | undefined;\n\n return options.targets.map((target) => {\n let ctx: ProgramContext;\n try {\n const cacheKey = ts.sys.useCaseSensitiveFileNames\n ? target.filePath\n : target.filePath.toLowerCase();\n const cachedContext = contextCache.get(cacheKey);\n if (cachedContext === undefined) {\n const additionalFiles = options.configPath !== undefined ? [options.configPath] : undefined;\n ctx = createProgramContext(target.filePath, additionalFiles);\n contextCache.set(cacheKey, ctx);\n } else {\n ctx = cachedContext;\n }\n } catch (error) {\n return withTarget(target, {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)],\n });\n }\n\n // Rebuild the symbol map whenever the program changes. ts.Symbol identity is\n // program-specific — a map seeded from one program cannot match symbols from\n // a different program, so we must re-walk the config AST for each new program.\n if (\n options.configPath !== undefined &&\n resolved.extensionRegistry !== undefined &&\n isMutableRegistry(resolved.extensionRegistry) &&\n ctx.program !== symbolMapProgram\n ) {\n const symbolMap = buildSymbolMapFromConfig(\n options.configPath,\n ctx.program,\n ctx.checker,\n resolved.extensionRegistry\n );\n resolved.extensionRegistry.setSymbolMap(symbolMap);\n symbolMapProgram = ctx.program;\n }\n\n return withTarget(\n target,\n generateSchemasFromResolvedOptions(\n ctx,\n target.filePath,\n target.typeName,\n resolved,\n options.discriminator\n )\n );\n });\n}\n\n/**\n * Generates schemas for many targets from an existing TypeScript program and\n * returns per-target diagnostics instead of failing on the first problem.\n *\n * @public\n */\nexport function generateSchemasBatchFromProgram(\n options: GenerateSchemasBatchFromProgramOptions\n): readonly DetailedSchemaGenerationTargetResult[] {\n return options.targets.map((target) => {\n let ctx: ProgramContext;\n try {\n ctx = createProgramContextFromProgram(options.program, target.filePath);\n } catch (error) {\n return withTarget(target, {\n ok: false,\n diagnostics: [createProgramContextFailureDiagnostic(target.filePath, error)],\n });\n }\n\n return withTarget(\n target,\n generateSchemasFromDetailedProgramContext(ctx, target.filePath, target.typeName, options)\n );\n });\n}\n\nfunction isMutableRegistry(reg: ExtensionRegistry): reg is MutableExtensionRegistry {\n return (\n \"setSymbolMap\" in reg && typeof (reg as MutableExtensionRegistry).setSymbolMap === \"function\"\n );\n}\n\n/**\n * Resolves the effective extension registry, vendor prefix, enum serialization,\n * and metadata from a `StaticSchemaGenerationOptions` object.\n *\n * Prefers explicit deprecated fields when present, falling back to the\n * `config` object. This is the migration bridge — once all callers use\n * `config`, the deprecated field reads can be removed.\n *\n * @internal\n */\nexport function resolveStaticOptions(options: StaticSchemaGenerationOptions): {\n extensionRegistry: ExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n} {\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const legacyRegistry = options.extensionRegistry;\n\n // Only construct the config registry if the deprecated field is absent and\n // extensions were actually configured. Treating an empty array as \"no\n // registry\" avoids building an empty registry (and emitting its debug log)\n // when callers pass a defaults-filled `ResolvedFormSpecConfig` that sets\n // `extensions: []` on behalf of users who never configured any.\n const configRegistry =\n legacyRegistry === undefined &&\n options.config?.extensions !== undefined &&\n options.config.extensions.length > 0\n ? createExtensionRegistry(options.config.extensions)\n : undefined;\n\n return {\n extensionRegistry: legacyRegistry ?? configRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix ?? options.config?.vendorPrefix,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization ?? options.config?.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata ?? options.config?.metadata,\n };\n}\n\nfunction resolveOptions(options: StaticSchemaGenerationOptions): {\n extensionRegistry: MutableExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n} {\n // Treat `extensions: []` as \"no registry\" — see `resolveStaticOptions`\n // above for the motivation (avoids building an empty registry when the\n // caller passes a defaults-filled `ResolvedFormSpecConfig`).\n const configRegistry =\n options.config?.extensions !== undefined && options.config.extensions.length > 0\n ? createExtensionRegistry(options.config.extensions)\n : undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const legacyRegistry = options.extensionRegistry;\n\n return {\n // When the caller provides the deprecated extensionRegistry field directly,\n // it is typed as the read-only ExtensionRegistry interface. We cast here\n // because the legacy path was introduced before MutableExtensionRegistry was\n // split out; callers using createExtensionRegistry() always get a mutable\n // registry, and this cast is safe for all registries produced by this module.\n extensionRegistry: (legacyRegistry as MutableExtensionRegistry | undefined) ?? configRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n vendorPrefix: options.vendorPrefix ?? options.config?.vendorPrefix,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n enumSerialization: options.enumSerialization ?? options.config?.enumSerialization,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n metadata: options.metadata ?? options.config?.metadata,\n };\n}\n\nfunction generateSchemasFromDetailedProgramContext(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n options: StaticSchemaGenerationOptions\n): DetailedClassSchemasResult {\n const resolved = resolveOptions(options);\n\n // If a configPath and extension registry are both available, build the\n // symbol map from the config AST and register it on the registry. This\n // enables the symbol-based detection path in the type resolver.\n if (\n options.configPath !== undefined &&\n resolved.extensionRegistry !== undefined &&\n isMutableRegistry(resolved.extensionRegistry)\n ) {\n const symbolMap = buildSymbolMapFromConfig(\n options.configPath,\n ctx.program,\n ctx.checker,\n resolved.extensionRegistry\n );\n resolved.extensionRegistry.setSymbolMap(symbolMap);\n }\n\n return generateSchemasFromResolvedOptions(\n ctx,\n filePath,\n typeName,\n resolved,\n options.discriminator\n );\n}\n\n/**\n * Inner implementation: generates schemas from a ProgramContext and pre-resolved options.\n *\n * Separated so that batch callers can resolve options and seed the symbol map once\n * outside the per-target loop, then call this directly without repeating that work.\n */\nfunction generateSchemasFromResolvedOptions(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n resolved: {\n extensionRegistry: MutableExtensionRegistry | undefined;\n vendorPrefix: string | undefined;\n enumSerialization: \"enum\" | \"oneOf\" | \"smart-size\" | undefined;\n metadata: MetadataPolicyInput | undefined;\n },\n discriminator: DiscriminatorResolutionOptions | undefined\n): DetailedClassSchemasResult {\n const analysisResult: AnalyzeNamedTypeToIRDetailedResult =\n analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx,\n filePath,\n typeName,\n resolved.extensionRegistry,\n resolved.metadata,\n discriminator\n );\n if (!analysisResult.ok) {\n return {\n ok: false,\n diagnostics: analysisResult.diagnostics,\n };\n }\n\n return generateClassSchemasDetailed(\n analysisResult.analysis,\n { file: filePath },\n {\n extensionRegistry: resolved.extensionRegistry,\n metadata: resolved.metadata,\n enumSerialization: resolved.enumSerialization,\n vendorPrefix: resolved.vendorPrefix,\n }\n );\n}\n\nfunction withTarget(\n target: SchemaGenerationTarget,\n result: DetailedClassSchemasResult\n): DetailedSchemaGenerationTargetResult {\n return {\n filePath: target.filePath,\n typeName: target.typeName,\n ...result,\n };\n}\n\nfunction createProgramContextFailureDiagnostic(\n filePath: string,\n error: unknown\n): ValidationDiagnostic {\n return {\n code: \"PROGRAM_CONTEXT_FAILURE\",\n message: error instanceof Error ? error.message : String(error),\n severity: \"error\",\n primaryLocation: {\n surface: \"tsdoc\",\n file: filePath,\n line: 1,\n column: 0,\n },\n relatedLocations: [],\n };\n}\n","/**\n * TypeScript program setup for static analysis.\n *\n * Creates a TypeScript program with type checker from a source file,\n * using the project's tsconfig.json for compiler options.\n */\n\nimport * as ts from \"typescript\";\nimport * as path from \"node:path\";\nimport type { FieldNode, Provenance, TypeDefinition, TypeNode } from \"@formspec/core/internals\";\nimport type { ConstraintSemanticDiagnostic } from \"@formspec/analysis/internal\";\nimport {\n analyzeDeclarationRootInfo,\n analyzeClassToIR,\n createAnalyzerMetadataPolicy,\n getAnalyzableObjectLikePropertyName,\n analyzeInterfaceToIR,\n isResolvableObjectLikeAliasTypeNode,\n analyzeTypeAliasToIR,\n type DeclarationRootInfo,\n type DiscriminatorResolutionOptions,\n type IRClassAnalysis,\n resolveTypeNode,\n} from \"./class-analyzer.js\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\n\n/**\n * Result of creating a TypeScript program for analysis.\n */\nexport interface ProgramContext {\n /** The TypeScript program */\n program: ts.Program;\n /** Type checker for resolving types */\n checker: ts.TypeChecker;\n /** The source file being analyzed */\n sourceFile: ts.SourceFile;\n}\n\nexport type AnalyzeNamedTypeToIRDetailedResult =\n | { readonly ok: true; readonly analysis: IRClassAnalysis }\n | {\n readonly ok: false;\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n };\n\n/**\n * Resolves a source file and checker from an existing TypeScript program.\n *\n * @param program - Existing TypeScript program supplied by the host\n * @param filePath - Absolute or relative path to the TypeScript source file\n * @returns Program context with checker and source file\n */\nexport function createProgramContextFromProgram(\n program: ts.Program,\n filePath: string\n): ProgramContext {\n const absolutePath = path.resolve(filePath);\n const sourceFile = program.getSourceFile(absolutePath) ?? program.getSourceFile(filePath);\n\n if (!sourceFile) {\n throw new Error(`Could not find source file in provided program: ${absolutePath}`);\n }\n\n return {\n program,\n checker: program.getTypeChecker(),\n sourceFile,\n };\n}\n\n/**\n * Creates a TypeScript program for analyzing a source file.\n *\n * Looks for tsconfig.json in the file's directory or parent directories.\n * Falls back to default compiler options if no config is found.\n *\n * @param filePath - Absolute path to the TypeScript source file\n * @param additionalFiles - Optional additional files to include in the program\n * (e.g., the FormSpec config file for symbol-based custom type detection).\n * Duplicates are silently removed.\n * @returns Program context with checker and source file\n */\nexport function createProgramContext(\n filePath: string,\n additionalFiles?: readonly string[]\n): ProgramContext {\n const absolutePath = path.resolve(filePath);\n const fileDir = path.dirname(absolutePath);\n\n // Find tsconfig.json - using ts.sys.fileExists which has `this: void` requirement\n const configPath = ts.findConfigFile(fileDir, ts.sys.fileExists.bind(ts.sys), \"tsconfig.json\");\n\n let compilerOptions: ts.CompilerOptions;\n let fileNames: string[];\n\n if (configPath) {\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile.bind(ts.sys));\n if (configFile.error) {\n throw new Error(\n `Error reading tsconfig.json: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, \"\\n\")}`\n );\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPath)\n );\n\n if (parsed.errors.length > 0) {\n const errorMessages = parsed.errors\n .map((e) => ts.flattenDiagnosticMessageText(e.messageText, \"\\n\"))\n .join(\"\\n\");\n throw new Error(`Error parsing tsconfig.json: ${errorMessages}`);\n }\n\n compilerOptions = parsed.options;\n // Include the target file and any additional files in the program.\n // Use Set to eliminate duplicates.\n const normalizedAdditional = (additionalFiles ?? []).map((f) => path.resolve(f));\n fileNames = [...new Set([...parsed.fileNames, absolutePath, ...normalizedAdditional])];\n } else {\n // Fallback to default options\n compilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n declaration: true,\n };\n const normalizedAdditional = (additionalFiles ?? []).map((f) => path.resolve(f));\n fileNames = [...new Set([absolutePath, ...normalizedAdditional])];\n }\n\n const program = ts.createProgram(fileNames, compilerOptions);\n const sourceFile = program.getSourceFile(absolutePath);\n\n if (!sourceFile) {\n throw new Error(`Could not find source file: ${absolutePath}`);\n }\n\n return {\n program,\n checker: program.getTypeChecker(),\n sourceFile,\n };\n}\n\n/**\n * Generic AST node finder by name. Walks the source file tree and returns\n * the first node matching the predicate with the given name.\n */\nfunction findNodeByName<T extends ts.Node>(\n sourceFile: ts.SourceFile,\n name: string,\n predicate: (node: ts.Node) => node is T,\n getName: (node: T) => string | undefined\n): T | null {\n let result: T | null = null;\n\n function visit(node: ts.Node): void {\n if (result) return;\n\n if (predicate(node) && getName(node) === name) {\n result = node;\n return;\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return result;\n}\n\n/**\n * Finds a class declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param className - Name of the class to find\n * @returns The class declaration node, or null if not found\n */\nexport function findClassByName(\n sourceFile: ts.SourceFile,\n className: string\n): ts.ClassDeclaration | null {\n return findNodeByName(sourceFile, className, ts.isClassDeclaration, (n) => n.name?.text);\n}\n\n/**\n * Finds an interface declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param interfaceName - Name of the interface to find\n * @returns The interface declaration node, or null if not found\n */\nexport function findInterfaceByName(\n sourceFile: ts.SourceFile,\n interfaceName: string\n): ts.InterfaceDeclaration | null {\n return findNodeByName(sourceFile, interfaceName, ts.isInterfaceDeclaration, (n) => n.name.text);\n}\n\n/**\n * Finds a type alias declaration by name in a source file.\n *\n * @param sourceFile - The source file to search\n * @param aliasName - Name of the type alias to find\n * @returns The type alias declaration node, or null if not found\n */\nexport function findTypeAliasByName(\n sourceFile: ts.SourceFile,\n aliasName: string\n): ts.TypeAliasDeclaration | null {\n return findNodeByName(sourceFile, aliasName, ts.isTypeAliasDeclaration, (n) => n.name.text);\n}\n\nfunction getResolvedObjectRootType(\n rootType: TypeNode,\n typeRegistry: Record<string, TypeDefinition>\n): Extract<TypeNode, { kind: \"object\" }> | null {\n if (rootType.kind === \"object\") {\n return rootType;\n }\n\n if (rootType.kind !== \"reference\") {\n return null;\n }\n\n const definition = typeRegistry[rootType.name];\n return definition?.type.kind === \"object\" ? definition.type : null;\n}\n\nfunction createResolvedObjectAliasAnalysis(\n name: string,\n rootType: TypeNode,\n typeRegistry: Record<string, TypeDefinition>,\n rootInfo: DeclarationRootInfo,\n diagnostics: readonly ConstraintSemanticDiagnostic[]\n): IRClassAnalysis | null {\n const resolvedRootType = getResolvedObjectRootType(rootType, typeRegistry);\n if (resolvedRootType === null) {\n return null;\n }\n\n const fields: FieldNode[] = resolvedRootType.properties.map((property) => ({\n kind: \"field\",\n name: property.name,\n ...(property.metadata !== undefined && { metadata: property.metadata }),\n type: property.type,\n required: !property.optional,\n constraints: property.constraints,\n annotations: property.annotations,\n provenance: property.provenance,\n }));\n\n return {\n name,\n ...(rootInfo.metadata !== undefined && { metadata: rootInfo.metadata }),\n fields,\n fieldLayouts: fields.map(() => ({})),\n typeRegistry,\n ...(rootInfo.annotations.length > 0 && { annotations: [...rootInfo.annotations] }),\n ...(diagnostics.length > 0 && { diagnostics: [...diagnostics] }),\n instanceMethods: [],\n staticMethods: [],\n };\n}\n\nfunction containsTypeReferenceInObjectLikeAlias(typeNode: ts.TypeNode): boolean {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return containsTypeReferenceInObjectLikeAlias(typeNode.type);\n }\n\n if (ts.isTypeReferenceNode(typeNode)) {\n return true;\n }\n\n return (\n ts.isIntersectionTypeNode(typeNode) &&\n typeNode.types.some((member) => containsTypeReferenceInObjectLikeAlias(member))\n );\n}\n\nfunction collectFallbackAliasMemberPropertyNames(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): readonly string[] | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return collectFallbackAliasMemberPropertyNames(typeNode.type, checker);\n }\n\n if (ts.isTypeLiteralNode(typeNode)) {\n const propertyNames: string[] = [];\n for (const member of typeNode.members) {\n if (!ts.isPropertySignature(member)) {\n continue;\n }\n\n const propertyName = getAnalyzableObjectLikePropertyName(member.name);\n if (propertyName !== null) {\n propertyNames.push(propertyName);\n }\n }\n\n return propertyNames;\n }\n\n if (ts.isTypeReferenceNode(typeNode)) {\n return checker\n .getTypeFromTypeNode(typeNode)\n .getProperties()\n .map((property) => property.getName());\n }\n\n return null;\n}\n\nfunction findFallbackAliasDuplicatePropertyNames(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): readonly string[] {\n if (!ts.isIntersectionTypeNode(typeNode)) {\n return [];\n }\n\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const member of typeNode.types) {\n const propertyNames = collectFallbackAliasMemberPropertyNames(member, checker);\n if (propertyNames === null) {\n continue;\n }\n\n for (const propertyName of propertyNames) {\n if (seen.has(propertyName)) {\n duplicates.add(propertyName);\n } else {\n seen.add(propertyName);\n }\n }\n }\n\n return [...duplicates].sort();\n}\n\n/**\n * Analyzes a named type (class, interface, or type alias) from a TypeScript\n * source file and returns an `IRClassAnalysis`.\n *\n * Tries each declaration kind in order: class → interface → type alias.\n * Throws if the name is not found or if the type alias analysis fails.\n *\n * @param filePath - Absolute or relative path to the TypeScript source file (resolved internally)\n * @param typeName - Name of the class, interface, or type alias to analyze\n * @param extensionRegistry - Optional extension registry for custom type handling\n * @returns IR analysis result\n */\nexport function analyzeNamedTypeToIR(\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const ctx = createProgramContext(filePath);\n return analyzeNamedTypeToIRFromProgramContext(\n ctx,\n filePath,\n typeName,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n}\n\n/**\n * Analyzes a named type from an existing program context and returns either an\n * `IRClassAnalysis` or structured diagnostics instead of throwing.\n */\nexport function analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): AnalyzeNamedTypeToIRDetailedResult {\n const analysisFilePath = path.resolve(filePath);\n\n const classDecl = findClassByName(ctx.sourceFile, typeName);\n if (classDecl !== null) {\n return {\n ok: true,\n analysis: analyzeClassToIR(\n classDecl,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n ),\n };\n }\n\n const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);\n if (interfaceDecl !== null) {\n return {\n ok: true,\n analysis: analyzeInterfaceToIR(\n interfaceDecl,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n ),\n };\n }\n\n const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);\n if (typeAlias !== null) {\n const result = analyzeTypeAliasToIR(\n typeAlias,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n if (result.ok) {\n return { ok: true, analysis: result.analysis };\n }\n\n const fallbackEligible =\n result.kind === \"not-object-like\" &&\n isResolvableObjectLikeAliasTypeNode(typeAlias.type) &&\n containsTypeReferenceInObjectLikeAlias(typeAlias.type);\n if (!fallbackEligible) {\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n result.kind === \"duplicate-properties\"\n ? \"DUPLICATE_ROOT_PROPERTIES\"\n : \"UNSUPPORTED_ROOT_TYPE\",\n result.error,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(\n typeAlias.type,\n ctx.checker\n );\n if (duplicatePropertyNames.length > 0) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"DUPLICATE_ROOT_PROPERTIES\",\n `Type alias \"${typeAlias.name.text}\" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(\", \")}`,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n const rootInfo = analyzeDeclarationRootInfo(\n typeAlias,\n ctx.checker,\n analysisFilePath,\n extensionRegistry,\n metadataPolicy\n );\n const diagnostics: ConstraintSemanticDiagnostic[] = [...rootInfo.diagnostics];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const rootType = resolveTypeNode(\n ctx.checker.getTypeAtLocation(typeAlias),\n ctx.checker,\n analysisFilePath,\n typeRegistry,\n new Set<ts.Type>(),\n typeAlias,\n createAnalyzerMetadataPolicy(metadataPolicy, discriminatorOptions),\n extensionRegistry,\n diagnostics\n );\n const fallbackAnalysis = createResolvedObjectAliasAnalysis(\n typeAlias.name.text,\n rootType,\n typeRegistry,\n rootInfo,\n diagnostics\n );\n if (fallbackAnalysis !== null) {\n return { ok: true, analysis: fallbackAnalysis };\n }\n\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"UNSUPPORTED_ROOT_TYPE\",\n result.error,\n makeNodeProvenance(typeAlias, analysisFilePath)\n ),\n ],\n };\n }\n\n return {\n ok: false,\n diagnostics: [\n makeProgramDiagnostic(\n \"TYPE_NOT_FOUND\",\n `Type \"${typeName}\" not found as a class, interface, or type alias in ${analysisFilePath}`,\n makeFileProvenance(analysisFilePath)\n ),\n ],\n };\n}\n\n/**\n * Analyzes a named type from an existing program context and returns an `IRClassAnalysis`.\n */\nexport function analyzeNamedTypeToIRFromProgramContext(\n ctx: ProgramContext,\n filePath: string,\n typeName: string,\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const result = analyzeNamedTypeToIRFromProgramContextDetailed(\n ctx,\n filePath,\n typeName,\n extensionRegistry,\n metadataPolicy,\n discriminatorOptions\n );\n if (result.ok) {\n return result.analysis;\n }\n\n throw new Error(result.diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n}\n\nfunction makeProgramDiagnostic(\n code: string,\n message: string,\n primaryLocation: Provenance\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation,\n relatedLocations: [],\n };\n}\n\nfunction makeNodeProvenance(node: ts.Node, filePath: string): Provenance {\n const sourceFile = node.getSourceFile();\n const position = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return {\n surface: \"tsdoc\",\n file: filePath,\n line: position.line + 1,\n column: position.character,\n length: node.getWidth(),\n };\n}\n\nfunction makeFileProvenance(filePath: string): Provenance {\n return {\n surface: \"tsdoc\",\n file: filePath,\n line: 1,\n column: 0,\n };\n}\n","/**\n * Class analyzer for extracting fields, types, and JSDoc constraints.\n *\n * Produces `IRClassAnalysis` containing `FieldNode[]` and `typeRegistry`\n * directly from class, interface, or type alias declarations.\n * All downstream generation routes through the canonical FormIR.\n */\n\nimport * as ts from \"typescript\";\nimport {\n analyzeMetadataForNodeWithChecker,\n parseCommentBlock,\n type ConstraintSemanticDiagnostic,\n type ParsedCommentTag,\n} from \"@formspec/analysis/internal\";\nimport type {\n FieldNode,\n TypeNode,\n EnumTypeNode,\n EnumMember,\n ConstraintNode,\n AnnotationNode,\n Provenance,\n ObjectProperty,\n RecordTypeNode,\n TypeDefinition,\n JsonValue,\n ResolvedMetadata,\n ResolvedScalarMetadata,\n} from \"@formspec/core/internals\";\nimport {\n extractJSDocConstraintNodes,\n extractJSDocAnnotationNodes,\n extractDefaultValueAnnotation,\n extractJSDocParseResult,\n} from \"./jsdoc-constraints.js\";\nimport { extractDisplayNameMetadata } from \"./tsdoc-parser.js\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport {\n customTypeIdFromLookup,\n resolveCustomTypeFromTsType,\n} from \"../extensions/resolve-custom-type.js\";\nimport {\n extractTypeNodeFromSource,\n getTypeAliasDeclarationFromTypeReference,\n} from \"../extensions/ts-type-utils.js\";\nimport { _isIntegerBrandedType } from \"./builtin-brands.js\";\nimport type { MetadataPolicyInput } from \"@formspec/core\";\nimport { getDeclarationMetadataPolicy, normalizeMetadataPolicy } from \"../metadata/index.js\";\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard for ts.ObjectType — checks that the TypeFlags.Object bit is set.\n */\nfunction isObjectType(type: ts.Type): type is ts.ObjectType {\n return !!(type.flags & ts.TypeFlags.Object);\n}\n\nfunction isIntersectionType(type: ts.Type): type is ts.IntersectionType {\n return !!(type.flags & ts.TypeFlags.Intersection);\n}\n\nexport function isResolvableObjectLikeAliasTypeNode(typeNode: ts.TypeNode): boolean {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return isResolvableObjectLikeAliasTypeNode(typeNode.type);\n }\n\n if (ts.isTypeLiteralNode(typeNode) || ts.isTypeReferenceNode(typeNode)) {\n return true;\n }\n\n return (\n ts.isIntersectionTypeNode(typeNode) &&\n typeNode.types.length > 0 &&\n typeNode.types.every((member) => isResolvableObjectLikeAliasTypeNode(member))\n );\n}\n\nfunction isSemanticallyPlainObjectLikeType(type: ts.Type, checker: ts.TypeChecker): boolean {\n if (isIntersectionType(type)) {\n return (\n type.types.length > 0 &&\n type.types.every((member) => isSemanticallyPlainObjectLikeType(member, checker))\n );\n }\n\n return (\n isObjectType(type) &&\n checker.getSignaturesOfType(type, ts.SignatureKind.Call).length === 0 &&\n checker.getSignaturesOfType(type, ts.SignatureKind.Construct).length === 0 &&\n !checker.isArrayType(type) &&\n !checker.isTupleType(type)\n );\n}\n\n/**\n * Type guard for ts.TypeReference — checks ObjectFlags.Reference on top of ObjectType.\n * The internal `as` cast is isolated inside this guard and is required because\n * TypeScript's public API does not expose objectFlags on ts.Type directly.\n */\nfunction isTypeReference(type: ts.Type): type is ts.TypeReference {\n // as cast is isolated inside type guard\n return (\n !!(type.flags & ts.TypeFlags.Object) &&\n !!((type as ts.ObjectType).objectFlags & ts.ObjectFlags.Reference)\n );\n}\n\n/**\n * Placeholder used while a named object type is still being expanded.\n *\n * The object identity matters: final empty-object schemas are distinct\n * instances, so we can tell an in-progress registry entry from a real one.\n */\nconst RESOLVING_TYPE_PLACEHOLDER: TypeNode = {\n kind: \"object\",\n properties: [],\n additionalProperties: true,\n};\n\nfunction makeParseOptions(\n extensionRegistry: ExtensionRegistry | undefined,\n fieldType?: TypeNode,\n checker?: ts.TypeChecker,\n subjectType?: ts.Type,\n hostType?: ts.Type\n): import(\"./tsdoc-parser.js\").ParseTSDocOptions | undefined {\n if (\n extensionRegistry === undefined &&\n fieldType === undefined &&\n checker === undefined &&\n subjectType === undefined &&\n hostType === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(extensionRegistry !== undefined && { extensionRegistry }),\n ...(fieldType !== undefined && { fieldType }),\n ...(checker !== undefined && { checker }),\n ...(subjectType !== undefined && { subjectType }),\n ...(hostType !== undefined && { hostType }),\n };\n}\n\n// =============================================================================\n// IR OUTPUT TYPES\n// =============================================================================\n\n/**\n * Layout metadata extracted from `@Group` and `@ShowWhen` TSDoc tags.\n * One entry per field, in the same order as `fields`.\n */\nexport interface FieldLayoutMetadata {\n /** Group label from `@Group(\"label\")`, or undefined if ungrouped. */\n readonly groupLabel?: string;\n /** ShowWhen condition from `@ShowWhen({ field, value })`, or undefined if always visible. */\n readonly showWhen?: { readonly field: string; readonly value: JsonValue };\n}\n\n/**\n * Result of analyzing a class/interface/type alias into canonical IR.\n */\nexport interface IRClassAnalysis {\n /** Type name */\n readonly name: string;\n /** Root-level metadata for the analyzed declaration. */\n readonly metadata?: ResolvedMetadata;\n /** Analyzed fields as canonical IR FieldNodes */\n readonly fields: readonly FieldNode[];\n /** Layout metadata per field (same order/length as `fields`). */\n readonly fieldLayouts: readonly FieldLayoutMetadata[];\n /** Named type definitions referenced by fields */\n readonly typeRegistry: Record<string, TypeDefinition>;\n /** Root-level metadata for the analyzed declaration. */\n readonly annotations?: readonly AnnotationNode[];\n /** Extraction-time diagnostics surfaced before IR validation. */\n readonly diagnostics?: readonly ConstraintSemanticDiagnostic[];\n /** Instance methods (retained for downstream method-schema generation) */\n readonly instanceMethods: readonly MethodInfo[];\n /** Static methods */\n readonly staticMethods: readonly MethodInfo[];\n}\n\ntype AnalyzeTypeAliasToIRFailureKind = \"duplicate-properties\" | \"not-object-like\";\n\n/**\n * Result of analyzing a type alias into IR — either success or error.\n */\nexport type AnalyzeTypeAliasToIRResult =\n | { readonly ok: true; readonly analysis: IRClassAnalysis }\n | {\n readonly ok: false;\n readonly kind: AnalyzeTypeAliasToIRFailureKind;\n readonly error: string;\n };\n\nexport interface DeclarationRootInfo {\n readonly metadata?: ResolvedMetadata;\n readonly annotations: readonly AnnotationNode[];\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n}\n\n/**\n * Discriminator-specific schema generation options.\n *\n * @public\n */\nexport interface DiscriminatorResolutionOptions {\n /**\n * Optional prefix applied only to metadata-derived discriminator values.\n *\n * Literal discriminator identities taken directly from a bound type remain\n * unchanged.\n */\n readonly apiNamePrefix?: string | undefined;\n}\n\ninterface DiscriminatorDirective {\n readonly fieldName: string;\n readonly typeParameterName: string;\n readonly provenance: Provenance;\n}\n\ninterface AnalyzerMetadataPolicy {\n readonly raw: MetadataPolicyInput | undefined;\n readonly normalized: ReturnType<typeof normalizeMetadataPolicy>;\n readonly discriminator: DiscriminatorResolutionOptions | undefined;\n}\n\nexport function createAnalyzerMetadataPolicy(\n input?: MetadataPolicyInput,\n discriminator?: DiscriminatorResolutionOptions\n): AnalyzerMetadataPolicy {\n return {\n raw: input,\n normalized: normalizeMetadataPolicy(input),\n discriminator,\n };\n}\n\n/**\n * Diagnostic codes eligible for deduplication by `deduplicateDiagnostics`.\n *\n * Only setup diagnostics are safe to dedup by `code + message` because every\n * copy shares the same `primaryLocation` (the registry-level\n * `{surface:\"extension\", line:1, column:0}` anchor). Per-field diagnostics —\n * e.g., two fields producing the same `INVALID_TAG_PLACEMENT` message at\n * different file positions — must not be merged because their\n * `primaryLocation` values differ and losing one would silently hide a\n * legitimate per-field error.\n */\nconst DEDUPLICATABLE_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set([\n \"SYNTHETIC_SETUP_FAILURE\",\n \"UNSUPPORTED_CUSTOM_TYPE_OVERRIDE\",\n]);\n\n/**\n * Removes duplicate setup diagnostics from an accumulated array, leaving\n * non-setup diagnostics unchanged.\n *\n * Phase 4 Slice C: when an extension registry has setup failures, each field\n * node in a class/interface calls {@link parseTSDocTags} independently, and\n * each call returns the same setup diagnostic (anchored at the extension\n * registration site). Without deduplication, an N-field declaration would\n * produce N identical setup diagnostics. We deduplicate by `code + message`\n * (`\\0`-separated to prevent collisions between a code value that matches a\n * message prefix and an actual message) because all copies of a setup\n * diagnostic share the same `primaryLocation` provenance.\n *\n * Dedup is restricted to {@link DEDUPLICATABLE_DIAGNOSTIC_CODES} so that\n * per-field diagnostics with identical messages but distinct locations are\n * always retained — otherwise the helper would silently drop legitimate\n * errors on sibling fields that happen to share a diagnostic code+message.\n *\n * TODO: root fix — instead of deduplicating after accumulation, inject setup\n * diagnostics ONCE at the class/interface/type-alias entry in\n * `analyzeClassToIR` / `analyzeInterfaceToIR` / `analyzeTypeAliasToIR`,\n * before iterating fields. When `extensionRegistry.setupDiagnostics` is\n * non-empty, emit them once and pass `undefined` as the extension registry to\n * per-field `parseTSDocTags` calls so they perform no setup-diag re-emission.\n * That eliminates the need for this deduplication pass entirely.\n * Tracked in\n * `docs/refactors/phase-4-slice-c-deduplicate-diagnostics-root-fix.md`.\n */\nexport function deduplicateDiagnostics(\n diagnostics: readonly ConstraintSemanticDiagnostic[]\n): readonly ConstraintSemanticDiagnostic[] {\n if (diagnostics.length <= 1) return diagnostics;\n const seen = new Set<string>();\n return diagnostics.filter((d) => {\n if (!DEDUPLICATABLE_DIAGNOSTIC_CODES.has(d.code)) return true;\n // `\\0` separator prevents collisions where a code string is a prefix of a\n // message string (e.g., code = \"FOO\", message = \"BAR\" must not collide\n // with code = \"FOO\\0BAR\", message = \"\").\n const key = `${d.code}\\0${d.message}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction resolveNodeMetadata(\n metadataPolicy: AnalyzerMetadataPolicy,\n declarationKind: \"type\" | \"field\" | \"method\",\n logicalName: string,\n node: ts.Node,\n checker: ts.TypeChecker,\n extensionRegistry?: ExtensionRegistry,\n buildContext?: unknown\n): ResolvedMetadata | undefined {\n const analysis = analyzeMetadataForNodeWithChecker({\n checker,\n node,\n logicalName,\n metadata: metadataPolicy.raw,\n extensions: extensionRegistry?.extensions,\n ...(buildContext !== undefined && { buildContext }),\n });\n const resolvedMetadata = analysis?.resolvedMetadata;\n const declarationPolicy = getDeclarationMetadataPolicy(\n metadataPolicy.normalized,\n declarationKind\n );\n\n if (\n resolvedMetadata?.apiName === undefined &&\n declarationPolicy.apiName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.displayName === undefined &&\n declarationPolicy.displayName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.apiNamePlural === undefined &&\n declarationPolicy.apiName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n resolvedMetadata?.displayNamePlural === undefined &&\n declarationPolicy.displayName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n\n return resolvedMetadata;\n}\n\n// =============================================================================\n// HERITAGE-BASED ANNOTATION INHERITANCE (issue #367)\n// =============================================================================\n\n/**\n * Type-level annotation kinds that should be inherited from base types onto\n * derived types when the derived type does not declare its own value.\n *\n * Scope (issue #367): only `@format` is inherited today. Other type-level\n * annotations (e.g., `@description`, `@remarks`) are intentionally not\n * inherited here to keep the change surface-narrow; broader inheritance can\n * be considered as a follow-up once the semantics are confirmed.\n */\nconst INHERITABLE_TYPE_ANNOTATION_KINDS: ReadonlySet<AnnotationNode[\"annotationKind\"]> = new Set<\n AnnotationNode[\"annotationKind\"]\n>([\"format\"]);\n\n/**\n * Returns the string payload carried by an inheritable annotation, or\n * `undefined` for annotation kinds where presence alone is the signal.\n * Used to decide whether a locally-declared annotation counts as an\n * override (empty/whitespace-only payloads do not — see\n * {@link isOverridingInheritableAnnotation}).\n */\nfunction getInheritableAnnotationStringValue(annotation: AnnotationNode): string | undefined {\n if (annotation.annotationKind === \"format\") return annotation.value;\n return undefined;\n}\n\n/**\n * Returns `true` when a locally-declared annotation should suppress\n * heritage inheritance for its kind. An annotation whose string payload is\n * empty or whitespace-only (`/** @format * /`) is not treated as an\n * override — the base-declared value still flows through.\n */\nfunction isOverridingInheritableAnnotation(annotation: AnnotationNode): boolean {\n const value = getInheritableAnnotationStringValue(annotation);\n if (value === undefined) return true;\n return value.trim().length > 0;\n}\n\n/**\n * Walks base declarations reachable from a derived declaration and returns\n * any inheritable type-level annotations that the derived declaration does\n * not already specify.\n *\n * Supports three entry shapes:\n * - **Class / interface** — walks `extends` clauses (issue #367).\n * - **Interface extends a type alias** — crosses the alias node to reach\n * annotations on a deeper object-shaped ancestor (issue #376).\n * - **Type alias whose body is a type reference** — walks the alias\n * derivation chain (`type Foo = Bar`), following through alias-of-alias\n * and alias-of-interface cases (issue #374).\n *\n * The walk is breadth-first across reachable bases. A seen-set on\n * declarations prevents infinite loops on pathological self-referential\n * chains. Annotations already present on the derived type (matched by\n * `annotationKind`) always win — only missing kinds are filled in from the\n * base chain. When multiple bases provide the same kind, the first found\n * wins (earliest in the `extends` clause list, nearest ancestor first).\n */\nfunction collectInheritedTypeAnnotations(\n derivedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n existingAnnotations: readonly AnnotationNode[],\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined\n): AnnotationNode[] {\n // A local annotation only suppresses heritage inheritance when it carries a\n // meaningful payload. Empty/whitespace-only `@format` must fall through to\n // the base-declared value. See issue #367 review discussion.\n const existingKinds = new Set<AnnotationNode[\"annotationKind\"]>(\n existingAnnotations.filter(isOverridingInheritableAnnotation).map((a) => a.annotationKind)\n );\n const needed = new Set<AnnotationNode[\"annotationKind\"]>();\n for (const kind of INHERITABLE_TYPE_ANNOTATION_KINDS) {\n if (!existingKinds.has(kind)) needed.add(kind);\n }\n if (needed.size === 0) return [];\n\n type HeritageBearingDecl =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n const inherited: AnnotationNode[] = [];\n const seen = new Set<ts.Node>([derivedDecl]);\n const queue: HeritageBearingDecl[] = [];\n\n const resolveSymbolTarget = (sym: ts.Symbol): ts.Symbol => {\n if ((sym.flags & ts.SymbolFlags.Alias) === 0) return sym;\n try {\n return checker.getAliasedSymbol(sym);\n } catch {\n // TypeScript can throw when resolving certain alias chains (e.g.,\n // cyclic or partially resolved aliases). Fall back to the original\n // symbol — worst case we miss an inheritance step, not a fatal error.\n return sym;\n }\n };\n\n const isObjectShapedTypeAlias = (alias: ts.TypeAliasDeclaration): boolean => {\n // An interface can only legally extend an object-shaped alias (the TS\n // compiler rejects `interface X extends StringAlias`), but we guard here\n // so a misuse higher in the chain cannot pull in annotations from a\n // primitive-typed alias whose semantics do not match. The check uses\n // the alias's resolved type, not its syntactic RHS, so aliases of\n // aliases-of-interfaces are covered.\n const type = checker.getTypeFromTypeNode(alias.type);\n if ((type.flags & ts.TypeFlags.Object) !== 0) return true;\n if (type.isIntersection()) return true;\n return false;\n };\n\n // `fromTypeAliasRhs` differentiates two enqueue contexts:\n // - false: reached from an interface/class `extends` clause. Type-alias\n // candidates must be object-shaped (TS compiler restriction).\n // - true: reached from a type alias's own RHS (alias-of-alias or\n // alias-of-interface). Primitive-typed chains are valid (issue #374:\n // `type WorkEmail = BaseEmail = string`).\n const enqueueCandidate = (baseDecl: ts.Declaration, fromTypeAliasRhs: boolean): void => {\n if (seen.has(baseDecl)) return;\n if (ts.isClassDeclaration(baseDecl) || ts.isInterfaceDeclaration(baseDecl)) {\n seen.add(baseDecl);\n queue.push(baseDecl);\n return;\n }\n if (ts.isTypeAliasDeclaration(baseDecl)) {\n if (!fromTypeAliasRhs && !isObjectShapedTypeAlias(baseDecl)) return;\n seen.add(baseDecl);\n queue.push(baseDecl);\n }\n };\n\n const enqueueBasesOf = (decl: HeritageBearingDecl): void => {\n if (ts.isTypeAliasDeclaration(decl)) {\n // Type aliases have no heritage clauses. Instead, follow the alias's\n // RHS when it resolves to another named type. This unifies the\n // alias-chain walk (#374) with the interface-extends-alias mid-chain\n // case (#376) under a single traversal.\n const rhs = decl.type;\n if (!ts.isTypeReferenceNode(rhs)) return;\n const sym = checker.getSymbolAtLocation(rhs.typeName);\n if (!sym) return;\n const target = resolveSymbolTarget(sym);\n for (const baseDecl of target.declarations ?? []) {\n enqueueCandidate(baseDecl, /*fromTypeAliasRhs*/ true);\n }\n return;\n }\n\n const heritageClauses = decl.heritageClauses;\n if (!heritageClauses) return;\n for (const clause of heritageClauses) {\n // Only follow `extends`. `implements` does NOT propagate type-level\n // annotations: authors use `implements` to assert structural\n // conformance, not to adopt the interface's metadata. Following it\n // would silently merge annotations across unrelated nominal types.\n if (clause.token !== ts.SyntaxKind.ExtendsKeyword) continue;\n for (const typeExpr of clause.types) {\n const sym = checker.getSymbolAtLocation(typeExpr.expression);\n if (!sym) continue;\n const target = resolveSymbolTarget(sym);\n for (const baseDecl of target.declarations ?? []) {\n enqueueCandidate(baseDecl, /*fromTypeAliasRhs*/ false);\n }\n }\n }\n };\n\n enqueueBasesOf(derivedDecl);\n\n // Index-pointer traversal (vs `queue.shift()`) keeps the BFS O(n) for deep\n // heritage graphs — array shift is O(n) in V8.\n for (let queueIndex = 0; queueIndex < queue.length && needed.size > 0; queueIndex++) {\n const baseDecl = queue[queueIndex];\n if (baseDecl === undefined) continue;\n // Use the base declaration's own source file for provenance / pos-mapping.\n // The BFS may cross file boundaries, so the derived type's file is not\n // the right reference point for annotations parsed off a base declaration.\n const baseFile = baseDecl.getSourceFile().fileName;\n const baseAnnotations = extractJSDocAnnotationNodes(\n baseDecl,\n baseFile,\n makeParseOptions(extensionRegistry)\n );\n for (const annotation of baseAnnotations) {\n if (!needed.has(annotation.annotationKind)) continue;\n // Skip empty-payload annotations on the base as well — they cannot\n // meaningfully fill an inherited slot.\n if (!isOverridingInheritableAnnotation(annotation)) continue;\n inherited.push(annotation);\n needed.delete(annotation.annotationKind);\n }\n // Continue up the chain if we still need kinds.\n if (needed.size > 0) {\n enqueueBasesOf(baseDecl);\n }\n }\n\n return inherited;\n}\n\n/**\n * Extracts type-level annotations from a named declaration (class, interface,\n * or type alias), applying inheritance where applicable (issues #367, #374,\n * #376). Any inheritable annotation kind absent from the local declaration\n * is filled in by walking `extends` clauses and type-alias RHS chains via\n * {@link collectInheritedTypeAnnotations}.\n */\nfunction extractNamedTypeAnnotations(\n namedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file: string,\n extensionRegistry: ExtensionRegistry | undefined\n): AnnotationNode[] {\n const local = extractJSDocAnnotationNodes(namedDecl, file, makeParseOptions(extensionRegistry));\n const inherited = collectInheritedTypeAnnotations(namedDecl, local, checker, extensionRegistry);\n if (inherited.length === 0) return [...local];\n return [...local, ...inherited];\n}\n\nexport function analyzeDeclarationRootInfo(\n declaration: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput\n): DeclarationRootInfo {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(metadataPolicy);\n const declarationType = checker.getTypeAtLocation(declaration);\n const logicalName = ts.isClassDeclaration(declaration)\n ? (declaration.name?.text ?? \"AnonymousClass\")\n : declaration.name.text;\n const docResult = extractJSDocParseResult(\n declaration,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, declarationType, declarationType)\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n logicalName,\n declaration,\n checker,\n extensionRegistry,\n {\n checker,\n declaration,\n subjectType: declarationType,\n hostType: declarationType,\n }\n );\n\n return {\n ...(metadata !== undefined && { metadata }),\n annotations: docResult.annotations,\n diagnostics: docResult.diagnostics,\n };\n}\n\n// =============================================================================\n// IR ANALYSIS — PUBLIC API\n// =============================================================================\n\n/**\n * Analyzes a class declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeClassToIR(\n classDecl: ts.ClassDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = classDecl.name?.text ?? \"AnonymousClass\";\n const fields: FieldNode[] = [];\n const fieldLayouts: FieldLayoutMetadata[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const classType = checker.getTypeAtLocation(classDecl);\n const classDoc = extractJSDocParseResult(\n classDecl,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, classType, classType)\n );\n // Issue #367: type-level annotations (e.g., @format) declared on a base\n // class flow to derived classes unless the derived class overrides them.\n const inheritedClassAnnotations = collectInheritedTypeAnnotations(\n classDecl,\n classDoc.annotations,\n checker,\n extensionRegistry\n );\n const annotations: AnnotationNode[] = [...classDoc.annotations, ...inheritedClassAnnotations];\n diagnostics.push(...classDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n const instanceMethods: MethodInfo[] = [];\n const staticMethods: MethodInfo[] = [];\n\n for (const member of classDecl.members) {\n if (ts.isPropertyDeclaration(member)) {\n const fieldNode = analyzeFieldToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n classType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n fieldLayouts.push({});\n }\n } else if (ts.isMethodDeclaration(member)) {\n const methodInfo = analyzeMethod(member, checker);\n if (methodInfo) {\n const isStatic = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);\n if (isStatic) {\n staticMethods.push(methodInfo);\n } else {\n instanceMethods.push(methodInfo);\n }\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n classDecl,\n classType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n classDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: classDecl,\n subjectType: classType,\n hostType: classType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts,\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods,\n staticMethods,\n };\n}\n\n/**\n * Analyzes an interface declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeInterfaceToIR(\n interfaceDecl: ts.InterfaceDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): IRClassAnalysis {\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = interfaceDecl.name.text;\n const fields: FieldNode[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const interfaceType = checker.getTypeAtLocation(interfaceDecl);\n const interfaceDoc = extractJSDocParseResult(\n interfaceDecl,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, interfaceType, interfaceType)\n );\n // Issue #367: type-level annotations (e.g., @format) declared on a base\n // interface flow to derived interfaces unless the derived interface\n // overrides them.\n const inheritedInterfaceAnnotations = collectInheritedTypeAnnotations(\n interfaceDecl,\n interfaceDoc.annotations,\n checker,\n extensionRegistry\n );\n const annotations: AnnotationNode[] = [\n ...interfaceDoc.annotations,\n ...inheritedInterfaceAnnotations,\n ];\n diagnostics.push(...interfaceDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n\n for (const member of interfaceDecl.members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n interfaceType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n interfaceDecl,\n interfaceType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const fieldLayouts: FieldLayoutMetadata[] = specializedFields.map(() => ({}));\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n interfaceDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: interfaceDecl,\n subjectType: interfaceType,\n hostType: interfaceType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts,\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods: [],\n staticMethods: [],\n };\n}\n\n/**\n * Analyzes a type alias declaration and produces canonical IR FieldNodes.\n */\nexport function analyzeTypeAliasToIR(\n typeAlias: ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n file = \"\",\n extensionRegistry?: ExtensionRegistry,\n metadataPolicy?: MetadataPolicyInput,\n discriminatorOptions?: DiscriminatorResolutionOptions\n): AnalyzeTypeAliasToIRResult {\n const members = getObjectLikeTypeAliasMembers(typeAlias.type);\n if (members === null) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- enum reverse mapping can be undefined for compiler-internal kinds\n const kindDesc = ts.SyntaxKind[typeAlias.type.kind] ?? \"unknown\";\n return {\n ok: false,\n kind: \"not-object-like\",\n error: `Type alias \"${typeAlias.name.text}\" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`,\n };\n }\n\n const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(\n metadataPolicy,\n discriminatorOptions\n );\n const name = typeAlias.name.text;\n const duplicatePropertyNames = findDuplicateObjectLikeTypeAliasPropertyNames(members);\n if (duplicatePropertyNames.length > 0) {\n const sourceFile = typeAlias.getSourceFile();\n const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());\n return {\n ok: false,\n kind: \"duplicate-properties\",\n error: `Type alias \"${name}\" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(\", \")}`,\n };\n }\n\n const fields: FieldNode[] = [];\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const aliasType = checker.getTypeAtLocation(typeAlias);\n const typeAliasDoc = extractJSDocParseResult(\n typeAlias,\n file,\n makeParseOptions(extensionRegistry, undefined, checker, aliasType, aliasType)\n );\n const annotations = [...typeAliasDoc.annotations];\n diagnostics.push(...typeAliasDoc.diagnostics);\n const visiting = new Set<ts.Type>();\n\n for (const member of members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n aliasType,\n normalizedMetadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n fields.push(fieldNode);\n }\n }\n }\n\n const specializedFields = applyDeclarationDiscriminatorToFields(\n fields,\n typeAlias,\n aliasType,\n checker,\n file,\n diagnostics,\n normalizedMetadataPolicy\n );\n const metadata = resolveNodeMetadata(\n normalizedMetadataPolicy,\n \"type\",\n name,\n typeAlias,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: typeAlias,\n subjectType: aliasType,\n hostType: aliasType,\n }\n );\n\n const deduplicatedDiagnostics = deduplicateDiagnostics(diagnostics);\n return {\n ok: true,\n analysis: {\n name,\n ...(metadata !== undefined && { metadata }),\n fields: specializedFields,\n fieldLayouts: specializedFields.map(() => ({})),\n typeRegistry,\n ...(annotations.length > 0 && { annotations }),\n ...(deduplicatedDiagnostics.length > 0 && { diagnostics: deduplicatedDiagnostics }),\n instanceMethods: [],\n staticMethods: [],\n },\n };\n}\n\n// =============================================================================\n// DISCRIMINATOR HELPERS\n// =============================================================================\n\ntype DiscriminatorDeclarationNode =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\ninterface ResolvedDiscriminatorProperty {\n readonly declaration: ts.Declaration | undefined;\n readonly type: ts.Type;\n readonly optional: boolean;\n}\n\nfunction makeAnalysisDiagnostic(\n code: string,\n message: string,\n primaryLocation: Provenance,\n relatedLocations: readonly Provenance[] = []\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation,\n relatedLocations,\n };\n}\n\nfunction getLeadingParsedTags(node: ts.Node): readonly ParsedCommentTag[] {\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n if (commentRanges === undefined) {\n return [];\n }\n\n const parsedTags: ParsedCommentTag[] = [];\n for (const range of commentRanges) {\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) {\n continue;\n }\n const commentText = sourceText.slice(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) {\n continue;\n }\n parsedTags.push(...parseCommentBlock(commentText, { offset: range.pos }).tags);\n }\n\n return parsedTags;\n}\n\nfunction resolveDiscriminatorProperty(\n node: DiscriminatorDeclarationNode,\n checker: ts.TypeChecker,\n fieldName: string\n): ResolvedDiscriminatorProperty | null {\n const subjectType = checker.getTypeAtLocation(node);\n const propertySymbol = subjectType.getProperty(fieldName);\n if (propertySymbol === undefined) {\n return null;\n }\n\n const declaration =\n propertySymbol.valueDeclaration ??\n propertySymbol.declarations?.find(\n (candidate) => ts.isPropertyDeclaration(candidate) || ts.isPropertySignature(candidate)\n ) ??\n propertySymbol.declarations?.[0];\n\n return {\n declaration,\n type: checker.getTypeOfSymbolAtLocation(propertySymbol, declaration ?? node),\n optional:\n !!(propertySymbol.flags & ts.SymbolFlags.Optional) ||\n (declaration !== undefined &&\n \"questionToken\" in declaration &&\n declaration.questionToken !== undefined),\n };\n}\n\nfunction isLocalTypeParameterName(\n node: DiscriminatorDeclarationNode,\n typeParameterName: string\n): boolean {\n return (\n node.typeParameters?.some((typeParameter) => typeParameter.name.text === typeParameterName) ??\n false\n );\n}\n\nfunction isNullishSemanticType(type: ts.Type): boolean {\n if (\n type.flags &\n (ts.TypeFlags.Null |\n ts.TypeFlags.Undefined |\n ts.TypeFlags.Void |\n ts.TypeFlags.Unknown |\n ts.TypeFlags.Any)\n ) {\n return true;\n }\n\n return type.isUnion() && type.types.some((member) => isNullishSemanticType(member));\n}\n\nfunction isStringLikeSemanticType(\n type: ts.Type,\n checker: ts.TypeChecker,\n seen = new Set<ts.Type>()\n): boolean {\n if (seen.has(type)) {\n return false;\n }\n seen.add(type);\n\n if (type.flags & ts.TypeFlags.StringLike) {\n return true;\n }\n\n if (type.isUnion()) {\n return (\n type.types.length > 0 &&\n type.types.every((member) => isStringLikeSemanticType(member, checker, seen))\n );\n }\n\n const baseConstraint = checker.getBaseConstraintOfType(type);\n if (baseConstraint !== undefined && baseConstraint !== type) {\n return isStringLikeSemanticType(baseConstraint, checker, seen);\n }\n\n return false;\n}\n\nfunction getObjectLikeTypeAliasMembers(typeNode: ts.TypeNode): readonly ts.TypeElement[] | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return getObjectLikeTypeAliasMembers(typeNode.type);\n }\n\n if (ts.isTypeLiteralNode(typeNode)) {\n return [...typeNode.members];\n }\n\n if (ts.isIntersectionTypeNode(typeNode)) {\n const members: ts.TypeElement[] = [];\n for (const intersectionMember of typeNode.types) {\n const resolvedMembers = getObjectLikeTypeAliasMembers(intersectionMember);\n if (resolvedMembers === null) {\n return null;\n }\n members.push(...resolvedMembers);\n }\n return members;\n }\n\n return null;\n}\n\nfunction extractDiscriminatorDirective(\n node: DiscriminatorDeclarationNode,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[]\n): DiscriminatorDirective | null {\n const discriminatorTags = getLeadingParsedTags(node).filter(\n (tag) => tag.normalizedTagName === \"discriminator\"\n );\n if (discriminatorTags.length === 0) {\n return null;\n }\n\n const [firstTag, ...duplicateTags] = discriminatorTags;\n for (const _duplicateTag of duplicateTags) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"DUPLICATE_TAG\",\n 'Duplicate \"@discriminator\" tag. Only one discriminator declaration is allowed per declaration.',\n provenanceForNode(node, file)\n )\n );\n }\n\n if (firstTag === undefined) {\n return null;\n }\n\n const firstTarget = firstTag.target;\n if (firstTarget?.path === null || firstTarget?.valid !== true) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" requires a direct path target like \":kind\".',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n if (firstTarget.path.segments.length !== 1) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" only supports direct property targets in v1; nested paths are out of scope.',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n const typeParameterName = firstTag.argumentText.trim();\n if (!/^[A-Za-z_$][\\w$]*$/u.test(typeParameterName)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n 'Tag \"@discriminator\" requires a local type parameter name as its source operand.',\n provenanceForNode(node, file)\n )\n );\n return null;\n }\n\n return {\n fieldName: firstTarget.path.segments[0] ?? firstTarget.rawText,\n typeParameterName,\n provenance: provenanceForNode(node, file),\n };\n}\n\nfunction validateDiscriminatorDirective(\n node: DiscriminatorDeclarationNode,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[]\n): DiscriminatorDirective | null {\n const directive = extractDiscriminatorDirective(node, file, diagnostics);\n if (directive === null) {\n return null;\n }\n\n if (!isLocalTypeParameterName(node, directive.typeParameterName)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n `Tag \"@discriminator\" references \"${directive.typeParameterName}\", but the source operand must be a type parameter declared on the same declaration.`,\n directive.provenance\n )\n );\n return null;\n }\n\n const property = resolveDiscriminatorProperty(node, checker, directive.fieldName);\n if (property === null) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"UNKNOWN_PATH_TARGET\",\n `Tag \"@discriminator\" targets \"${directive.fieldName}\", but no direct property with that name exists on this declaration.`,\n directive.provenance\n )\n );\n return null;\n }\n\n if (property.optional) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must be required; optional discriminator fields are not supported.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n if (isNullishSemanticType(property.type)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must not be nullable.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n if (!isStringLikeSemanticType(property.type, checker)) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"TYPE_MISMATCH\",\n `Discriminator field \"${directive.fieldName}\" must be string-like.`,\n directive.provenance,\n property.declaration !== undefined ? [provenanceForNode(property.declaration, file)] : []\n )\n );\n return null;\n }\n\n return directive;\n}\n\nfunction getConcreteTypeArgumentForDiscriminator(\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n typeParameterName: string\n): ts.Type | null {\n const typeParameterIndex =\n node.typeParameters?.findIndex(\n (typeParameter) => typeParameter.name.text === typeParameterName\n ) ?? -1;\n if (typeParameterIndex < 0) {\n return null;\n }\n\n const referenceTypeArguments =\n (isTypeReference(subjectType) ? subjectType.typeArguments : undefined) ??\n (subjectType as ts.Type & { aliasTypeArguments?: readonly ts.Type[] }).aliasTypeArguments;\n if (referenceTypeArguments?.[typeParameterIndex] !== undefined) {\n return referenceTypeArguments[typeParameterIndex] ?? null;\n }\n\n const localTypeParameter = node.typeParameters?.[typeParameterIndex];\n return localTypeParameter === undefined ? null : checker.getTypeAtLocation(localTypeParameter);\n}\n\nfunction resolveLiteralDiscriminatorPropertyValue(\n boundType: ts.Type,\n propertyName: string,\n checker: ts.TypeChecker,\n provenance: Provenance,\n diagnostics: ConstraintSemanticDiagnostic[]\n): string | null | undefined {\n const propertySymbol = boundType.getProperty(propertyName);\n if (propertySymbol === undefined) {\n return undefined;\n }\n\n const declaration = propertySymbol.valueDeclaration ?? propertySymbol.declarations?.[0];\n const anchorNode = declaration ?? boundType.symbol.declarations?.[0] ?? null;\n const resolvedAnchorNode = anchorNode ?? resolveNamedDiscriminatorDeclaration(boundType, checker);\n if (resolvedAnchorNode === null) {\n return undefined;\n }\n const propertyType = checker.getTypeOfSymbolAtLocation(propertySymbol, resolvedAnchorNode);\n\n if (propertyType.isStringLiteral()) {\n return propertyType.value;\n }\n\n if (propertyType.isUnion()) {\n const nonNullMembers = propertyType.types.filter(\n (member) => !(member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n if (nonNullMembers.length > 0 && nonNullMembers.every((member) => member.isStringLiteral())) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution for union-valued identity properties is out of scope for v1.\",\n provenance\n )\n );\n return null;\n }\n }\n\n return undefined;\n}\n\nfunction getDiscriminatorIdentityPropertyNames(fieldName: string): readonly string[] {\n return fieldName === \"object\" ? [\"object\"] : [fieldName, \"object\"];\n}\n\nfunction resolveDiscriminatorApiName(\n boundType: ts.Type,\n checker: ts.TypeChecker,\n metadataPolicy: AnalyzerMetadataPolicy\n): ResolvedScalarMetadata | undefined {\n const declaration = resolveNamedDiscriminatorDeclaration(boundType, checker);\n if (declaration === null) {\n return undefined;\n }\n\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n getDiscriminatorLogicalName(boundType, declaration, checker),\n declaration,\n checker,\n undefined,\n {\n checker,\n declaration,\n subjectType: boundType,\n }\n );\n return metadata?.apiName;\n}\n\nfunction applyDiscriminatorApiNamePrefix(\n value: string,\n discriminatorOptions: DiscriminatorResolutionOptions | undefined\n): string {\n const prefix = discriminatorOptions?.apiNamePrefix;\n return prefix === undefined || prefix === \"\" ? value : `${prefix}${value}`;\n}\n\nfunction resolveNamedDiscriminatorDeclaration(\n type: ts.Type,\n checker: ts.TypeChecker,\n seen = new Set<ts.Type>()\n): ts.Declaration | null {\n if (seen.has(type)) {\n return null;\n }\n seen.add(type);\n\n const symbol = type.aliasSymbol ?? type.getSymbol();\n if (symbol !== undefined) {\n const aliased =\n symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : undefined;\n const targetSymbol = aliased ?? symbol;\n const declaration = targetSymbol.declarations?.find(\n (candidate) =>\n ts.isClassDeclaration(candidate) ||\n ts.isInterfaceDeclaration(candidate) ||\n ts.isTypeAliasDeclaration(candidate) ||\n ts.isEnumDeclaration(candidate)\n );\n if (declaration !== undefined) {\n if (\n ts.isTypeAliasDeclaration(declaration) &&\n ts.isTypeReferenceNode(declaration.type) &&\n checker.getTypeFromTypeNode(declaration.type) !== type\n ) {\n return resolveNamedDiscriminatorDeclaration(\n checker.getTypeFromTypeNode(declaration.type),\n checker,\n seen\n );\n }\n return declaration;\n }\n }\n\n return null;\n}\n\nfunction resolveDiscriminatorValue(\n boundType: ts.Type | null,\n fieldName: string,\n checker: ts.TypeChecker,\n provenance: Provenance,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): string | null {\n if (boundType === null) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution failed because no concrete type argument is available for the referenced type parameter.\",\n provenance\n )\n );\n return null;\n }\n\n if (boundType.isStringLiteral()) {\n return boundType.value;\n }\n\n if (boundType.isUnion()) {\n const nonNullMembers = boundType.types.filter(\n (member) => !(member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n if (nonNullMembers.every((member) => member.isStringLiteral())) {\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution for unions of string literals is out of scope for v1.\",\n provenance\n )\n );\n return null;\n }\n }\n\n for (const identityPropertyName of getDiscriminatorIdentityPropertyNames(fieldName)) {\n const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(\n boundType,\n identityPropertyName,\n checker,\n provenance,\n diagnostics\n );\n if (literalIdentityValue === null) {\n return null;\n }\n if (literalIdentityValue !== undefined) {\n return literalIdentityValue;\n }\n }\n\n const apiName = resolveDiscriminatorApiName(boundType, checker, metadataPolicy);\n if (apiName?.source === \"explicit\") {\n return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);\n }\n if (apiName?.source === \"inferred\") {\n return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);\n }\n\n diagnostics.push(\n makeAnalysisDiagnostic(\n \"INVALID_TAG_ARGUMENT\",\n \"Discriminator resolution could not derive a JSON-facing discriminator value from the referenced type argument.\",\n provenance\n )\n );\n return null;\n}\n\nfunction getDeclarationName(node: ts.Declaration): string {\n if (\n ts.isClassDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isEnumDeclaration(node)\n ) {\n return node.name?.text ?? \"anonymous\";\n }\n\n return \"anonymous\";\n}\n\nfunction getResolvedTypeArguments(type: ts.Type): readonly ts.Type[] {\n return (\n (isTypeReference(type) ? type.typeArguments : undefined) ??\n (type as ts.Type & { aliasTypeArguments?: readonly ts.Type[] }).aliasTypeArguments ??\n []\n );\n}\n\nfunction getDiscriminatorLogicalName(\n type: ts.Type,\n declaration: ts.Declaration,\n checker: ts.TypeChecker\n): string {\n const baseName = getDeclarationName(declaration);\n const typeArguments = getResolvedTypeArguments(type);\n return typeArguments.length === 0\n ? baseName\n : buildInstantiatedReferenceName(baseName, typeArguments, checker);\n}\n\nfunction applyDeclarationDiscriminatorToFields(\n fields: readonly FieldNode[],\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): FieldNode[] {\n const directive = validateDiscriminatorDirective(node, checker, file, diagnostics);\n if (directive === null) {\n return [...fields];\n }\n\n const discriminatorValue = resolveDiscriminatorValue(\n getConcreteTypeArgumentForDiscriminator(\n node,\n subjectType,\n checker,\n directive.typeParameterName\n ),\n directive.fieldName,\n checker,\n directive.provenance,\n diagnostics,\n metadataPolicy\n );\n if (discriminatorValue === null) {\n return [...fields];\n }\n\n return fields.map((field) =>\n field.name === directive.fieldName\n ? {\n ...field,\n type: {\n kind: \"enum\",\n members: [{ value: discriminatorValue }],\n },\n }\n : field\n );\n}\n\nfunction buildInstantiatedReferenceName(\n baseName: string,\n typeArguments: readonly ts.Type[],\n checker: ts.TypeChecker\n): string {\n const renderedArguments = typeArguments\n .map((typeArgument) =>\n checker\n .typeToString(typeArgument)\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n )\n .filter((value) => value !== \"\");\n\n return renderedArguments.length === 0 ? baseName : `${baseName}__${renderedArguments.join(\"__\")}`;\n}\n\nfunction extractReferenceTypeArguments(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode: ts.Node | undefined,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry: ExtensionRegistry | undefined,\n diagnostics: ConstraintSemanticDiagnostic[] | undefined\n): readonly { readonly tsType: ts.Type; readonly typeNode: TypeNode }[] {\n const sourceTypeNode =\n sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (sourceTypeNode === undefined) {\n return [];\n }\n\n const unwrapParentheses = (typeNode: ts.TypeNode): ts.TypeNode =>\n ts.isParenthesizedTypeNode(typeNode) ? unwrapParentheses(typeNode.type) : typeNode;\n\n const directTypeNode = unwrapParentheses(sourceTypeNode);\n const referenceTypeNode = ts.isTypeReferenceNode(directTypeNode)\n ? directTypeNode\n : (() => {\n const resolvedTypeNode = resolveAliasedTypeNode(directTypeNode, checker);\n return ts.isTypeReferenceNode(resolvedTypeNode) ? resolvedTypeNode : null;\n })();\n if (referenceTypeNode?.typeArguments === undefined) {\n return [];\n }\n\n return referenceTypeNode.typeArguments.map((argumentNode) => {\n const argumentType = checker.getTypeFromTypeNode(argumentNode);\n\n // If the type argument is a named type declared outside the current\n // analysis root file, emit a synthetic opaque reference TypeNode\n // instead of recursing into its declaration. This preserves the name\n // for buildInstantiatedReferenceName while avoiding stack overflows on\n // deeply-nested types (e.g. Stripe.Customer) used as phantom parameters\n // (e.g. Ref<T>). Note: this path does NOT populate typeRegistry —\n // callers that need a resolved $defs entry must get it via the parent\n // type's property walk.\n const baseSymbol = argumentType.aliasSymbol ?? argumentType.getSymbol();\n const argumentSymbol =\n baseSymbol !== undefined && baseSymbol.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(baseSymbol)\n : baseSymbol;\n const argumentDecl = argumentSymbol?.declarations?.[0];\n if (argumentDecl !== undefined && argumentDecl.getSourceFile().fileName !== file) {\n const argumentName = argumentSymbol?.getName() ?? baseSymbol?.getName();\n if (argumentName !== undefined) {\n return {\n tsType: argumentType,\n typeNode: {\n kind: \"reference\",\n name: argumentName,\n typeArguments: [],\n },\n };\n }\n }\n\n return {\n tsType: argumentType,\n typeNode: resolveTypeNode(\n argumentType,\n checker,\n file,\n typeRegistry,\n visiting,\n argumentNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n ),\n };\n });\n}\n\nfunction applyDiscriminatorToObjectProperties(\n properties: readonly ObjectProperty[],\n node: DiscriminatorDeclarationNode,\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n diagnostics: ConstraintSemanticDiagnostic[],\n metadataPolicy: AnalyzerMetadataPolicy\n): readonly ObjectProperty[] {\n const directive = validateDiscriminatorDirective(node, checker, file, diagnostics);\n if (directive === null) {\n return properties;\n }\n\n const discriminatorValue = resolveDiscriminatorValue(\n getConcreteTypeArgumentForDiscriminator(\n node,\n subjectType,\n checker,\n directive.typeParameterName\n ),\n directive.fieldName,\n checker,\n directive.provenance,\n diagnostics,\n metadataPolicy\n );\n if (discriminatorValue === null) {\n return properties;\n }\n\n return properties.map((property) =>\n property.name === directive.fieldName\n ? {\n ...property,\n type: {\n kind: \"enum\",\n members: [{ value: discriminatorValue }],\n },\n }\n : property\n );\n}\n\n// =============================================================================\n// IR FIELD ANALYSIS — PRIVATE\n// =============================================================================\n\n/**\n * Analyzes a class property declaration into a canonical IR FieldNode.\n */\nfunction analyzeFieldToIR(\n prop: ts.PropertyDeclaration,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n diagnostics: ConstraintSemanticDiagnostic[],\n hostType: ts.Type,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry?: ExtensionRegistry\n): FieldNode | null {\n if (!ts.isIdentifier(prop.name)) {\n return null;\n }\n\n const name = prop.name.text;\n const tsType = checker.getTypeAtLocation(prop);\n const optional = prop.questionToken !== undefined;\n const provenance = provenanceForNode(prop, file);\n\n // Resolve ts.Type → TypeNode\n let type = resolveTypeNode(\n tsType,\n checker,\n file,\n typeRegistry,\n visiting,\n prop,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n\n // Collect constraints\n const constraints: ConstraintNode[] = [];\n\n // Inherit constraints from type alias declarations (lower precedence)\n if (prop.type && !shouldEmitPrimitiveAliasDefinition(prop.type, checker)) {\n constraints.push(\n ...extractTypeAliasConstraintNodes(prop.type, checker, file, extensionRegistry)\n );\n }\n\n // Extract JSDoc constraints\n const docResult = extractJSDocParseResult(\n prop,\n file,\n makeParseOptions(extensionRegistry, type, checker, tsType, hostType)\n );\n constraints.push(...docResult.constraints);\n diagnostics.push(...docResult.diagnostics);\n\n // Collect annotations\n let annotations: AnnotationNode[] = [];\n\n // JSDoc annotations (@displayName, @deprecated, summary, @remarks)\n annotations.push(...docResult.annotations);\n\n // Default value annotation\n const defaultAnnotation = extractDefaultValueAnnotation(prop.initializer, file);\n if (defaultAnnotation && !annotations.some((a) => a.annotationKind === \"defaultValue\")) {\n annotations.push(defaultAnnotation);\n }\n\n ({ type, annotations } = applyEnumMemberDisplayNames(type, annotations));\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"field\",\n name,\n prop,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: prop,\n subjectType: tsType,\n hostType,\n }\n );\n\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: !optional,\n constraints,\n annotations,\n provenance,\n };\n}\n\n/**\n * Analyzes an interface/type-alias property signature into a canonical IR FieldNode.\n */\nfunction analyzeInterfacePropertyToIR(\n prop: ts.PropertySignature,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n diagnostics: ConstraintSemanticDiagnostic[],\n hostType: ts.Type,\n metadataPolicy: AnalyzerMetadataPolicy,\n extensionRegistry?: ExtensionRegistry\n): FieldNode | null {\n const name = getAnalyzableObjectLikePropertyName(prop.name);\n if (name === null) {\n return null;\n }\n const tsType = checker.getTypeAtLocation(prop);\n const optional = prop.questionToken !== undefined;\n const provenance = provenanceForNode(prop, file);\n\n // Resolve ts.Type → TypeNode\n let type = resolveTypeNode(\n tsType,\n checker,\n file,\n typeRegistry,\n visiting,\n prop,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n\n // Collect constraints\n const constraints: ConstraintNode[] = [];\n\n // Inherit constraints from type alias declarations\n if (prop.type && !shouldEmitPrimitiveAliasDefinition(prop.type, checker)) {\n constraints.push(\n ...extractTypeAliasConstraintNodes(prop.type, checker, file, extensionRegistry)\n );\n }\n\n // JSDoc constraints\n const docResult = extractJSDocParseResult(\n prop,\n file,\n makeParseOptions(extensionRegistry, type, checker, tsType, hostType)\n );\n constraints.push(...docResult.constraints);\n diagnostics.push(...docResult.diagnostics);\n\n // Collect annotations\n let annotations: AnnotationNode[] = [];\n\n // JSDoc annotations (@displayName, @deprecated, summary, @remarks)\n annotations.push(...docResult.annotations);\n\n ({ type, annotations } = applyEnumMemberDisplayNames(type, annotations));\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"field\",\n name,\n prop,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: prop,\n subjectType: tsType,\n hostType,\n }\n );\n\n return {\n kind: \"field\",\n name,\n ...(metadata !== undefined && { metadata }),\n type,\n required: !optional,\n constraints,\n annotations,\n provenance,\n };\n}\n\nfunction findDuplicateObjectLikeTypeAliasPropertyNames(\n members: readonly ts.TypeElement[]\n): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const member of members) {\n if (!ts.isPropertySignature(member)) {\n continue;\n }\n\n const name = getAnalyzableObjectLikePropertyName(member.name);\n if (name === null) {\n continue;\n }\n\n if (seen.has(name)) {\n duplicates.add(name);\n continue;\n }\n\n seen.add(name);\n }\n\n return [...duplicates].sort();\n}\n\nexport function getAnalyzableObjectLikePropertyName(name: ts.PropertyName): string | null {\n if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n\n return null;\n}\n\n/**\n * Rewrites enum-member display-name annotations into EnumMember.displayName\n * values and strips those annotations from the field-level annotation list.\n *\n * The TSDoc surface uses `@displayName :value Label` for enum member labels.\n * Plain `@displayName Label` annotations remain as field-level titles.\n */\nfunction applyEnumMemberDisplayNames(\n type: TypeNode,\n annotations: readonly AnnotationNode[]\n): { type: TypeNode; annotations: AnnotationNode[] } {\n if (\n !annotations.some(\n (annotation) =>\n annotation.annotationKind === \"displayName\" && annotation.value.trim().startsWith(\":\")\n )\n ) {\n return { type, annotations: [...annotations] };\n }\n\n const consumed = new Set<AnnotationNode>();\n const nextType = rewriteEnumDisplayNames(type, annotations, consumed);\n\n if (consumed.size === 0) {\n return { type, annotations: [...annotations] };\n }\n\n return {\n type: nextType,\n annotations: annotations.filter((annotation) => !consumed.has(annotation)),\n };\n}\n\nfunction rewriteEnumDisplayNames(\n type: TypeNode,\n annotations: readonly AnnotationNode[],\n consumed: Set<AnnotationNode>\n): TypeNode {\n switch (type.kind) {\n case \"enum\":\n return applyEnumMemberDisplayNamesToEnum(type, annotations, consumed);\n\n case \"union\": {\n return {\n ...type,\n members: type.members.map((member) =>\n rewriteEnumDisplayNames(member, annotations, consumed)\n ),\n };\n }\n\n default:\n return type;\n }\n}\n\nfunction applyEnumMemberDisplayNamesToEnum(\n type: EnumTypeNode,\n annotations: readonly AnnotationNode[],\n consumed: Set<AnnotationNode>\n): EnumTypeNode {\n const displayNames = new Map<string, string>();\n\n for (const annotation of annotations) {\n if (annotation.annotationKind !== \"displayName\") continue;\n\n const parsed = parseEnumMemberDisplayName(annotation.value);\n if (!parsed) continue;\n\n // Once parsed as a member-target display name, never let it fall back to a\n // field-level title, even if the target value does not exist.\n consumed.add(annotation);\n\n const member = type.members.find((m) => String(m.value) === parsed.value);\n if (!member) continue;\n\n displayNames.set(String(member.value), parsed.label);\n }\n\n if (displayNames.size === 0) {\n return type;\n }\n\n return {\n ...type,\n members: type.members.map((member) => {\n const displayName = displayNames.get(String(member.value));\n return displayName !== undefined ? { ...member, displayName } : member;\n }),\n };\n}\n\nfunction parseEnumMemberDisplayName(value: string): { value: string; label: string } | null {\n const trimmed = value.trim();\n const match = /^:([^\\s]+)\\s+([\\s\\S]+)$/.exec(trimmed);\n if (!match?.[1] || !match[2]) return null;\n\n const label = match[2].trim();\n if (label === \"\") return null;\n\n return { value: match[1], label };\n}\n\n// =============================================================================\n// TYPE RESOLUTION — ts.Type → TypeNode\n// =============================================================================\n\n/**\n * Resolves a TypeScript type to a canonical IR TypeNode.\n */\nexport function resolveTypeNode(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n // Unified custom-type resolution: tries name → symbol → brand in sequence,\n // strips nullish unions, and returns the first match. Shared with\n // `tsdoc-parser.ts`'s path-target broadening check.\n const customTypeLookup = resolveCustomTypeFromTsType(\n type,\n checker,\n extensionRegistry,\n sourceNode\n );\n if (customTypeLookup !== null) {\n return {\n kind: \"custom\",\n typeId: customTypeIdFromLookup(customTypeLookup),\n payload: null,\n };\n }\n const primitiveAlias = tryResolveNamedPrimitiveAlias(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n if (primitiveAlias) {\n return primitiveAlias;\n }\n\n // --- Integer-branded types (must check before Number) ---\n if (_isIntegerBrandedType(type)) {\n return { kind: \"primitive\", primitiveKind: \"integer\" };\n }\n\n // --- Primitives ---\n if (type.flags & ts.TypeFlags.String) {\n return { kind: \"primitive\", primitiveKind: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return { kind: \"primitive\", primitiveKind: \"number\" };\n }\n if (type.flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n return { kind: \"primitive\", primitiveKind: \"bigint\" };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { kind: \"primitive\", primitiveKind: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n if (type.flags & ts.TypeFlags.Undefined) {\n // Undefined maps to null for nullable semantics in JSON Schema\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n if (type.flags & ts.TypeFlags.Void) {\n // Void (e.g. `Promise<void>` return types) maps to null — matches the\n // treatment of `undefined` and avoids collisions with actual `string` types.\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n\n // --- String literal ---\n if (type.isStringLiteral()) {\n return {\n kind: \"enum\",\n members: [{ value: type.value }],\n };\n }\n\n // --- Number literal ---\n if (type.isNumberLiteral()) {\n return {\n kind: \"enum\",\n members: [{ value: type.value }],\n };\n }\n\n // --- Union types ---\n if (type.isUnion()) {\n return resolveUnionType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n // --- Array types ---\n if (checker.isArrayType(type)) {\n return resolveArrayType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n if (isIntersectionType(type)) {\n const sourceTypeNode =\n sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n const resolvedSourceTypeNode =\n sourceTypeNode === undefined ? undefined : resolveAliasedTypeNode(sourceTypeNode, checker);\n if (\n resolvedSourceTypeNode !== undefined &&\n getObjectLikeTypeAliasMembers(resolvedSourceTypeNode) !== null\n ) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n if (\n resolvedSourceTypeNode !== undefined &&\n isResolvableObjectLikeAliasTypeNode(resolvedSourceTypeNode) &&\n isSemanticallyPlainObjectLikeType(type, checker)\n ) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n }\n\n // --- Object types ---\n if (isObjectType(type)) {\n return resolveObjectType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n }\n\n // --- Fallback: treat any/unknown/unresolved types as string ---\n // This includes `any`, `unknown`, type parameters (e.g. `payload: T` inside\n // `Envelope<T>` when walking the declaration), conditional types, indexed\n // access types, and other patterns the analyzer cannot represent in the\n // canonical IR. Promise-unwrapping failures (see `unwrapPromiseType` in\n // `packages/build/src/generators/discovered-schema.ts`) are caught separately\n // to surface the most common cause of silent data loss.\n return { kind: \"primitive\", primitiveKind: \"string\" };\n}\n\nfunction tryResolveNamedPrimitiveAlias(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode | null {\n if (\n !(\n type.flags &\n (ts.TypeFlags.String |\n ts.TypeFlags.Number |\n ts.TypeFlags.BigInt |\n ts.TypeFlags.BigIntLiteral |\n ts.TypeFlags.Boolean |\n ts.TypeFlags.Null)\n ) &&\n !_isIntegerBrandedType(type)\n ) {\n return null;\n }\n\n const aliasDecl =\n type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration) ??\n getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (!aliasDecl) {\n return null;\n }\n\n const aliasName = aliasDecl.name.text;\n if (!typeRegistry[aliasName]) {\n const aliasType = checker.getTypeFromTypeNode(aliasDecl.type);\n const constraints = [\n ...extractJSDocConstraintNodes(aliasDecl, file, makeParseOptions(extensionRegistry)),\n ...extractTypeAliasConstraintNodes(aliasDecl.type, checker, file, extensionRegistry),\n ];\n // Issue #374: collect inheritable annotations (e.g., @format) from the\n // type-alias derivation chain so that `type WorkEmail = BaseEmail` inherits\n // `@format email` from `BaseEmail`.\n const localAnnotations = extractJSDocAnnotationNodes(\n aliasDecl,\n file,\n makeParseOptions(extensionRegistry)\n );\n const inheritedAnnotations = collectInheritedTypeAnnotations(\n aliasDecl,\n localAnnotations,\n checker,\n extensionRegistry\n );\n const annotations = [...localAnnotations, ...inheritedAnnotations];\n const metadata = resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n aliasName,\n aliasDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: aliasDecl,\n subjectType: aliasType,\n }\n );\n typeRegistry[aliasName] = {\n name: aliasName,\n ...(metadata !== undefined && { metadata }),\n type: resolveAliasedPrimitiveTarget(\n aliasType,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n ),\n ...(constraints.length > 0 && { constraints }),\n ...(annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(aliasDecl, file),\n };\n }\n\n return { kind: \"reference\", name: aliasName, typeArguments: [] };\n}\n\nfunction getReferencedTypeAliasDeclaration(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): ts.TypeAliasDeclaration | undefined {\n const typeNode =\n sourceNode &&\n (ts.isPropertyDeclaration(sourceNode) ||\n ts.isPropertySignature(sourceNode) ||\n ts.isParameter(sourceNode))\n ? sourceNode.type\n : undefined;\n if (!typeNode || !ts.isTypeReferenceNode(typeNode)) {\n return undefined;\n }\n\n return getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n}\n\n/**\n * Attempts to recover the original type alias name and declaration for a type\n * that may have lost its `aliasSymbol` due to TypeScript synthesizing a wrapper\n * union (e.g. `Currency | undefined` for an optional property `currency?: Currency`).\n *\n * First tries the standard `getNamedTypeName` / `getNamedTypeDeclaration` lookup.\n * When that fails (returns null), falls back to inspecting the source node's type\n * annotation via `getReferencedTypeAliasDeclaration`.\n *\n * The caller decides what to do with the recovered declaration — this function\n * does NOT filter by whether the alias's underlying type is a union, object, or\n * anything else. That keeps the helper generic and lets callers apply their own\n * constraints.\n *\n * Returns `{ typeName, namedDecl }` on success, or `null` if no alias can be found.\n */\nfunction resolveNamedTypeWithSourceRecovery(\n type: ts.Type,\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): {\n typeName: string;\n namedDecl: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n} | null {\n const typeName = getNamedTypeName(type);\n const namedDecl = getNamedTypeDeclaration(type);\n\n if (typeName !== null && namedDecl !== undefined) {\n return { typeName, namedDecl };\n }\n\n if (sourceNode === undefined) {\n return null;\n }\n\n const refAliasDecl = getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (refAliasDecl === undefined) {\n return null;\n }\n\n return { typeName: refAliasDecl.name.text, namedDecl: refAliasDecl };\n}\n\nfunction shouldEmitPrimitiveAliasDefinition(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker\n): boolean {\n if (!ts.isTypeReferenceNode(typeNode)) {\n return false;\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (!aliasDecl) {\n return false;\n }\n\n const resolved = checker.getTypeFromTypeNode(aliasDecl.type);\n return !!(\n resolved.flags &\n (ts.TypeFlags.String |\n ts.TypeFlags.Number |\n ts.TypeFlags.BigInt |\n ts.TypeFlags.BigIntLiteral |\n ts.TypeFlags.Boolean |\n ts.TypeFlags.Null)\n );\n}\n\nfunction resolveAliasedPrimitiveTarget(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[],\n visitedAliases: Set<ts.TypeAliasDeclaration> = new Set<ts.TypeAliasDeclaration>()\n): TypeNode {\n const nestedAliasDecl = type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration);\n if (nestedAliasDecl !== undefined && !visitedAliases.has(nestedAliasDecl)) {\n visitedAliases.add(nestedAliasDecl);\n return resolveAliasedPrimitiveTarget(\n checker.getTypeFromTypeNode(nestedAliasDecl.type),\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n diagnostics,\n visitedAliases\n );\n }\n\n if (_isIntegerBrandedType(type)) {\n return { kind: \"primitive\", primitiveKind: \"integer\" };\n }\n if (type.flags & ts.TypeFlags.String) {\n return { kind: \"primitive\", primitiveKind: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return { kind: \"primitive\", primitiveKind: \"number\" };\n }\n if (type.flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n return { kind: \"primitive\", primitiveKind: \"bigint\" };\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { kind: \"primitive\", primitiveKind: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { kind: \"primitive\", primitiveKind: \"null\" };\n }\n\n return resolveTypeNode(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n undefined,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n}\n\nfunction resolveUnionType(\n type: ts.UnionType,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n // Recovery for optional properties: TypeScript synthesizes e.g. `Currency | undefined`\n // for `currency?: Currency`, or `Address | undefined` for `addr?: Address`. The\n // synthesized wrapper union loses the `aliasSymbol` from the original alias, so\n // `getNamedTypeName` returns null and the type gets inlined at every usage site\n // instead of being deduplicated into `$defs`.\n //\n // We use the centralized helper to fall back to the source node's type annotation.\n // We then accept the recovery only when the alias's underlying type is a union or an\n // object shape — both cases that `resolveUnionType` handles. Primitive-alias cases\n // (plain primitive flags) and branded intersection types (e.g. `Integer`) are excluded\n // because they are handled by `tryResolveNamedPrimitiveAlias` on a per-member basis.\n // See `resolveNamedTypeWithSourceRecovery` for the fallback mechanism.\n const recovered = resolveNamedTypeWithSourceRecovery(type, sourceNode, checker);\n let typeName: string | null = null;\n let namedDecl:\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration\n | undefined;\n if (recovered !== null) {\n const recoveredAliasDecl = ts.isTypeAliasDeclaration(recovered.namedDecl)\n ? recovered.namedDecl\n : undefined;\n if (recoveredAliasDecl !== undefined) {\n const aliasUnderlyingType = checker.getTypeFromTypeNode(recoveredAliasDecl.type);\n // Accept recovery only for non-generic union or object-shape aliases.\n // - Generic aliases (e.g. `Ref<T>`) are excluded because recovering the raw alias\n // name loses type arguments, which would produce an incorrect $ref.\n // - Primitive-alias and branded intersection types (e.g. `Integer`) are excluded\n // because `tryResolveNamedPrimitiveAlias` handles them on a per-member basis.\n const isNonGeneric =\n recoveredAliasDecl.typeParameters === undefined ||\n recoveredAliasDecl.typeParameters.length === 0;\n if (isNonGeneric && (aliasUnderlyingType.isUnion() || isObjectType(aliasUnderlyingType))) {\n typeName = recovered.typeName;\n namedDecl = recovered.namedDecl;\n }\n } else {\n // Non-alias declarations (interfaces, classes): always accept since these\n // have proper symbol-based names and are not primitive aliases.\n typeName = recovered.typeName;\n namedDecl = recovered.namedDecl;\n }\n }\n\n if (typeName && typeName in typeRegistry) {\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n }\n\n const allTypes = type.types;\n const unionMemberTypeNodes = extractUnionMemberTypeNodes(sourceNode, checker);\n const nonNullSourceNodes = unionMemberTypeNodes.filter(\n (memberTypeNode) => !isNullishTypeNode(resolveAliasedTypeNode(memberTypeNode, checker))\n );\n const nonNullTypes = allTypes.filter(\n (memberType) => !(memberType.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))\n );\n const nonNullMembers = nonNullTypes.map((memberType, index) => ({\n memberType,\n sourceNode:\n nonNullSourceNodes.length === nonNullTypes.length ? nonNullSourceNodes[index] : undefined,\n }));\n const hasNull = allTypes.some((t) => t.flags & ts.TypeFlags.Null);\n const memberDisplayNames = new Map<string, string>();\n if (namedDecl) {\n for (const [value, label] of extractDisplayNameMetadata(namedDecl).memberDisplayNames) {\n memberDisplayNames.set(value, label);\n }\n }\n if (sourceNode) {\n for (const [value, label] of extractDisplayNameMetadata(sourceNode).memberDisplayNames) {\n memberDisplayNames.set(value, label);\n }\n }\n\n const registerNamed = (result: TypeNode): TypeNode => {\n if (!typeName) {\n return result;\n }\n // If the inner resolution (e.g. resolveObjectType on a recursive alias) already\n // finalized a proper body under this name, don't overwrite it with the reference\n // node we synthesized here — that would destroy the real `$defs` entry and leave\n // a dangling self-reference like `{ \"Tree\": { \"$ref\": \"#/$defs/Tree\" } }`.\n const existing = typeRegistry[typeName];\n if (existing !== undefined && existing.type !== RESOLVING_TYPE_PLACEHOLDER) {\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n }\n const annotations = namedDecl\n ? extractNamedTypeAnnotations(namedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n namedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n typeName,\n namedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: namedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[typeName] = {\n name: typeName,\n ...(metadata !== undefined && { metadata }),\n type: result,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(namedDecl ?? sourceNode, file),\n };\n return { kind: \"reference\", name: typeName, typeArguments: [] };\n };\n\n const applyMemberLabels = (members: readonly (string | number)[]): EnumMember[] =>\n members.map((value) => {\n const displayName = memberDisplayNames.get(String(value));\n return displayName !== undefined ? { value, displayName } : { value };\n });\n\n const isBooleanUnion =\n nonNullTypes.length === 2 && nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral);\n\n if (isBooleanUnion) {\n const boolNode: TypeNode = { kind: \"primitive\", primitiveKind: \"boolean\" };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [boolNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : boolNode;\n return registerNamed(result);\n }\n\n const allStringLiterals = nonNullTypes.every((t) => t.isStringLiteral());\n if (allStringLiterals && nonNullTypes.length > 0) {\n const stringTypes = nonNullTypes.filter((t): t is ts.StringLiteralType => t.isStringLiteral());\n const enumNode: TypeNode = {\n kind: \"enum\",\n members: applyMemberLabels(stringTypes.map((t) => t.value)),\n };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [enumNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : enumNode;\n return registerNamed(result);\n }\n\n const allNumberLiterals = nonNullTypes.every((t) => t.isNumberLiteral());\n if (allNumberLiterals && nonNullTypes.length > 0) {\n const numberTypes = nonNullTypes.filter((t): t is ts.NumberLiteralType => t.isNumberLiteral());\n const enumNode: TypeNode = {\n kind: \"enum\",\n members: applyMemberLabels(numberTypes.map((t) => t.value)),\n };\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [enumNode, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : enumNode;\n return registerNamed(result);\n }\n\n if (nonNullMembers.length === 1 && nonNullMembers[0]) {\n const inner = resolveTypeNode(\n nonNullMembers[0].memberType,\n checker,\n file,\n typeRegistry,\n visiting,\n nonNullMembers[0].sourceNode ?? sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n const result: TypeNode = hasNull\n ? {\n kind: \"union\",\n members: [inner, { kind: \"primitive\", primitiveKind: \"null\" }],\n }\n : inner;\n return registerNamed(result);\n }\n\n const members = nonNullMembers.map(({ memberType, sourceNode: memberSourceNode }) =>\n resolveTypeNode(\n memberType,\n checker,\n file,\n typeRegistry,\n visiting,\n memberSourceNode ?? sourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n )\n );\n if (hasNull) {\n members.push({ kind: \"primitive\", primitiveKind: \"null\" });\n }\n return registerNamed({ kind: \"union\", members });\n}\n\nfunction resolveArrayType(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n const typeArgs = isTypeReference(type) ? type.typeArguments : undefined;\n const elementType = typeArgs?.[0];\n const elementSourceNode = extractArrayElementTypeNode(sourceNode, checker);\n\n const items = elementType\n ? resolveTypeNode(\n elementType,\n checker,\n file,\n typeRegistry,\n visiting,\n elementSourceNode,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n )\n : ({ kind: \"primitive\", primitiveKind: \"string\" } satisfies TypeNode);\n\n return { kind: \"array\", items };\n}\n\n/**\n * Returns a `RecordTypeNode` if `type` is a pure dictionary type (string index\n * signature with no named properties), or `null` otherwise.\n *\n * This handles both `Record<string, T>` (a mapped/aliased type) and inline\n * `{ [k: string]: T }` index signature types per spec 003 §2.5.\n */\nfunction tryResolveRecordType(\n type: ts.ObjectType,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): RecordTypeNode | null {\n // Only types with no named properties qualify as pure dictionaries.\n if (type.getProperties().length > 0) {\n return null;\n }\n const indexInfo = checker.getIndexInfoOfType(type, ts.IndexKind.String);\n if (!indexInfo) {\n return null;\n }\n\n const valueType = resolveTypeNode(\n indexInfo.type,\n checker,\n file,\n typeRegistry,\n visiting,\n undefined,\n metadataPolicy,\n extensionRegistry,\n diagnostics\n );\n return { kind: \"record\", valueType };\n}\n\nfunction typeNodeContainsReference(type: TypeNode, targetName: string): boolean {\n switch (type.kind) {\n case \"reference\":\n return type.name === targetName;\n case \"array\":\n return typeNodeContainsReference(type.items, targetName);\n case \"record\":\n return typeNodeContainsReference(type.valueType, targetName);\n case \"union\":\n return type.members.some((member) => typeNodeContainsReference(member, targetName));\n case \"object\":\n return type.properties.some((property) =>\n typeNodeContainsReference(property.type, targetName)\n );\n case \"primitive\":\n case \"enum\":\n case \"dynamic\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = type;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Determines which resolved object properties are emitted into the Canonical IR.\n * Properties starting with `__` are excluded — they are reserved for phantom/brand type markers\n * (e.g., `__type` in `Ref<T>`) that carry type information at the TypeScript level but must not\n * appear in generated JSON Schema. This also excludes symbol-keyed properties, which TypeScript\n * represents internally with `__@`-prefixed names. The declaration-name checks below handle\n * other computed, private, or otherwise unsupported property name forms.\n */\nfunction shouldEmitResolvedObjectProperty(\n property: ts.Symbol,\n declaration: ts.Declaration | undefined\n): boolean {\n if (property.name.startsWith(\"__\")) {\n return false;\n }\n\n if (declaration !== undefined && \"name\" in declaration && declaration.name !== undefined) {\n const name = declaration.name as ts.PropertyName;\n if (ts.isComputedPropertyName(name) || ts.isPrivateIdentifier(name)) {\n return false;\n }\n\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name) && !ts.isNumericLiteral(name)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * If `sourceNode` carries a type annotation that is a \"pass-through\" type\n * alias whose identity should be preserved in `$defs`, returns the alias's\n * name and declaration. Returns `undefined` otherwise.\n *\n * A pass-through alias is one whose body is a `TypeReference` (`type Foo =\n * Bar`) rather than a structural type (type literal, intersection, etc.).\n * Structural aliases are already handled via the normal registration path.\n *\n * Identity preservation is gated on the alias carrying an **inheritable\n * type-level annotation** (either locally or inherited through the alias\n * chain) — today that means `@format` (issue #374). Aliases with only\n * path-targeted constraints like `@minimum :field N` (issue #364) collapse\n * to the base type so sibling-keyword composition works against the base's\n * `$defs` entry.\n */\nfunction getPassThroughTypeAliasFromSourceNode(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined,\n resolvedTypeName: string | undefined\n): { aliasName: string; aliasDecl: ts.TypeAliasDeclaration } | undefined {\n const aliasDecl = getReferencedTypeAliasDeclaration(sourceNode, checker);\n if (!aliasDecl) return undefined;\n\n const aliasName = aliasDecl.name.text;\n // Skip if the alias name already matches the resolved type name — no wrapping needed.\n if (aliasName === resolvedTypeName) return undefined;\n\n // Only treat as pass-through if the alias body is itself a type reference\n // (not a structural type like `type Foo = { ... }` or `type Foo = A & B`).\n if (!ts.isTypeReferenceNode(aliasDecl.type)) return undefined;\n\n // Preserve alias identity only when the alias carries an inheritable\n // type-level annotation (local or inherited). Aliases that carry only\n // path-targeted constraints must collapse to the base so #364's $ref +\n // sibling composition still resolves against the base's $defs entry.\n if (!hasInheritableTypeAnnotation(aliasDecl, checker, extensionRegistry)) {\n return undefined;\n }\n\n return { aliasName, aliasDecl };\n}\n\n/**\n * Returns `true` when `aliasDecl` carries an inheritable type-level\n * annotation (currently only `@format`), either locally or reachable through\n * the alias / heritage chain. Used to decide whether a pass-through alias\n * warrants its own `$defs` entry (issue #374) or should collapse to the\n * base type (issue #364 sibling-keyword composition).\n */\nfunction hasInheritableTypeAnnotation(\n aliasDecl: ts.TypeAliasDeclaration,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry | undefined\n): boolean {\n const file = aliasDecl.getSourceFile().fileName;\n const local = extractJSDocAnnotationNodes(aliasDecl, file, makeParseOptions(extensionRegistry));\n for (const annotation of local) {\n if (!INHERITABLE_TYPE_ANNOTATION_KINDS.has(annotation.annotationKind)) continue;\n if (!isOverridingInheritableAnnotation(annotation)) continue;\n return true;\n }\n const inherited = collectInheritedTypeAnnotations(aliasDecl, local, checker, extensionRegistry);\n for (const annotation of inherited) {\n if (INHERITABLE_TYPE_ANNOTATION_KINDS.has(annotation.annotationKind)) return true;\n }\n return false;\n}\n\nfunction resolveObjectType(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n sourceNode?: ts.Node,\n metadataPolicy: AnalyzerMetadataPolicy = createAnalyzerMetadataPolicy(undefined),\n extensionRegistry?: ExtensionRegistry,\n diagnostics?: ConstraintSemanticDiagnostic[]\n): TypeNode {\n const collectedDiagnostics = diagnostics ?? [];\n const typeName = getNamedTypeName(type);\n const namedTypeName = typeName ?? undefined;\n const namedDecl = getNamedTypeDeclaration(type);\n\n // Issue #374: if the source node carries a \"pass-through\" type alias\n // (e.g. `type PositiveMonetaryAmount = MonetaryAmount`) that carries an\n // inheritable type-level annotation (e.g. `@format`) either locally or\n // via its alias chain, prefer the alias name and declaration as the\n // registry identity. This preserves alias identity in `$defs` and lets\n // annotation inheritance flow from the chain (see\n // `extractNamedTypeAnnotations`). Aliases with only path-targeted\n // constraints intentionally collapse to the base so issue #364's\n // $ref + sibling-keyword composition resolves against the base's\n // $defs entry.\n const passThroughAlias = getPassThroughTypeAliasFromSourceNode(\n sourceNode,\n checker,\n extensionRegistry,\n namedTypeName\n );\n const effectiveTypeName = passThroughAlias?.aliasName ?? namedTypeName;\n const effectiveNamedDecl = passThroughAlias?.aliasDecl ?? namedDecl;\n const referenceTypeArguments = extractReferenceTypeArguments(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n sourceNode,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n );\n const instantiatedTypeName =\n effectiveTypeName !== undefined && referenceTypeArguments.length > 0\n ? buildInstantiatedReferenceName(\n effectiveTypeName,\n referenceTypeArguments.map((argument) => argument.tsType),\n checker\n )\n : undefined;\n const registryTypeName = instantiatedTypeName ?? effectiveTypeName;\n const shouldRegisterNamedType =\n registryTypeName !== undefined &&\n !(registryTypeName === \"Record\" && effectiveNamedDecl?.getSourceFile().fileName !== file);\n const clearNamedTypeRegistration = (): void => {\n if (registryTypeName === undefined || !shouldRegisterNamedType) {\n return;\n }\n Reflect.deleteProperty(typeRegistry, registryTypeName);\n };\n\n if (visiting.has(type)) {\n // Recursive object expansion is deferred through the named-type registry.\n // Anonymous cycles still collapse to a closed empty object sentinel.\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n return { kind: \"object\", properties: [], additionalProperties: false };\n }\n\n // Seed the registry with a placeholder before traversing children so any\n // recursive property reference can resolve to a stable `$ref`.\n if (\n registryTypeName !== undefined &&\n shouldRegisterNamedType &&\n !typeRegistry[registryTypeName]\n ) {\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n type: RESOLVING_TYPE_PLACEHOLDER,\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n }\n\n visiting.add(type);\n\n // Detect previously resolved named types before walking the object body.\n if (\n registryTypeName !== undefined &&\n shouldRegisterNamedType &&\n typeRegistry[registryTypeName]?.type !== undefined\n ) {\n if (typeRegistry[registryTypeName].type !== RESOLVING_TYPE_PLACEHOLDER) {\n visiting.delete(type);\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n }\n\n // Detect pure dictionary types (Record<string, T> or { [k: string]: T })\n // after the recursion guard/placeholder setup so recursive records can point\n // back at the named type instead of collapsing to an empty object.\n const recordNode = isObjectType(type)\n ? tryResolveRecordType(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n )\n : null;\n if (recordNode) {\n visiting.delete(type);\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n const isRecursiveRecord = typeNodeContainsReference(recordNode.valueType, registryTypeName);\n if (!isRecursiveRecord) {\n clearNamedTypeRegistration();\n return recordNode;\n }\n const annotations = effectiveNamedDecl\n ? extractNamedTypeAnnotations(effectiveNamedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n effectiveNamedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n registryTypeName,\n effectiveNamedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: effectiveNamedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n ...(metadata !== undefined && { metadata }),\n type: recordNode,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n return recordNode;\n }\n\n const properties: ObjectProperty[] = [];\n\n // Get FieldInfo-level analysis from named type declarations for constraint propagation\n const fieldInfoMap = getNamedTypeFieldNodeInfoMap(\n type,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n collectedDiagnostics,\n extensionRegistry\n );\n\n for (const prop of type.getProperties()) {\n const declaration = prop.valueDeclaration ?? prop.declarations?.[0];\n if (!declaration) continue;\n if (!shouldEmitResolvedObjectProperty(prop, declaration)) continue;\n\n const propType = checker.getTypeOfSymbolAtLocation(prop, declaration);\n const optional = !!(prop.flags & ts.SymbolFlags.Optional);\n const propTypeNode = resolveTypeNode(\n propType,\n checker,\n file,\n typeRegistry,\n visiting,\n declaration,\n metadataPolicy,\n extensionRegistry,\n collectedDiagnostics\n );\n\n // Get constraints and annotations from the declaration if available\n const fieldNodeInfo = fieldInfoMap?.get(prop.name);\n const inlineFieldNodeInfo =\n fieldNodeInfo === undefined\n ? ts.isPropertySignature(declaration)\n ? analyzeInterfacePropertyToIR(\n declaration,\n checker,\n file,\n typeRegistry,\n visiting,\n collectedDiagnostics,\n type,\n metadataPolicy,\n extensionRegistry\n )\n : ts.isPropertyDeclaration(declaration)\n ? analyzeFieldToIR(\n declaration,\n checker,\n file,\n typeRegistry,\n visiting,\n collectedDiagnostics,\n type,\n metadataPolicy,\n extensionRegistry\n )\n : null\n : null;\n const resolvedFieldNodeInfo = fieldNodeInfo ?? inlineFieldNodeInfo;\n const resolvedPropertyType = inlineFieldNodeInfo?.type ?? propTypeNode;\n\n properties.push({\n name: prop.name,\n ...(resolvedFieldNodeInfo?.metadata !== undefined && {\n metadata: resolvedFieldNodeInfo.metadata,\n }),\n type: resolvedPropertyType,\n optional,\n constraints: resolvedFieldNodeInfo?.constraints ?? [],\n annotations: resolvedFieldNodeInfo?.annotations ?? [],\n provenance: resolvedFieldNodeInfo?.provenance ?? provenanceForFile(file),\n });\n }\n\n visiting.delete(type);\n\n const objectNode: TypeNode = {\n kind: \"object\",\n properties:\n effectiveNamedDecl !== undefined &&\n (ts.isClassDeclaration(effectiveNamedDecl) ||\n ts.isInterfaceDeclaration(effectiveNamedDecl) ||\n ts.isTypeAliasDeclaration(effectiveNamedDecl))\n ? applyDiscriminatorToObjectProperties(\n properties,\n effectiveNamedDecl,\n type,\n checker,\n file,\n collectedDiagnostics,\n metadataPolicy\n )\n : properties,\n additionalProperties: true,\n };\n\n // Register named types\n if (registryTypeName !== undefined && shouldRegisterNamedType) {\n const annotations = effectiveNamedDecl\n ? extractNamedTypeAnnotations(effectiveNamedDecl, checker, file, extensionRegistry)\n : undefined;\n const metadata =\n effectiveNamedDecl !== undefined\n ? resolveNodeMetadata(\n metadataPolicy,\n \"type\",\n registryTypeName,\n effectiveNamedDecl,\n checker,\n extensionRegistry,\n {\n checker,\n declaration: effectiveNamedDecl,\n subjectType: type,\n }\n )\n : undefined;\n typeRegistry[registryTypeName] = {\n name: registryTypeName,\n ...(metadata !== undefined && { metadata }),\n type: objectNode,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n provenance: provenanceForDeclaration(effectiveNamedDecl, file),\n };\n return {\n kind: \"reference\",\n name: registryTypeName,\n typeArguments: referenceTypeArguments.map((argument) => argument.typeNode),\n };\n }\n\n return objectNode;\n}\n\n// =============================================================================\n// NAMED TYPE FIELD INFO MAP — for nested constraint propagation\n// =============================================================================\n\ninterface FieldNodeInfo {\n readonly metadata?: ResolvedMetadata;\n readonly constraints: readonly ConstraintNode[];\n readonly annotations: readonly AnnotationNode[];\n readonly provenance: Provenance;\n}\n\n/**\n * Builds a map from property name to constraint/annotation info for named types.\n * This enables propagating TSDoc constraints from nested type declarations.\n */\nfunction getNamedTypeFieldNodeInfoMap(\n type: ts.Type,\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy,\n diagnostics: ConstraintSemanticDiagnostic[],\n extensionRegistry?: ExtensionRegistry\n): Map<string, FieldNodeInfo> | null {\n const symbols = [type.getSymbol(), type.aliasSymbol].filter(\n (s): s is ts.Symbol => s?.declarations != null && s.declarations.length > 0\n );\n\n for (const symbol of symbols) {\n const declarations = symbol.declarations;\n if (!declarations) continue;\n\n // Try class declaration\n const classDecl = declarations.find(ts.isClassDeclaration);\n if (classDecl) {\n const map = new Map<string, FieldNodeInfo>();\n const hostType = checker.getTypeAtLocation(classDecl);\n for (const member of classDecl.members) {\n if (ts.isPropertyDeclaration(member) && ts.isIdentifier(member.name)) {\n const fieldNode = analyzeFieldToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n hostType,\n metadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n map.set(fieldNode.name, {\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n constraints: [...fieldNode.constraints],\n annotations: [...fieldNode.annotations],\n provenance: fieldNode.provenance,\n });\n }\n }\n }\n return map;\n }\n\n // Try interface declaration\n const interfaceDecl = declarations.find(ts.isInterfaceDeclaration);\n if (interfaceDecl) {\n return buildFieldNodeInfoMap(\n interfaceDecl.members,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n checker.getTypeAtLocation(interfaceDecl),\n diagnostics,\n extensionRegistry\n );\n }\n\n // Try type alias with type literal body\n const typeAliasDecl = declarations.find(ts.isTypeAliasDeclaration);\n const typeAliasMembers =\n typeAliasDecl === undefined ? null : getObjectLikeTypeAliasMembers(typeAliasDecl.type);\n if (typeAliasDecl && typeAliasMembers !== null) {\n return buildFieldNodeInfoMap(\n typeAliasMembers,\n checker,\n file,\n typeRegistry,\n visiting,\n metadataPolicy,\n checker.getTypeAtLocation(typeAliasDecl),\n diagnostics,\n extensionRegistry\n );\n }\n }\n\n return null;\n}\n\nfunction extractArrayElementTypeNode(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): ts.TypeNode | undefined {\n const typeNode = sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (typeNode === undefined) {\n return undefined;\n }\n const resolvedTypeNode = resolveAliasedTypeNode(typeNode, checker);\n if (ts.isArrayTypeNode(resolvedTypeNode)) {\n return resolvedTypeNode.elementType;\n }\n if (\n ts.isTypeReferenceNode(resolvedTypeNode) &&\n ts.isIdentifier(resolvedTypeNode.typeName) &&\n resolvedTypeNode.typeName.text === \"Array\" &&\n resolvedTypeNode.typeArguments?.[0]\n ) {\n return resolvedTypeNode.typeArguments[0];\n }\n return undefined;\n}\n\nfunction extractUnionMemberTypeNodes(\n sourceNode: ts.Node | undefined,\n checker: ts.TypeChecker\n): readonly ts.TypeNode[] {\n const typeNode = sourceNode === undefined ? undefined : extractTypeNodeFromSource(sourceNode);\n if (!typeNode) {\n return [];\n }\n const resolvedTypeNode = resolveAliasedTypeNode(typeNode, checker);\n return ts.isUnionTypeNode(resolvedTypeNode) ? [...resolvedTypeNode.types] : [];\n}\n\nfunction resolveAliasedTypeNode(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker,\n visited: Set<ts.TypeAliasDeclaration> = new Set<ts.TypeAliasDeclaration>()\n): ts.TypeNode {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return resolveAliasedTypeNode(typeNode.type, checker, visited);\n }\n\n if (!ts.isTypeReferenceNode(typeNode) || !ts.isIdentifier(typeNode.typeName)) {\n return typeNode;\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (aliasDecl === undefined || visited.has(aliasDecl)) {\n return typeNode;\n }\n\n visited.add(aliasDecl);\n return resolveAliasedTypeNode(aliasDecl.type, checker, visited);\n}\n\nfunction isNullishTypeNode(typeNode: ts.TypeNode): boolean {\n if (\n typeNode.kind === ts.SyntaxKind.NullKeyword ||\n typeNode.kind === ts.SyntaxKind.UndefinedKeyword\n ) {\n return true;\n }\n\n return (\n ts.isLiteralTypeNode(typeNode) &&\n (typeNode.literal.kind === ts.SyntaxKind.NullKeyword ||\n typeNode.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n );\n}\n\nfunction buildFieldNodeInfoMap(\n members: readonly ts.TypeElement[],\n checker: ts.TypeChecker,\n file: string,\n typeRegistry: Record<string, TypeDefinition>,\n visiting: Set<ts.Type>,\n metadataPolicy: AnalyzerMetadataPolicy,\n hostType: ts.Type,\n diagnostics: ConstraintSemanticDiagnostic[],\n extensionRegistry?: ExtensionRegistry\n): Map<string, FieldNodeInfo> {\n const map = new Map<string, FieldNodeInfo>();\n for (const member of members) {\n if (ts.isPropertySignature(member)) {\n const fieldNode = analyzeInterfacePropertyToIR(\n member,\n checker,\n file,\n typeRegistry,\n visiting,\n diagnostics,\n hostType,\n metadataPolicy,\n extensionRegistry\n );\n if (fieldNode) {\n map.set(fieldNode.name, {\n ...(fieldNode.metadata !== undefined && { metadata: fieldNode.metadata }),\n constraints: [...fieldNode.constraints],\n annotations: [...fieldNode.annotations],\n provenance: fieldNode.provenance,\n });\n }\n }\n }\n return map;\n}\n\n// =============================================================================\n// TYPE ALIAS CONSTRAINT PROPAGATION\n// =============================================================================\n\n/** Maximum depth for transitive type alias constraint propagation. */\nconst MAX_ALIAS_CHAIN_DEPTH = 8;\n\n/**\n * Given a type node referencing a type alias, extracts IR ConstraintNodes\n * from the alias declaration's JSDoc tags.\n *\n * Follows alias chains transitively: if `type Percentage = Integer` and\n * `type Integer = number`, constraints from both `Percentage` and `Integer`\n * are collected. Constraints from closer aliases appear first in the result\n * (higher precedence). Recursion is capped at {@link MAX_ALIAS_CHAIN_DEPTH}\n * levels; exceeding the limit throws to surface pathological alias chains.\n */\nfunction extractTypeAliasConstraintNodes(\n typeNode: ts.TypeNode,\n checker: ts.TypeChecker,\n file: string,\n extensionRegistry?: ExtensionRegistry,\n depth = 0\n): ConstraintNode[] {\n if (!ts.isTypeReferenceNode(typeNode)) return [];\n\n if (depth >= MAX_ALIAS_CHAIN_DEPTH) {\n const aliasName = typeNode.typeName.getText();\n throw new Error(\n `Type alias chain exceeds maximum depth of ${String(MAX_ALIAS_CHAIN_DEPTH)} ` +\n `at alias \"${aliasName}\" in ${file}. ` +\n `Simplify the alias chain or check for circular references.`\n );\n }\n\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (!aliasDecl) return [];\n\n // Don't extract from object type aliases\n if (ts.isTypeLiteralNode(aliasDecl.type)) return [];\n\n const aliasFieldType = resolveTypeNode(\n checker.getTypeAtLocation(aliasDecl.type),\n checker,\n file,\n {},\n new Set<ts.Type>(),\n aliasDecl.type,\n undefined,\n extensionRegistry\n );\n const constraints = extractJSDocConstraintNodes(\n aliasDecl,\n file,\n makeParseOptions(extensionRegistry, aliasFieldType)\n );\n\n // Transitively follow alias chains (e.g., Percentage → Integer → number)\n // Constraints from parent aliases are appended after the immediate alias's\n // constraints, giving the immediate alias higher precedence.\n constraints.push(\n ...extractTypeAliasConstraintNodes(aliasDecl.type, checker, file, extensionRegistry, depth + 1)\n );\n\n return constraints;\n}\n\n// =============================================================================\n// PROVENANCE HELPERS\n// =============================================================================\n\nfunction provenanceForNode(node: ts.Node, file: string): Provenance {\n const sourceFile = node.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n };\n}\n\nfunction provenanceForFile(file: string): Provenance {\n return { surface: \"tsdoc\", file, line: 0, column: 0 };\n}\n\nfunction provenanceForDeclaration(node: ts.Node | undefined, file: string): Provenance {\n if (!node) {\n return provenanceForFile(file);\n }\n return provenanceForNode(node, file);\n}\n\n// =============================================================================\n// NAMED TYPE HELPERS\n// =============================================================================\n\n/**\n * Extracts a stable type name from a ts.Type when it originates from\n * a named declaration (class, interface, or type alias).\n */\nfunction getNamedTypeName(type: ts.Type): string | null {\n const symbol = type.getSymbol();\n if (symbol?.declarations) {\n const decl = symbol.declarations[0];\n if (\n decl &&\n (ts.isClassDeclaration(decl) ||\n ts.isInterfaceDeclaration(decl) ||\n ts.isTypeAliasDeclaration(decl))\n ) {\n const name = ts.isClassDeclaration(decl) ? decl.name?.text : decl.name.text;\n if (name) return name;\n }\n }\n\n const aliasSymbol = type.aliasSymbol;\n if (aliasSymbol?.declarations) {\n const aliasDecl = aliasSymbol.declarations.find(ts.isTypeAliasDeclaration);\n if (aliasDecl) {\n return aliasDecl.name.text;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the declaration that defines a named type, if available.\n */\nfunction getNamedTypeDeclaration(\n type: ts.Type\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | undefined {\n const symbol = type.getSymbol();\n if (symbol?.declarations) {\n const decl = symbol.declarations[0];\n if (\n decl &&\n (ts.isClassDeclaration(decl) ||\n ts.isInterfaceDeclaration(decl) ||\n ts.isTypeAliasDeclaration(decl))\n ) {\n return decl;\n }\n }\n\n const aliasSymbol = type.aliasSymbol;\n if (aliasSymbol?.declarations) {\n return aliasSymbol.declarations.find(ts.isTypeAliasDeclaration);\n }\n\n return undefined;\n}\n\n// =============================================================================\n// SHARED OUTPUT TYPES\n// =============================================================================\n\n/**\n * Analyzed method information.\n */\nexport interface MethodInfo {\n /** Method name */\n name: string;\n /** Method parameters */\n parameters: ParameterInfo[];\n /** Return type node */\n returnTypeNode: ts.TypeNode | undefined;\n /** Resolved return type */\n returnType: ts.Type;\n}\n\n/**\n * Analyzed parameter information.\n */\nexport interface ParameterInfo {\n /** Parameter name */\n name: string;\n /** TypeScript type node */\n typeNode: ts.TypeNode | undefined;\n /** Resolved type */\n type: ts.Type;\n /** If this is InferSchema<typeof X>, the export name X */\n formSpecExportName: string | null;\n /** Whether the parameter is optional (has ? or default value) */\n optional: boolean;\n}\n\n// =============================================================================\n// SHARED HELPERS\n// =============================================================================\n\n/**\n * Analyzes a method declaration to extract method info.\n * Shared between IR and legacy paths.\n */\nfunction analyzeMethod(method: ts.MethodDeclaration, checker: ts.TypeChecker): MethodInfo | null {\n if (!ts.isIdentifier(method.name)) {\n return null;\n }\n\n const name = method.name.text;\n const parameters: ParameterInfo[] = [];\n\n for (const param of method.parameters) {\n if (ts.isIdentifier(param.name)) {\n const paramInfo = analyzeParameter(param, checker);\n parameters.push(paramInfo);\n }\n }\n\n const returnTypeNode = method.type;\n const signature = checker.getSignatureFromDeclaration(method);\n const returnType = signature\n ? checker.getReturnTypeOfSignature(signature)\n : checker.getTypeAtLocation(method);\n\n return { name, parameters, returnTypeNode, returnType };\n}\n\nfunction analyzeParameter(param: ts.ParameterDeclaration, checker: ts.TypeChecker): ParameterInfo {\n const name = ts.isIdentifier(param.name) ? param.name.text : \"param\";\n const typeNode = param.type;\n const type = checker.getTypeAtLocation(param);\n const formSpecExportName = detectFormSpecReference(typeNode);\n const optional = param.questionToken !== undefined || param.initializer !== undefined;\n\n return { name, typeNode, type, formSpecExportName, optional };\n}\n\nfunction detectFormSpecReference(typeNode: ts.TypeNode | undefined): string | null {\n if (!typeNode) return null;\n\n if (!ts.isTypeReferenceNode(typeNode)) return null;\n\n const typeName = ts.isIdentifier(typeNode.typeName)\n ? typeNode.typeName.text\n : ts.isQualifiedName(typeNode.typeName)\n ? typeNode.typeName.right.text\n : null;\n\n if (typeName !== \"InferSchema\" && typeName !== \"InferFormSchema\") return null;\n\n const typeArg = typeNode.typeArguments?.[0];\n if (!typeArg || !ts.isTypeQueryNode(typeArg)) return null;\n\n if (ts.isIdentifier(typeArg.exprName)) {\n return typeArg.exprName.text;\n }\n\n if (ts.isQualifiedName(typeArg.exprName)) {\n return typeArg.exprName.right.text;\n }\n\n return null;\n}\n","/**\n * JSDoc constraint and annotation extractor.\n *\n * Extracts constraints and annotation tags from JSDoc comments on\n * class/interface fields and returns canonical IR nodes directly:\n * - {@link ConstraintNode} for set-influencing tags (@minimum, @pattern, etc.)\n * - {@link AnnotationNode} for value-influencing tags (@displayName, etc.)\n *\n * The IR extraction path uses the official `@microsoft/tsdoc` parser for\n * all canonical tags.\n *\n * Supported constraints correspond to the built-in FormSpec constraint tags\n * (e.g., `@minimum`, `@maximum`, `@pattern`).\n */\n\nimport * as ts from \"typescript\";\nimport type { ConstraintNode, AnnotationNode, JsonValue } from \"@formspec/core/internals\";\nimport {\n parseTSDocTags,\n type ParseTSDocOptions,\n type TSDocParseResult,\n} from \"./tsdoc-parser.js\";\n\n// =============================================================================\n// IR API — uses @microsoft/tsdoc for structured parsing\n// =============================================================================\n\nexport function extractJSDocParseResult(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): TSDocParseResult {\n return parseTSDocTags(node, file, options);\n}\n\n/**\n * Extracts constraints from JSDoc comments on a TypeScript AST node and returns\n * canonical {@link ConstraintNode} objects.\n *\n * Uses the official `@microsoft/tsdoc` parser for structured tag extraction.\n * Constraints are registered as custom block tags in the TSDoc configuration.\n *\n * @param node - The AST node to inspect for JSDoc tags\n * @param file - Absolute path to the source file for provenance\n * @returns Canonical constraint nodes for each valid constraint tag\n */\nexport function extractJSDocConstraintNodes(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): ConstraintNode[] {\n const result = extractJSDocParseResult(node, file, options);\n return [...result.constraints];\n}\n\n/**\n * Extracts canonical annotation tags from a node and returns\n * {@link AnnotationNode} objects.\n *\n * @param node - The AST node to inspect for annotation tags\n * @param file - Absolute path to the source file for provenance\n * @returns Canonical annotation nodes\n */\nexport function extractJSDocAnnotationNodes(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): AnnotationNode[] {\n const result = extractJSDocParseResult(node, file, options);\n return [...result.annotations];\n}\n\n/**\n * Extracts a default value from a property initializer and returns a\n * {@link DefaultValueAnnotationNode} if present.\n *\n * Only extracts literal values (strings, numbers, booleans, null).\n */\nexport function extractDefaultValueAnnotation(\n initializer: ts.Expression | undefined,\n file = \"\"\n): AnnotationNode | null {\n if (!initializer) return null;\n\n let value: JsonValue | undefined;\n\n if (ts.isStringLiteral(initializer)) {\n value = initializer.text;\n } else if (ts.isNumericLiteral(initializer)) {\n value = Number(initializer.text);\n } else if (initializer.kind === ts.SyntaxKind.TrueKeyword) {\n value = true;\n } else if (initializer.kind === ts.SyntaxKind.FalseKeyword) {\n value = false;\n } else if (initializer.kind === ts.SyntaxKind.NullKeyword) {\n value = null;\n } else if (ts.isPrefixUnaryExpression(initializer)) {\n if (\n initializer.operator === ts.SyntaxKind.MinusToken &&\n ts.isNumericLiteral(initializer.operand)\n ) {\n value = -Number(initializer.operand.text);\n }\n }\n\n if (value === undefined) return null;\n\n const sourceFile = initializer.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(initializer.getStart());\n\n return {\n kind: \"annotation\",\n annotationKind: \"defaultValue\",\n value,\n provenance: {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n },\n };\n}\n","/**\n * TSDoc-based structured tag parser.\n *\n * Bridges the TypeScript compiler AST with the official `@microsoft/tsdoc`\n * parser to extract constraint and annotation tags from JSDoc comments\n * on class/interface/type-alias properties.\n *\n * The parser recognises two categories of tags:\n *\n * 1. **Constraint tags** (all alphanumeric, TSDoc-compliant):\n * `@minimum`, `@maximum`, `@exclusiveMinimum`, `@exclusiveMaximum`,\n * `@multipleOf`, `@minLength`, `@maxLength`, `@minItems`, `@maxItems`,\n * `@uniqueItems`, `@pattern`, `@enumOptions`, `@const`\n * — Parsed via TSDocParser as custom block tags.\n * Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).\n *\n * 2. **Metadata and annotation tags** (`@apiName`, `@displayName`,\n * `@format`, `@placeholder`):\n * These are parsed as structured custom block tags so summary extraction\n * stops at recognized FormSpec tags. `@displayName`, `@format`, and\n * `@placeholder` also map onto annotation IR nodes, while `@apiName`\n * remains metadata-only and is resolved separately by the class analyzer.\n *\n * The `@deprecated` tag is a standard TSDoc block tag, parsed structurally.\n *\n * Description and remarks extraction (spec 002 §2.3):\n * - Summary text (bare text before the first block tag) → `description` annotation\n * - `@remarks` block → `remarks` annotation (separate channel)\n * - `@description` is NOT supported (not a standard TSDoc tag)\n *\n * **Fallback strategy**: TSDoc treats `{` / `}` as inline tag delimiters and\n * `@` as a tag prefix, so content containing these characters (e.g. JSON\n * objects in `@EnumOptions`, regex patterns with `@` in `@Pattern`) gets\n * mangled by the TSDoc parser. The shared comment syntax parser is the\n * primary source for these payloads; the TS compiler's `ts.getJSDocTags()`\n * API remains as a fallback when a raw payload cannot be recovered from the\n * shared parse.\n */\n\nimport * as ts from \"typescript\";\nimport {\n _capabilityLabel,\n _supportsConstraintCapability,\n choosePreferredPayloadText,\n extractPathTarget as extractSharedPathTarget,\n getBroadenedCustomTypeId,\n getTagDefinition,\n hasTypeSemanticCapability,\n normalizeFormSpecTagName,\n stripNullishUnion,\n parseConstraintTagValue,\n parseDefaultValueTagValue,\n parseTagSyntax,\n parseUnifiedComment,\n resolveDeclarationPlacement,\n resolvePathTargetType,\n TAGS_REQUIRING_RAW_TEXT,\n type ConstraintSemanticDiagnostic,\n type ParsedCommentTag,\n type SemanticCapability,\n} from \"@formspec/analysis/internal\";\nimport {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n isBuiltinConstraintName,\n} from \"@formspec/core/internals\";\nimport {\n type ConstraintNode,\n type AnnotationNode,\n type Provenance,\n type PathTarget,\n type TypeNode,\n} from \"@formspec/core/internals\";\nimport { noopLogger } from \"@formspec/core\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\nimport {\n customTypeIdFromLookup,\n resolveCustomTypeFromTsType,\n} from \"../extensions/resolve-custom-type.js\";\nimport { _isIntegerBrandedType } from \"./builtin-brands.js\";\nimport {\n _emitSetupDiagnostics,\n getBuildLogger,\n getBroadeningLogger,\n getTypedParserLogger,\n extractEffectiveArgumentText,\n mapTypedParserDiagnosticCode,\n parseTagArgument,\n describeTypeKind,\n elapsedMicros,\n nowMicros,\n logTagApplication,\n type ConstraintValidatorRoleOutcome,\n} from \"@formspec/analysis/internal\";\n\nfunction sharedTagValueOptions(options?: ParseTSDocOptions, pathResolvedCustomTypeId?: string) {\n return {\n ...(options?.extensionRegistry !== undefined ? { registry: options.extensionRegistry } : {}),\n ...(options?.fieldType !== undefined ? { fieldType: options.fieldType } : {}),\n ...(pathResolvedCustomTypeId !== undefined ? { pathResolvedCustomTypeId } : {}),\n };\n}\n\n/**\n * For a `ts.Type` already resolved (e.g. by walking a path through the host),\n * returns the fully-qualified custom type ID if the type is a registered\n * custom type, else `undefined`. Single shared step used both for direct-type\n * lookups and for path-resolved terminals.\n */\nfunction customTypeIdForResolvedType(\n resolvedType: ts.Type,\n checker: ts.TypeChecker,\n registry: ExtensionRegistry | undefined\n): string | undefined {\n if (registry === undefined) return undefined;\n const lookup = resolveCustomTypeFromTsType(resolvedType, checker, registry);\n return lookup === null ? undefined : customTypeIdFromLookup(lookup);\n}\n\n/**\n * For a parsed tag whose target is a valid path (`:foo.bar`), resolves the\n * terminal sub-type through the TypeScript compiler and looks up whether that\n * sub-type is a registered custom type. Returns the fully-qualified type ID\n * (`extensionId/typeName`) used by the broadening registry, or `undefined`\n * when any precondition is missing or the terminal type is not a registered\n * custom type.\n *\n * This is the build-consumer-only hook that enables path-targeted broadening\n * in the analysis layer; the resolved ID is threaded to\n * `parseConstraintTagValue` via its `pathResolvedCustomTypeId` option.\n */\nfunction resolvePathTargetCustomTypeId(\n parsedTag: ParsedCommentTag | null,\n subjectType: ts.Type | undefined,\n checker: ts.TypeChecker | undefined,\n registry: ExtensionRegistry | undefined\n): string | undefined {\n if (parsedTag === null) return undefined;\n const target = parsedTag.target;\n if (target?.kind !== \"path\" || !target.valid || target.path === null) {\n return undefined;\n }\n if (subjectType === undefined || checker === undefined) {\n return undefined;\n }\n\n const resolution = resolvePathTargetType(subjectType, checker, target.path.segments);\n if (resolution.kind !== \"resolved\") {\n return undefined;\n }\n\n return customTypeIdForResolvedType(resolution.type, checker, registry);\n}\n\nconst TYPE_FORMAT_FLAGS =\n ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope;\n\n/**\n * Runs the full constraint tag processing pipeline for a single tag: compiler\n * diagnostics check → constraint value parse → push to output arrays.\n *\n * If compiler diagnostics are found the constraint is skipped and diagnostics\n * are accumulated instead. Returns without mutating outputs if the tag produces\n * no usable constraint node.\n */\nfunction processConstraintTag(\n tagName: string,\n text: string,\n parsedTag: ParsedCommentTag | null,\n provenance: Provenance,\n node: ts.Node,\n sourceFile: ts.SourceFile,\n options: ParseTSDocOptions | undefined,\n constraints: ConstraintNode[],\n diagnostics: ConstraintSemanticDiagnostic[]\n): void {\n const compilerDiagnostics = buildCompilerBackedConstraintDiagnostics(\n node,\n sourceFile,\n tagName,\n parsedTag,\n text,\n provenance,\n options\n );\n if (compilerDiagnostics.length > 0) {\n // §4 Phase 5C — synthetic-batch dedup no longer needed: the synthetic setup\n // diagnostics (UNSUPPORTED_CUSTOM_TYPE_OVERRIDE / SYNTHETIC_SETUP_FAILURE)\n // are emitted once at registry setup time via _emitSetupDiagnostics and can\n // no longer reach this site because the synthetic batch call has been deleted.\n diagnostics.push(...compilerDiagnostics);\n return;\n }\n // Resolve the path-targeted custom type ID (if any) so the analysis layer\n // can apply broadening to the path-resolved terminal type — fixes #395\n // where path-targeted built-in constraints (e.g. `@exclusiveMinimum :amount 0`\n // on a `MonetaryAmount` field) previously emitted raw numeric constraints.\n const pathResolvedCustomTypeId = resolvePathTargetCustomTypeId(\n parsedTag,\n options?.subjectType,\n options?.checker,\n options?.extensionRegistry\n );\n const constraintNode = parseConstraintTagValue(\n tagName,\n text,\n provenance,\n sharedTagValueOptions(options, pathResolvedCustomTypeId)\n );\n if (constraintNode) {\n constraints.push(constraintNode);\n }\n}\n\n/**\n * Re-export shim: the implementation has moved to\n * `@formspec/analysis/internal:_supportsConstraintCapability`.\n *\n * The local signature `(type, checker, capability)` is preserved so existing\n * callers in this file do not need to change argument order.\n */\nfunction supportsConstraintCapability(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability | undefined\n): boolean {\n return _supportsConstraintCapability(capability, type, checker);\n}\n\nconst MAX_HINT_CANDIDATES = 5;\nconst MAX_HINT_DEPTH = 3;\n\nfunction stripHintNullishUnion(type: ts.Type): ts.Type {\n if (!type.isUnion()) {\n return type;\n }\n const nonNullish = type.types.filter(\n (member) => (member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0\n );\n if (nonNullish.length === 1 && nonNullish[0] !== undefined) {\n return nonNullish[0];\n }\n return type;\n}\n\nfunction isCallableType(type: ts.Type): boolean {\n return type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0;\n}\n\nfunction isUserEmittableHintProperty(property: ts.Symbol, declaration: ts.Declaration): boolean {\n if (property.name.startsWith(\"__\")) {\n return false;\n }\n if (\"name\" in declaration && declaration.name !== undefined) {\n const name = declaration.name as ts.PropertyName;\n if (ts.isComputedPropertyName(name) || ts.isPrivateIdentifier(name)) {\n return false;\n }\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name) && !ts.isNumericLiteral(name)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Collects user-declared subfields whose type satisfies the constraint\n * `capability`. Only descends into object-like types — never traverses into\n * primitives' intrinsic properties (e.g. would not surface `string.length`\n * on a `string` subfield), into function/call-signature types (which would\n * surface `Function.prototype` members like `length`, `name`, `apply`), or\n * through synthetic property names like `__brand` / computed / private ones.\n * Nullish unions are stripped so `Foo | null` can still surface candidates\n * declared on `Foo`. Terminal matches use `supportsConstraintCapability` so\n * the hint aligns with the capability rules used by the TYPE_MISMATCH\n * diagnostic (for example, `string[]` satisfies `string-like`).\n */\nfunction collectObjectSubfieldCandidates(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability\n): readonly string[] {\n const out: string[] = [];\n const visit = (current: ts.Type, prefix: readonly string[], depth: number): void => {\n if (depth > MAX_HINT_DEPTH) {\n return;\n }\n const stripped = stripHintNullishUnion(current);\n if (isCallableType(stripped)) {\n return;\n }\n if (!hasTypeSemanticCapability(stripped, checker, \"object-like\")) {\n return;\n }\n for (const property of stripped.getProperties()) {\n const declaration = property.valueDeclaration ?? property.declarations?.[0];\n if (declaration === undefined) {\n continue;\n }\n if (!isUserEmittableHintProperty(property, declaration)) {\n continue;\n }\n const propertyType = checker.getTypeOfSymbolAtLocation(property, declaration);\n const path = [...prefix, property.name];\n if (supportsConstraintCapability(propertyType, checker, capability)) {\n out.push(path.join(\".\"));\n continue;\n }\n const strippedPropertyType = stripHintNullishUnion(propertyType);\n if (\n !isCallableType(strippedPropertyType) &&\n hasTypeSemanticCapability(strippedPropertyType, checker, \"object-like\")\n ) {\n visit(strippedPropertyType, path, depth + 1);\n }\n }\n };\n visit(type, [], 0);\n return out;\n}\n\nfunction buildPathTargetHint(\n subjectType: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability,\n tagName: string,\n argumentText: string | undefined\n): string | null {\n // Only suggest path targeting when the subject is itself an object — for\n // primitive mismatches (e.g. `@minimum` on a `string`), the user almost\n // certainly meant a different constraint, not a path target.\n if (!hasTypeSemanticCapability(subjectType, checker, \"object-like\")) {\n return null;\n }\n\n const candidates = collectObjectSubfieldCandidates(subjectType, checker, capability);\n const primary = candidates[0];\n if (primary === undefined) {\n return null;\n }\n\n const argText = argumentText?.trim() ?? \"\";\n const renderExample = (path: string): string =>\n argText === \"\" ? `@${tagName} :${path}` : `@${tagName} :${path} ${argText}`;\n\n if (candidates.length === 1) {\n return `Hint: use a path target to constrain a subfield, e.g. ${renderExample(primary)}`;\n }\n\n const shown = candidates.slice(0, MAX_HINT_CANDIDATES);\n const overflow = candidates.length > MAX_HINT_CANDIDATES ? \", …\" : \"\";\n return `Hint: use a path target to constrain a subfield (candidates: ${shown.join(\", \")}${overflow}), e.g. ${renderExample(primary)}`;\n}\n\nfunction makeDiagnostic(\n code: string,\n message: string,\n provenance: Provenance\n): ConstraintSemanticDiagnostic {\n return {\n code,\n message,\n severity: \"error\",\n primaryLocation: provenance,\n relatedLocations: [],\n };\n}\n\nfunction placementLabel(\n placement: NonNullable<ReturnType<typeof resolveDeclarationPlacement>>\n): string {\n switch (placement) {\n case \"class\":\n return \"class declarations\";\n case \"class-field\":\n return \"class fields\";\n case \"class-method\":\n return \"class methods\";\n case \"interface\":\n return \"interface declarations\";\n case \"interface-field\":\n return \"interface fields\";\n case \"type-alias\":\n return \"type aliases\";\n case \"type-alias-field\":\n return \"type-alias properties\";\n case \"variable\":\n return \"variables\";\n case \"function\":\n return \"functions\";\n case \"function-parameter\":\n return \"function parameters\";\n case \"method-parameter\":\n return \"method parameters\";\n default: {\n const exhaustive: never = placement;\n return String(exhaustive);\n }\n }\n}\n\n\nfunction hasBuiltinConstraintBroadening(tagName: string, options?: ParseTSDocOptions): boolean {\n const broadenedTypeId = getBroadenedCustomTypeId(options?.fieldType);\n return (\n broadenedTypeId !== undefined &&\n options?.extensionRegistry?.findBuiltinConstraintBroadening(broadenedTypeId, tagName) !==\n undefined\n );\n}\n\nfunction buildCompilerBackedConstraintDiagnostics(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n tagName: string,\n parsedTag: ParsedCommentTag | null,\n rawText: string,\n provenance: Provenance,\n options?: ParseTSDocOptions\n): readonly ConstraintSemanticDiagnostic[] {\n if (!isBuiltinConstraintName(tagName)) {\n return [];\n }\n\n const checker = options?.checker;\n const subjectType = options?.subjectType;\n if (checker === undefined || subjectType === undefined) {\n return [];\n }\n\n const placement = resolveDeclarationPlacement(node);\n if (placement === null) {\n return [];\n }\n\n const definition = getTagDefinition(tagName, options?.extensionRegistry?.extensions);\n if (definition === null) {\n return [];\n }\n\n // §8.3b — gather structured-log context only when logging is enabled.\n // `placement` is narrowed to non-null above; capture it in a typed constant\n // so TypeScript can see the narrowed type inside the `emit` closure below.\n const nonNullPlacement: NonNullable<ReturnType<typeof resolveDeclarationPlacement>> = placement;\n const log = getBuildLogger();\n const broadeningLog = getBroadeningLogger();\n const typedParserLog = getTypedParserLogger();\n const logsEnabled = log !== noopLogger || broadeningLog !== noopLogger;\n const typedParserTraceEnabled = typedParserLog !== noopLogger;\n const logStart = logsEnabled ? nowMicros() : 0;\n const subjectTypeKind = logsEnabled ? describeTypeKind(subjectType, checker) : \"\";\n\n /**\n * Emits the §8.3b structured log entry and returns the supplied diagnostic\n * array unchanged. All early returns in this function go through this helper.\n *\n * Broadening-bypass outcomes are additionally emitted on the `:broadening`\n * sub-namespace so they are separately filterable.\n */\n function emit(\n outcome: ConstraintValidatorRoleOutcome,\n result: readonly ConstraintSemanticDiagnostic[]\n ): readonly ConstraintSemanticDiagnostic[] {\n if (!logsEnabled) {\n return result;\n }\n const entry = {\n consumer: \"build\" as const,\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind,\n roleOutcome: outcome,\n elapsedMicros: elapsedMicros(logStart),\n };\n logTagApplication(log, entry);\n if (outcome === \"bypass\" || outcome === \"D1\" || outcome === \"D2\") {\n logTagApplication(broadeningLog, entry);\n }\n return result;\n }\n\n if (!definition.placements.includes(placement)) {\n return emit(\"A-reject\", [\n makeDiagnostic(\n \"INVALID_TAG_PLACEMENT\",\n `Tag \"@${tagName}\" is not allowed on ${placementLabel(placement)}.`,\n provenance\n ),\n ]);\n }\n\n const target = parsedTag?.target ?? null;\n\n // Resolve the type the capability check should run against: the path-target\n // destination for `:foo` constraints, otherwise the field's own type.\n let evaluatedType: ts.Type = subjectType;\n let targetLabel = node.getText(sourceFile);\n if (target !== null) {\n if (target.kind !== \"path\") {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNSUPPORTED_TARGETING_SYNTAX\",\n `Tag \"@${tagName}\" does not support ${target.kind} targeting syntax.`,\n provenance\n ),\n ]);\n }\n\n if (!target.valid || target.path === null) {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNSUPPORTED_TARGETING_SYNTAX\",\n `Tag \"@${tagName}\" has invalid path targeting syntax.`,\n provenance\n ),\n ]);\n }\n\n const resolution = resolvePathTargetType(subjectType, checker, target.path.segments);\n if (resolution.kind === \"missing-property\") {\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"UNKNOWN_PATH_TARGET\",\n `Target \"${target.rawText}\": path-targeted constraint \"${tagName}\" references unknown path segment \"${resolution.segment}\"`,\n provenance\n ),\n ]);\n }\n\n if (resolution.kind === \"unresolvable\") {\n const actualType = checker.typeToString(resolution.type, node, TYPE_FORMAT_FLAGS);\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"TYPE_MISMATCH\",\n `Target \"${target.rawText}\": path-targeted constraint \"${tagName}\" is invalid because type \"${actualType}\" cannot be traversed`,\n provenance\n ),\n ]);\n }\n\n evaluatedType = resolution.type;\n targetLabel = target.rawText;\n }\n\n // Unified broadening check:\n // - Direct field (`target === null`): uses the IR-layer `FieldType`\n // carried on `options.fieldType`. This is the pre-existing path.\n // - Path target (`target !== null`): no IR is available for the\n // path-resolved sub-type, so resolve the custom type from the raw\n // `ts.Type` via the shared extension-registry resolver and look up\n // broadening by `(customTypeId, tagName)`.\n //\n // Both variants answer the same question — \"is `tagName` broadened onto\n // the type we're about to validate?\" — and short-circuit the capability\n // check below in favour of the IR-layer validator which understands\n // extension-defined constraint semantics.\n const hasBroadening = ((): boolean => {\n if (target === null) {\n if (\n _isIntegerBrandedType(stripNullishUnion(subjectType)) &&\n definition.capabilities[0] === \"numeric-comparable\"\n ) {\n return true;\n }\n return hasBuiltinConstraintBroadening(tagName, options);\n }\n const registry = options?.extensionRegistry;\n if (registry === undefined) return false;\n const typeId = customTypeIdForResolvedType(evaluatedType, checker, registry);\n return (\n typeId !== undefined &&\n registry.findBuiltinConstraintBroadening(typeId, tagName) !== undefined\n );\n })();\n\n if (!hasBroadening) {\n const requiredCapability = definition.capabilities[0];\n if (\n requiredCapability !== undefined &&\n !supportsConstraintCapability(evaluatedType, checker, requiredCapability)\n ) {\n const actualType = checker.typeToString(evaluatedType, node, TYPE_FORMAT_FLAGS);\n const baseMessage = `Target \"${targetLabel}\": constraint \"${tagName}\" is only valid on ${_capabilityLabel(requiredCapability)} targets, but field type is \"${actualType}\"`;\n // Path-target hints only apply to direct-field mismatches — the hint\n // suggests \"did you mean a sub-path?\" which is nonsensical when the\n // user is already path-targeting.\n const hint =\n target === null\n ? buildPathTargetHint(\n subjectType,\n checker,\n requiredCapability,\n tagName,\n parsedTag?.argumentText\n )\n : null;\n return emit(\"B-reject\", [\n makeDiagnostic(\n \"TYPE_MISMATCH\",\n hint === null ? baseMessage : `${baseMessage}. ${hint}`,\n provenance\n ),\n ]);\n }\n }\n\n // Role C: validate argument literal via the typed parser. The typed parser is\n // the gatekeeper for argument-shape validity (is `10.5` a valid `@minLength`\n // arg? is `[]` a valid `@enumOptions` arg?). Roles A and B have already run\n // above; this guard handles Role C.\n //\n // IMPORTANT: the typed-parser call is guarded by `if (!hasBroadening)` so that\n // broadened fields (D1/D2) bypass Role C entirely. Without this guard a broadened\n // field whose argument the typed parser would reject (e.g. a non-JSON @enumOptions\n // arg on a Decimal path-target) would spuriously emit INVALID_TAG_ARGUMENT instead\n // of being silently bypassed as Role D1/D2 requires.\n //\n // Behaviour (non-broadened path):\n // - ok: false → emit C-reject with the typed parser's code + message.\n // - ok: true (including raw-string-fallback for @const) → proceed.\n // The raw-string-fallback is a successful parse; the downstream IR compatibility\n // check (semantic-targets.ts:~1255-1298) owns the final decision for @const.\n if (hasBroadening) {\n return emit(\"bypass\", []);\n }\n\n // §4 Phase 4B — use shared extractEffectiveArgumentText so both consumers\n // derive argument text identically. Extracts the argument from rawText (the\n // canonical post-choosePreferredPayloadText string), which for\n // TAGS_REQUIRING_RAW_TEXT may have been selected via the compiler-API\n // fallback. Re-parsing from rawText applies path-target prefix stripping and\n // canonicalisation consistently with the snapshot consumer.\n // Computed after the bypass check so broadened fields skip this work entirely.\n const effectiveArgumentText = extractEffectiveArgumentText(tagName, rawText, parsedTag);\n\n const typedParseResult = parseTagArgument(tagName, effectiveArgumentText, \"build\");\n\n if (!typedParseResult.ok) {\n // §8.3 — emit typed-parser trace log when enabled.\n if (typedParserTraceEnabled) {\n typedParserLog.trace(\"typed-parser C-reject\", {\n consumer: \"build\",\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind: subjectTypeKind !== \"\" ? subjectTypeKind : \"-\",\n roleOutcome: \"C-reject\",\n diagnosticCode: typedParseResult.diagnostic.code,\n });\n }\n // Map the typed-parser diagnostic code to a ConstraintSemanticDiagnostic code.\n // UNKNOWN_TAG is structurally unreachable here: parseTagArgument is only called\n // after the tag was resolved via getTagDefinition above. If it fires, it's a bug.\n // mapTypedParserDiagnosticCode provides an exhaustive switch shared with the\n // snapshot consumer — avoids the Lesson 3 silent-ternary-collapse pitfall.\n const mappedCode = mapTypedParserDiagnosticCode(typedParseResult.diagnostic.code, tagName);\n return emit(\"C-reject\", [\n makeDiagnostic(mappedCode, typedParseResult.diagnostic.message, provenance),\n ]);\n }\n\n // §4 Phase 5C — typed parser accepted the argument. This is the terminal\n // success outcome: all constraint-tag validation (placement Role A, path-target\n // resolution, capability Role B, argument Role C) has now passed via the\n // typed-parser/capability checks above. Previously this site invoked the\n // synthetic TypeScript program for a redundant \"Role D\" re-check; that\n // machinery has been deleted (synthetic-checker retirement §4 Phase 5C).\n if (typedParserTraceEnabled) {\n typedParserLog.trace(\"typed-parser C-pass\", {\n consumer: \"build\",\n tag: tagName,\n placement: nonNullPlacement,\n subjectTypeKind: subjectTypeKind !== \"\" ? subjectTypeKind : \"-\",\n roleOutcome: \"C-pass\",\n valueKind: typedParseResult.value.kind,\n });\n }\n\n return emit(\"C-pass\", []);\n}\n\nconst parseResultCache = new Map<string, TSDocParseResult>();\n\nfunction getExtensionTagNames(options?: ParseTSDocOptions): readonly string[] {\n return [\n ...(options?.extensionRegistry?.extensions.flatMap((extension) =>\n (extension.constraintTags ?? []).map((tag) => normalizeFormSpecTagName(tag.tagName))\n ) ?? []),\n ...(options?.extensionRegistry?.extensions.flatMap((extension) =>\n (extension.metadataSlots ?? []).map((slot) => normalizeFormSpecTagName(slot.tagName))\n ) ?? []),\n ].sort();\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Result of parsing a single JSDoc comment attached to a TS AST node.\n */\nexport interface TSDocParseResult {\n /** Constraint IR nodes extracted from custom block tags. */\n readonly constraints: readonly ConstraintNode[];\n /** Annotation IR nodes extracted from canonical TSDoc block tags. */\n readonly annotations: readonly AnnotationNode[];\n /** Compiler-backed extraction diagnostics for invalid tag applications. */\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n}\n\n/**\n * Optional extension-aware parsing inputs for TSDoc extraction.\n */\nexport interface ParseTSDocOptions {\n /**\n * Extension registry used to resolve custom tags and custom-type-specific\n * broadening of built-in constraint tags.\n */\n readonly extensionRegistry?: ExtensionRegistry;\n /**\n * Effective field/type node for the declaration being parsed. Required when\n * built-in tags may broaden onto a custom type.\n */\n readonly fieldType?: TypeNode;\n /** Type checker used for compiler-backed placement and type validation. */\n readonly checker?: ts.TypeChecker;\n /** The declaration type that the parsed tag applies to. */\n readonly subjectType?: ts.Type;\n /** Optional enclosing host type for future cross-field signature checks. */\n readonly hostType?: ts.Type;\n}\n\n/**\n * Display-name metadata extracted from a node's JSDoc tags.\n *\n * The root display name is returned separately from member-target labels so\n * callers can apply the former to the enclosing type/form and the latter to\n * enum members.\n */\ninterface DisplayNameMetadata {\n readonly displayName?: string;\n readonly memberDisplayNames: ReadonlyMap<string, string>;\n}\n\nfunction getExtensionRegistryCacheKey(registry: ExtensionRegistry | undefined): string {\n if (registry === undefined) {\n return \"\";\n }\n\n return registry.extensions\n .map((extension) =>\n JSON.stringify({\n extensionId: extension.extensionId,\n typeNames: extension.types?.map((type) => type.typeName) ?? [],\n constraintTags:\n extension.constraintTags?.map((tag) => normalizeFormSpecTagName(tag.tagName)) ?? [],\n metadataSlots:\n extension.metadataSlots?.map((slot) => ({\n tagName: normalizeFormSpecTagName(slot.tagName),\n declarationKinds: [...slot.declarationKinds].sort(),\n allowBare: slot.allowBare !== false,\n qualifiers: (slot.qualifiers ?? [])\n .map((qualifier) => ({\n qualifier: qualifier.qualifier,\n ...(qualifier.sourceQualifier !== undefined\n ? { sourceQualifier: qualifier.sourceQualifier }\n : {}),\n }))\n .sort((left, right) => left.qualifier.localeCompare(right.qualifier)),\n })) ?? [],\n })\n )\n .join(\"|\");\n}\n\nfunction getParseCacheKey(\n node: ts.Node,\n file: string,\n options: ParseTSDocOptions | undefined\n): string {\n const sourceFile = node.getSourceFile();\n const checker = options?.checker;\n return JSON.stringify({\n file,\n sourceFile: sourceFile.fileName,\n sourceText: sourceFile.text,\n start: node.getFullStart(),\n end: node.getEnd(),\n fieldType: options?.fieldType ?? null,\n subjectType:\n checker !== undefined && options?.subjectType !== undefined\n ? checker.typeToString(options.subjectType, node, TYPE_FORMAT_FLAGS)\n : null,\n hostType:\n checker !== undefined && options?.hostType !== undefined\n ? checker.typeToString(options.hostType, node, TYPE_FORMAT_FLAGS)\n : null,\n extensions: getExtensionRegistryCacheKey(options?.extensionRegistry),\n });\n}\n\n/**\n * Parses the JSDoc comment attached to a TypeScript AST node using the\n * unified comment parser and returns canonical IR constraint and annotation\n * nodes.\n *\n * For constraint tags (`@minimum`, `@pattern`, `@enumOptions`, etc.),\n * the unified parser provides aligned span and TSDoc block information.\n * Canonical annotation tags (`@displayName`) are also parsed structurally.\n * Summary text and `@remarks` are extracted as separate annotation nodes.\n *\n * @param node - The TS AST node to inspect (PropertyDeclaration, PropertySignature, etc.)\n * @param file - Absolute source file path for provenance\n * @returns Parsed constraint and annotation nodes\n */\nexport function parseTSDocTags(\n node: ts.Node,\n file = \"\",\n options?: ParseTSDocOptions\n): TSDocParseResult {\n const cacheKey = getParseCacheKey(node, file, options);\n const cached = parseResultCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n // §4 Phase 4 Slice C — when the registry has setup failures, emit them ONCE\n // per parseTSDocTags call (anchored at the extension registration site) and\n // skip all further tag parsing for this node.\n //\n // Rationale for the early-return: an invalid registry means constraint types\n // cannot be resolved, so placement validation and summary-text extraction\n // for every field in the class would be based on incomplete type information.\n // Surfacing only the setup diagnostic — rather than potentially spurious\n // placement errors — keeps the user's feedback loop focused on fixing the\n // broken extension configuration first. See test\n // \"parseTSDocTags silent-drop: only setup diagnostics surface when registry\n // has setup failures\" in tsdoc-parser-setup-diagnostic-silent-drop.test.ts.\n const setupDiags = options?.extensionRegistry?.setupDiagnostics;\n if (setupDiags !== undefined && setupDiags.length > 0) {\n const result: TSDocParseResult = {\n constraints: [],\n annotations: [],\n diagnostics: _emitSetupDiagnostics(setupDiags, file),\n };\n parseResultCache.set(cacheKey, result);\n return result;\n }\n\n const constraints: ConstraintNode[] = [];\n const annotations: AnnotationNode[] = [];\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n let displayName: string | undefined;\n let placeholder: string | undefined;\n let displayNameProvenance: Provenance | undefined;\n let placeholderProvenance: Provenance | undefined;\n\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n\n // TS compiler API fallback for TAGS_REQUIRING_RAW_TEXT: handles tags that\n // the regex parser misses (e.g. malformed or unusual comment syntax).\n const rawTextFallbacks = collectRawTextFallbacks(node, file);\n\n const extensionTagNames = getExtensionTagNames(options);\n\n if (commentRanges) {\n for (const range of commentRanges) {\n // Only parse /** ... */ comments (kind 3 = MultiLineCommentTrivia)\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) {\n continue;\n }\n const commentText = sourceText.substring(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) {\n continue;\n }\n\n const extensions = options?.extensionRegistry?.extensions;\n const unified = parseUnifiedComment(commentText, {\n offset: range.pos,\n extensionTagNames,\n ...(extensions !== undefined ? { extensions } : {}),\n });\n\n for (const tag of unified.tags) {\n const tagName = tag.normalizedTagName;\n\n if (tagName === \"displayName\" || tagName === \"format\" || tagName === \"placeholder\") {\n const text = tag.resolvedPayloadText;\n if (text === \"\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n switch (tagName) {\n case \"displayName\":\n if (!isMemberTargetDisplayName(text) && displayName === undefined) {\n displayName = text;\n displayNameProvenance = provenance;\n }\n break;\n\n case \"format\":\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"format\",\n value: text,\n provenance,\n });\n break;\n\n case \"placeholder\":\n if (placeholder === undefined) {\n placeholder = text;\n placeholderProvenance = provenance;\n }\n break;\n }\n continue;\n }\n\n if (TAGS_REQUIRING_RAW_TEXT.has(tagName)) {\n // Consume corresponding compiler-API fallback entry (aligning by tag order).\n // Use choosePreferredPayloadText to handle multi-line payloads: the\n // regex parser's span may only capture the first line (e.g. `{`), while\n // the TS compiler API provides the full content for multi-line payloads.\n const fallback = rawTextFallbacks.get(tagName)?.shift();\n const text = choosePreferredPayloadText(tag.resolvedPayloadText, fallback?.text ?? \"\");\n if (text === \"\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n if (tagName === \"defaultValue\") {\n annotations.push(parseDefaultValueTagValue(text, provenance));\n continue;\n }\n\n processConstraintTag(\n tagName,\n text,\n tag,\n provenance,\n node,\n sourceFile,\n options,\n constraints,\n diagnostics\n );\n continue;\n }\n\n // Regular constraint tag (not requiring raw text)\n const text = tag.resolvedPayloadText;\n const expectedType = isBuiltinConstraintName(tagName)\n ? BUILTIN_CONSTRAINT_DEFINITIONS[tagName]\n : undefined;\n if (text === \"\" && expectedType !== \"boolean\") continue;\n\n const provenance = provenanceForParsedTag(tag, sourceFile, file);\n processConstraintTag(\n tagName,\n text,\n tag,\n provenance,\n node,\n sourceFile,\n options,\n constraints,\n diagnostics\n );\n }\n\n // Extract @deprecated from the unified parse result\n if (unified.isDeprecated) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"deprecated\",\n ...(unified.deprecationMessage !== \"\" && { message: unified.deprecationMessage }),\n provenance: provenanceForComment(range, sourceFile, file, \"deprecated\"),\n });\n }\n\n // Summary text → description annotation (spec 002 §2.3)\n if (unified.summaryText !== \"\") {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"description\",\n value: unified.summaryText,\n provenance: provenanceForComment(range, sourceFile, file, \"summary\"),\n });\n }\n\n // @remarks → separate remarks annotation (spec 002 §2.3)\n if (unified.remarksText !== \"\") {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"remarks\",\n value: unified.remarksText,\n provenance: provenanceForComment(range, sourceFile, file, \"remarks\"),\n });\n }\n }\n }\n\n if (displayName !== undefined && displayNameProvenance !== undefined) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"displayName\",\n value: displayName,\n provenance: displayNameProvenance,\n });\n }\n\n if (placeholder !== undefined && placeholderProvenance !== undefined) {\n annotations.push({\n kind: \"annotation\",\n annotationKind: \"placeholder\",\n value: placeholder,\n provenance: placeholderProvenance,\n });\n }\n\n // Process orphaned TS compiler API fallbacks: tags found by ts.getJSDocTags()\n // that were not matched by the regex parser (e.g. malformed comment syntax).\n for (const [tagName, fallbacks] of rawTextFallbacks) {\n for (const fallback of fallbacks) {\n const text = fallback.text.trim();\n if (text === \"\") continue;\n\n const provenance = fallback.provenance;\n if (tagName === \"defaultValue\") {\n annotations.push(parseDefaultValueTagValue(text, provenance));\n continue;\n }\n\n processConstraintTag(\n tagName,\n text,\n null,\n provenance,\n node,\n sourceFile,\n options,\n constraints,\n diagnostics\n );\n }\n }\n\n const result = { constraints, annotations, diagnostics };\n parseResultCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Extracts root and member-target display-name metadata from a node's JSDoc tags.\n *\n * Member-target display-name tags use the syntax `@displayName :member Label`.\n * The first non-target `@displayName` is returned as the root display name.\n */\nexport function extractDisplayNameMetadata(node: ts.Node): DisplayNameMetadata {\n let displayName: string | undefined;\n const memberDisplayNames = new Map<string, string>();\n const sourceFile = node.getSourceFile();\n const sourceText = sourceFile.getFullText();\n const commentRanges = ts.getLeadingCommentRanges(sourceText, node.getFullStart());\n\n if (commentRanges) {\n for (const range of commentRanges) {\n if (range.kind !== ts.SyntaxKind.MultiLineCommentTrivia) continue;\n const commentText = sourceText.substring(range.pos, range.end);\n if (!commentText.startsWith(\"/**\")) continue;\n\n const unified = parseUnifiedComment(commentText);\n for (const tag of unified.tags) {\n if (tag.normalizedTagName !== \"displayName\") {\n continue;\n }\n\n if (tag.target !== null && tag.argumentText !== \"\") {\n memberDisplayNames.set(tag.target.rawText, tag.argumentText);\n continue;\n }\n\n if (tag.argumentText !== \"\") {\n displayName ??= tag.argumentText;\n }\n }\n }\n }\n\n return {\n ...(displayName !== undefined && { displayName }),\n memberDisplayNames,\n };\n}\n\n// =============================================================================\n// PUBLIC HELPERS — path target extraction\n// =============================================================================\n\n/**\n * Extracts a path-target prefix (`:fieldName`) from constraint tag text.\n * Returns the parsed PathTarget and remaining text, or null if no path target.\n *\n * @example\n * extractPathTarget(\":value 0\") // → { path: { segments: [\"value\"] }, remainingText: \"0\" }\n * extractPathTarget(\"42\") // → null\n */\nexport function extractPathTarget(\n text: string\n): { path: PathTarget; remainingText: string } | null {\n return extractSharedPathTarget(text);\n}\n\nfunction collectRawTextFallbacks(\n node: ts.Node,\n file: string\n): Map<string, { text: string; provenance: Provenance }[]> {\n const fallbacks = new Map<string, { text: string; provenance: Provenance }[]>();\n\n for (const tag of ts.getJSDocTags(node)) {\n const tagName = normalizeConstraintTagName(tag.tagName.text);\n if (!TAGS_REQUIRING_RAW_TEXT.has(tagName)) continue;\n\n const commentText = getTagCommentText(tag)?.trim() ?? \"\";\n if (commentText === \"\") continue;\n\n const entries = fallbacks.get(tagName) ?? [];\n entries.push({\n text: commentText,\n provenance: provenanceForJSDocTag(tag, file),\n });\n fallbacks.set(tagName, entries);\n }\n\n return fallbacks;\n}\n\n// =============================================================================\n// PRIVATE HELPERS — constraint value parsing\n// =============================================================================\n\nfunction isMemberTargetDisplayName(text: string): boolean {\n return parseTagSyntax(\"displayName\", text).target !== null;\n}\n\n// =============================================================================\n// PRIVATE HELPERS — provenance\n// =============================================================================\n\nfunction provenanceForComment(\n range: ts.CommentRange,\n sourceFile: ts.SourceFile,\n file: string,\n tagName: string\n): Provenance {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(range.pos);\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tagName,\n };\n}\n\nfunction provenanceForParsedTag(\n tag: ParsedCommentTag,\n sourceFile: ts.SourceFile,\n file: string\n): Provenance {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(tag.tagNameSpan.start);\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tag.normalizedTagName,\n };\n}\n\nfunction provenanceForJSDocTag(tag: ts.JSDocTag, file: string): Provenance {\n const sourceFile = tag.getSourceFile();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(tag.getStart());\n return {\n surface: \"tsdoc\",\n file,\n line: line + 1,\n column: character,\n tagName: \"@\" + tag.tagName.text,\n };\n}\n\n/**\n * Extracts the text content from a TypeScript JSDoc tag's comment.\n */\nfunction getTagCommentText(tag: ts.JSDocTag): string | undefined {\n if (tag.comment === undefined) {\n return undefined;\n }\n if (typeof tag.comment === \"string\") {\n return tag.comment;\n }\n return ts.getTextOfJSDocComment(tag.comment);\n}\n","import * as ts from \"typescript\";\n\nimport { _collectBrandIdentifiers, stripNullishUnion } from \"@formspec/analysis/internal\";\n\nimport type { ExtensionRegistry, ExtensionTypeLookupResult } from \"./registry.js\";\nimport {\n extractTypeNodeFromSource,\n getTypeAliasDeclarationFromTypeReference,\n resolveCanonicalSymbol,\n} from \"./ts-type-utils.js\";\n\nfunction getTypeNodeRegistrationName(typeNode: ts.TypeNode): string | null {\n if (ts.isTypeReferenceNode(typeNode)) {\n return ts.isIdentifier(typeNode.typeName)\n ? typeNode.typeName.text\n : typeNode.typeName.right.text;\n }\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return getTypeNodeRegistrationName(typeNode.type);\n }\n if (\n typeNode.kind === ts.SyntaxKind.BigIntKeyword ||\n typeNode.kind === ts.SyntaxKind.StringKeyword ||\n typeNode.kind === ts.SyntaxKind.NumberKeyword ||\n typeNode.kind === ts.SyntaxKind.BooleanKeyword\n ) {\n return typeNode.getText();\n }\n return null;\n}\n\nfunction resolveByNameFromTypeNode(\n typeNode: ts.TypeNode,\n registry: ExtensionRegistry,\n checker: ts.TypeChecker\n): ExtensionTypeLookupResult | null {\n if (ts.isParenthesizedTypeNode(typeNode)) {\n return resolveByNameFromTypeNode(typeNode.type, registry, checker);\n }\n const typeName = getTypeNodeRegistrationName(typeNode);\n if (typeName !== null) {\n const byName = registry.findTypeByName(typeName);\n if (byName !== undefined) {\n return byName;\n }\n }\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const aliasDecl = getTypeAliasDeclarationFromTypeReference(typeNode, checker);\n if (aliasDecl !== undefined) {\n return resolveByNameFromTypeNode(aliasDecl.type, registry, checker);\n }\n }\n return null;\n}\n\n/**\n * Resolves a TypeScript type to an extension-registered custom type, trying\n * all three registration mechanisms in order of precision:\n *\n * 1. **Name-based** (via `sourceNode` AST walk) — matches the user-written\n * alias identifier (e.g. `amount: Decimal` → `\"Decimal\"`). Requires a\n * source node to walk; used by the direct-field code path.\n * 2. **Symbol-based** — matches `ts.Symbol` identity via\n * `ExtensionRegistry.findTypeBySymbol`, populated from\n * `defineCustomType<T>()` type parameter extraction. Works for any type\n * regardless of import aliases or name collisions.\n * 3. **Brand-based** — matches the `brand` identifier encoded into\n * intersection types as computed-property keys (e.g.\n * `string & { [__decimalBrand]: true }`). Structural; independent of\n * declaration names.\n *\n * Name-based resolution also has a symbol-fallback path that uses\n * `type.aliasSymbol?.getName()` when no `sourceNode` is provided, so\n * path-resolved types can still match name-registered custom types.\n *\n * Nullable unions (`T | null`, `T | undefined`, `T | null | undefined`) are\n * stripped before every detection attempt, so registrations apply through\n * nullable wrappers transparently.\n *\n * Returns `null` when no registered custom type matches.\n */\nexport function resolveCustomTypeFromTsType(\n type: ts.Type,\n checker: ts.TypeChecker,\n registry: ExtensionRegistry | undefined,\n sourceNode?: ts.Node\n): ExtensionTypeLookupResult | null {\n if (registry === undefined) {\n return null;\n }\n\n const stripped = stripNullishUnion(type);\n\n // 1. Name-based: prefer walking the source AST for the user-written\n // identifier; fall back to the canonical symbol name for path-resolved\n // types that have no syntactic source.\n if (sourceNode !== undefined) {\n const typeNode = extractTypeNodeFromSource(sourceNode);\n if (typeNode !== undefined) {\n const byName = resolveByNameFromTypeNode(typeNode, registry, checker);\n if (byName !== null) {\n return byName;\n }\n }\n } else {\n const typeName = (stripped.aliasSymbol ?? stripped.getSymbol())?.getName();\n if (typeName !== undefined) {\n const byName = registry.findTypeByName(typeName);\n if (byName !== undefined) {\n return byName;\n }\n }\n }\n\n // 2. Symbol-based.\n const canonical = resolveCanonicalSymbol(stripped, checker);\n if (canonical !== undefined) {\n const bySymbol = registry.findTypeBySymbol(canonical);\n if (bySymbol !== undefined) {\n return bySymbol;\n }\n }\n\n // 3. Brand-based.\n for (const brand of _collectBrandIdentifiers(stripped)) {\n const byBrand = registry.findTypeByBrand(brand);\n if (byBrand !== undefined) {\n return byBrand;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the fully-qualified type ID for a resolved custom-type lookup.\n *\n * Type IDs have the form `${extensionId}/${typeName}`, matching the format\n * produced elsewhere in the build pipeline.\n */\nexport function customTypeIdFromLookup(result: ExtensionTypeLookupResult): string {\n return `${result.extensionId}/${result.registration.typeName}`;\n}\n","import * as ts from \"typescript\";\n\n/**\n * Resolves a TypeScript type to its canonical `ts.Symbol`, following alias chains.\n *\n * `aliasSymbol` tracks type aliases (e.g. `type Foo = Bar`); `getSymbol()` tracks\n * the structural symbol. We prefer `aliasSymbol` when present so that aliased\n * types resolve to the declaration site rather than the structural shape.\n *\n * Returns `undefined` for bare primitives and anonymous types, which have no\n * symbol.\n */\nexport function resolveCanonicalSymbol(\n type: ts.Type,\n checker: ts.TypeChecker\n): ts.Symbol | undefined {\n const raw = type.aliasSymbol ?? type.getSymbol();\n if (raw === undefined) return undefined;\n return raw.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(raw) : raw;\n}\n\n/**\n * Extracts the `ts.TypeNode` backing a property / parameter / type-alias\n * declaration. Returns the node itself when `sourceNode` is already a type\n * node, or `undefined` otherwise.\n */\nexport function extractTypeNodeFromSource(sourceNode: ts.Node): ts.TypeNode | undefined {\n if (\n ts.isPropertyDeclaration(sourceNode) ||\n ts.isPropertySignature(sourceNode) ||\n ts.isParameter(sourceNode) ||\n ts.isTypeAliasDeclaration(sourceNode)\n ) {\n return sourceNode.type;\n }\n if (ts.isTypeNode(sourceNode)) {\n return sourceNode;\n }\n return undefined;\n}\n\nfunction resolveAliasedSymbol(\n symbol: ts.Symbol | undefined,\n checker: ts.TypeChecker\n): ts.Symbol | undefined {\n if (symbol === undefined) return undefined;\n return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;\n}\n\n/**\n * Resolves a `ts.TypeReferenceNode` to its declaring `ts.TypeAliasDeclaration`,\n * if the reference names a type alias — following import aliases so that\n * `import { Foo } from \"./types\"; field: Foo` resolves through to the\n * original `type Foo = ...` declaration.\n *\n * Returns `undefined` for references to non-alias declarations (interfaces,\n * classes, modules, etc.).\n */\nexport function getTypeAliasDeclarationFromTypeReference(\n typeNode: ts.TypeReferenceNode,\n checker: ts.TypeChecker\n): ts.TypeAliasDeclaration | undefined {\n const symbol = checker.getSymbolAtLocation(typeNode.typeName);\n return resolveAliasedSymbol(symbol, checker)?.declarations?.find(ts.isTypeAliasDeclaration);\n}\n","/**\n * Re-exports {@link _isIntegerBrandedType} from the shared\n * `@formspec/analysis` implementation.\n *\n * The detection logic was extracted to `@formspec/analysis` (Phase 4A of the\n * synthetic-checker retirement) so that both the build consumer\n * (`tsdoc-parser.ts`) and the snapshot consumer (`file-snapshots.ts`) can use\n * the same bypass check.\n *\n * Callers inside `@formspec/build` continue to import from this module — no\n * import-site changes required in `class-analyzer.ts` or `tsdoc-parser.ts`.\n *\n * @internal\n */\nexport { _isIntegerBrandedType } from \"@formspec/analysis/internal\";\n","/**\n * Symbol-based custom type registry.\n *\n * Walks the FormSpec config file AST to find `defineCustomType<T>()` calls,\n * extracts the TypeScript type argument, resolves it to a canonical `ts.Symbol`,\n * and builds a `Map` for O(1) symbol-identity lookup during field analysis.\n *\n * This detection path is the most precise available — it uses TypeScript's own\n * type identity, making it immune to import aliases and name collisions.\n *\n * @packageDocumentation\n */\n\nimport * as ts from \"typescript\";\nimport * as path from \"node:path\";\nimport type { ExtensionRegistry, ExtensionTypeLookupResult } from \"./registry.js\";\nimport { resolveCanonicalSymbol } from \"./ts-type-utils.js\";\n\n// =============================================================================\n// IMPLEMENTATION\n// =============================================================================\n\n/**\n * Walks the config file's AST to find `defineCustomType<T>()` calls,\n * extracts type arguments, resolves them to ts.Symbol, and builds a\n * Map for O(1) symbol-identity lookup during field analysis.\n *\n * Returns an empty map if the config file isn't in the program, has\n * no `defineCustomType` calls, or none have type arguments.\n *\n * @param configPath - Absolute path to the FormSpec config file.\n * @param program - The TypeScript program that includes the config file.\n * @param checker - Type checker for the program.\n * @param extensionRegistry - The runtime extension registry already built from\n * the config's export; used to look up the matching registration by typeName.\n * @returns A map from canonical ts.Symbol to the matching registry entry.\n *\n * @public\n */\nexport function buildSymbolMapFromConfig(\n configPath: string,\n program: ts.Program,\n checker: ts.TypeChecker,\n extensionRegistry: ExtensionRegistry\n): Map<ts.Symbol, ExtensionTypeLookupResult> {\n const symbolMap = new Map<ts.Symbol, ExtensionTypeLookupResult>();\n\n const normalizedPath = path.resolve(configPath);\n const configFile = program.getSourceFile(normalizedPath);\n if (configFile === undefined) {\n return symbolMap;\n }\n\n // Walk AST to find defineCustomType<T>() calls\n function visit(node: ts.Node): void {\n if (ts.isCallExpression(node) && isDefineCustomTypeCall(node, checker)) {\n processDefineCustomTypeCall(node);\n }\n ts.forEachChild(node, visit);\n }\n\n function processDefineCustomTypeCall(call: ts.CallExpression): void {\n // typeArguments is checked (length > 0) before calling this function,\n // but the NodeArray index returns T | undefined in noUncheckedIndexedAccess mode.\n const typeArgNode = call.typeArguments?.[0];\n if (typeArgNode === undefined) {\n return;\n }\n const resolvedType = checker.getTypeFromTypeNode(typeArgNode);\n\n // Resolve to the canonical symbol, following alias chains.\n const canonical = resolveCanonicalSymbol(resolvedType, checker);\n if (canonical === undefined) {\n // Bare primitive (string, number, etc.) — no symbol, skip.\n return;\n }\n\n // Extract the typeName from the call's object literal argument so we can\n // look up the matching runtime registration by name.\n const typeName = extractTypeNameFromCallArg(call);\n if (typeName === null) {\n return;\n }\n\n // Prefer a fully-qualified lookup (extensionId + typeName) to avoid ambiguity\n // when two extensions register types with the same typeName. Walk up the AST to\n // find the enclosing defineExtension() call and extract its extensionId.\n let entry: ExtensionTypeLookupResult | undefined;\n const extensionId = extractEnclosingExtensionId(call, checker);\n if (extensionId !== null) {\n // Qualified lookup — unambiguous when extensionId is known.\n const reg = extensionRegistry.findType(`${extensionId}/${typeName}`);\n if (reg !== undefined) {\n entry = { extensionId, registration: reg };\n }\n }\n // Fallback: linear scan by typeName across all extensions.\n entry ??= findRegistrationByTypeName(extensionRegistry, typeName);\n if (entry === undefined) {\n return;\n }\n\n symbolMap.set(canonical, entry);\n }\n\n visit(configFile);\n return symbolMap;\n}\n\n// =============================================================================\n// HELPERS (module-private)\n// =============================================================================\n\n/**\n * Returns true when `node` is a `defineCustomType<T>(...)` call expression, regardless\n * of how `defineCustomType` was imported (direct import, namespace import, or renamed import).\n *\n * Primary strategy: resolve the call expression's symbol through the type checker and\n * verify the declaration comes from `@formspec/core`. This handles namespace imports\n * (`core.defineCustomType<T>()`), renamed imports (`dct<T>()`), and re-exports.\n *\n * Fallback strategy: if the type checker cannot resolve the symbol (e.g., when the\n * config file's module resolution cannot locate `@formspec/core` from its directory),\n * fall back to a syntactic check on the bare identifier name. This covers the common\n * case of `import { defineCustomType } from \"@formspec/core\"` in environments where\n * type-checker-based symbol resolution is unavailable.\n */\nfunction isDefineCustomTypeCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n if (node.typeArguments === undefined || node.typeArguments.length === 0) return false;\n\n const callSymbol = checker.getSymbolAtLocation(node.expression);\n if (callSymbol !== undefined) {\n // Primary path: symbol resolved — verify it's defineCustomType from @formspec/core.\n const resolved =\n callSymbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(callSymbol) : callSymbol;\n\n const decl = resolved.declarations?.[0];\n if (decl !== undefined) {\n // Normalize to forward slashes for cross-platform path comparison.\n const sourceFile = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n return (\n resolved.name === \"defineCustomType\" &&\n // Match whether in node_modules/@formspec/core or monorepo packages/core.\n (sourceFile.includes(\"@formspec/core\") || sourceFile.includes(\"/packages/core/\"))\n );\n }\n }\n\n // Fallback path: type checker couldn't resolve the symbol. Fall back to a syntactic\n // check on the bare identifier name so that\n // `import { defineCustomType } from \"@formspec/core\"` still works when\n // @formspec/core is not resolvable from the config file's directory.\n return ts.isIdentifier(node.expression) && node.expression.text === \"defineCustomType\";\n}\n\n\n/**\n * Extracts the `typeName` string from a `defineCustomType({ typeName: \"...\" })` call.\n *\n * Returns `null` when the first argument is not an object literal or the\n * `typeName` property is missing / not a string literal.\n */\nfunction extractTypeNameFromCallArg(call: ts.CallExpression): string | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n return null;\n }\n\n const typeNameProp = arg.properties.find(\n (p): p is ts.PropertyAssignment =>\n ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === \"typeName\"\n );\n\n if (typeNameProp === undefined || !ts.isStringLiteral(typeNameProp.initializer)) {\n return null;\n }\n\n return typeNameProp.initializer.text;\n}\n\n/**\n * Walks up the AST from a `defineCustomType<T>()` call to find an enclosing\n * `defineExtension({ extensionId: \"...\" })` call, and returns the extensionId.\n *\n * This enables unambiguous qualified lookup (`extensionId/typeName`) when two\n * extensions register types with the same `typeName`. Returns `null` when\n * no enclosing `defineExtension` call is found.\n */\nfunction extractEnclosingExtensionId(\n call: ts.CallExpression,\n checker: ts.TypeChecker\n): string | null {\n // Walk up the AST parent chain to find an enclosing defineExtension() call.\n // ts.Node.parent is always defined after binding, so we use isSourceFile as\n // the termination condition instead of checking for undefined.\n for (let node = call.parent; !ts.isSourceFile(node); node = node.parent) {\n if (ts.isCallExpression(node) && isDefineExtensionCall(node, checker)) {\n return extractExtensionIdFromCallArg(node);\n }\n }\n return null;\n}\n\n/**\n * Returns true when `node` is a `defineExtension(...)` call expression, using\n * the same symbol-resolution strategy as {@link isDefineCustomTypeCall}.\n */\nfunction isDefineExtensionCall(node: ts.CallExpression, checker: ts.TypeChecker): boolean {\n const callSymbol = checker.getSymbolAtLocation(node.expression);\n if (callSymbol !== undefined) {\n const resolved =\n callSymbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(callSymbol) : callSymbol;\n const decl = resolved.declarations?.[0];\n if (decl !== undefined) {\n const sourceFile = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n return (\n resolved.name === \"defineExtension\" &&\n (sourceFile.includes(\"@formspec/core\") || sourceFile.includes(\"/packages/core/\"))\n );\n }\n }\n // Syntactic fallback for environments where module resolution is unavailable.\n return ts.isIdentifier(node.expression) && node.expression.text === \"defineExtension\";\n}\n\n/**\n * Extracts the `extensionId` string from a `defineExtension({ extensionId: \"...\" })` call.\n *\n * Returns `null` when the first argument is not an object literal or the\n * `extensionId` property is missing / not a string literal.\n */\nfunction extractExtensionIdFromCallArg(call: ts.CallExpression): string | null {\n const arg = call.arguments[0];\n if (arg === undefined || !ts.isObjectLiteralExpression(arg)) {\n return null;\n }\n\n const prop = arg.properties.find(\n (p): p is ts.PropertyAssignment =>\n ts.isPropertyAssignment(p) &&\n ts.isIdentifier(p.name) &&\n p.name.text === \"extensionId\"\n );\n\n if (prop === undefined || !ts.isStringLiteral(prop.initializer)) {\n return null;\n }\n\n return prop.initializer.text;\n}\n\n/**\n * Finds the registry entry for the extension type that matches `typeName`.\n *\n * Iterates extensions in registration order. Returns `undefined` if no\n * extension has a type with the given name.\n */\nfunction findRegistrationByTypeName(\n registry: ExtensionRegistry,\n typeName: string\n): ExtensionTypeLookupResult | undefined {\n for (const ext of registry.extensions) {\n if (ext.types === undefined) {\n continue;\n }\n for (const type of ext.types) {\n if (type.typeName === typeName) {\n return { extensionId: ext.extensionId, registration: type };\n }\n }\n }\n return undefined;\n}\n","/**\n * Constraint validator for the FormSpec IR.\n *\n * Delegates target-centric semantic analysis to `@formspec/analysis` so build\n * validation and editor tooling share the same inheritance, path-target,\n * contradiction, and broadening semantics.\n *\n * @packageDocumentation\n */\n\nimport { analyzeConstraintTargets, type ConstraintRegistryLike } from \"@formspec/analysis/internal\";\nimport type { FormIR, FormIRElement, FieldNode, ObjectProperty } from \"@formspec/core/internals\";\nimport type { ExtensionRegistry } from \"../extensions/index.js\";\n\n/**\n * Supported severity levels returned by static build validation.\n *\n * @public\n */\nexport type ValidationDiagnosticSeverity = \"error\" | \"warning\";\n\n/**\n * Public source-location shape attached to validation diagnostics.\n *\n * This mirrors the provenance information surfaced by the shared analysis\n * layer without exposing `@formspec/core/internals` through the public API.\n *\n * @public\n */\nexport interface ValidationDiagnosticLocation {\n /** Authoring surface that produced the diagnostic location. */\n readonly surface: \"tsdoc\" | \"chain-dsl\" | \"extension\" | \"inferred\";\n /** Absolute path to the source file. */\n readonly file: string;\n /** 1-based line number in the source file. */\n readonly line: number;\n /** 0-based column number in the source file. */\n readonly column: number;\n /** Optional span length in characters. */\n readonly length?: number;\n /** Optional tag or construct associated with the location. */\n readonly tagName?: string;\n}\n\n/**\n * A machine-readable validation diagnostic returned by static schema analysis.\n *\n * @public\n */\nexport interface ValidationDiagnostic {\n /** Stable machine-readable diagnostic code. */\n readonly code: string;\n /** Human-readable explanation of the validation problem. */\n readonly message: string;\n /** Severity of the reported validation problem. */\n readonly severity: ValidationDiagnosticSeverity;\n /** Primary source location associated with the diagnostic. */\n readonly primaryLocation: ValidationDiagnosticLocation;\n /** Related source locations that add context to the diagnostic. */\n readonly relatedLocations: readonly ValidationDiagnosticLocation[];\n}\n\n/**\n * Result of validating canonical FormIR before schema emission.\n *\n * @public\n */\nexport interface ValidationResult {\n /** Diagnostics produced during validation. */\n readonly diagnostics: readonly ValidationDiagnostic[];\n /** Whether any error-severity diagnostics were produced. */\n readonly valid: boolean;\n}\n\n/**\n * Options for validating canonical FormIR.\n *\n * @public\n */\nexport interface ValidateIROptions {\n /** Vendor prefix used when resolving extension-backed keywords. */\n readonly vendorPrefix?: string;\n /** Extension registry used to resolve custom constraints and types. */\n readonly extensionRegistry?: ExtensionRegistry;\n}\n\ninterface ValidationContext {\n readonly diagnostics: ValidationDiagnostic[];\n readonly extensionRegistry: ConstraintRegistryLike | undefined;\n readonly typeRegistry: FormIR[\"typeRegistry\"];\n}\n\nfunction validateFieldNode(ctx: ValidationContext, field: FieldNode): void {\n const analysis = analyzeConstraintTargets(\n field.name,\n field.type,\n field.constraints,\n ctx.typeRegistry,\n ctx.extensionRegistry === undefined\n ? undefined\n : {\n extensionRegistry: ctx.extensionRegistry,\n }\n );\n ctx.diagnostics.push(...analysis.diagnostics);\n\n if (field.type.kind === \"object\") {\n for (const property of field.type.properties) {\n validateObjectProperty(ctx, field.name, property);\n }\n }\n}\n\nfunction validateObjectProperty(\n ctx: ValidationContext,\n parentName: string,\n property: ObjectProperty\n): void {\n const qualifiedName = `${parentName}.${property.name}`;\n const analysis = analyzeConstraintTargets(\n qualifiedName,\n property.type,\n property.constraints,\n ctx.typeRegistry,\n ctx.extensionRegistry === undefined\n ? undefined\n : {\n extensionRegistry: ctx.extensionRegistry,\n }\n );\n ctx.diagnostics.push(...analysis.diagnostics);\n\n if (property.type.kind === \"object\") {\n for (const nestedProperty of property.type.properties) {\n validateObjectProperty(ctx, qualifiedName, nestedProperty);\n }\n }\n}\n\nfunction validateElement(ctx: ValidationContext, element: FormIRElement): void {\n switch (element.kind) {\n case \"field\":\n validateFieldNode(ctx, element);\n break;\n case \"group\":\n for (const child of element.elements) {\n validateElement(ctx, child);\n }\n break;\n case \"conditional\":\n for (const child of element.elements) {\n validateElement(ctx, child);\n }\n break;\n default: {\n const exhaustive: never = element;\n throw new Error(`Unhandled element kind: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Validates canonical FormIR and returns all discovered diagnostics.\n *\n * @public\n */\nexport function validateIR(ir: FormIR, options?: ValidateIROptions): ValidationResult {\n const ctx: ValidationContext = {\n diagnostics: [],\n extensionRegistry: options?.extensionRegistry,\n typeRegistry: ir.typeRegistry,\n };\n\n for (const element of ir.elements) {\n validateElement(ctx, element);\n }\n\n return {\n diagnostics: ctx.diagnostics,\n valid: ctx.diagnostics.every((diagnostic) => diagnostic.severity !== \"error\"),\n };\n}\n","import * as ts from \"typescript\";\nimport {\n createProgramContext,\n createProgramContextFromProgram,\n type ProgramContext,\n} from \"./analyzer/program.js\";\n\n/**\n * Supported compiler context for static build-time analysis workflows.\n *\n * This context gives consumers access to the TypeScript program, checker, and\n * source file used to discover declarations before invoking FormSpec schema\n * generation helpers.\n *\n * @public\n */\nexport interface StaticBuildContext {\n /** Host-owned or FormSpec-created TypeScript program. */\n readonly program: ts.Program;\n /** TypeScript checker for symbol and type analysis. */\n readonly checker: ts.TypeChecker;\n /** Source file used as the entry module for export resolution. */\n readonly sourceFile: ts.SourceFile;\n}\n\nfunction toStaticBuildContext(context: ProgramContext): StaticBuildContext {\n return context;\n}\n\n/**\n * Creates a supported static build context for a source file.\n *\n * @param filePath - Entry TypeScript source file used for export resolution\n * @returns Reusable build context containing the program, checker, and source file\n *\n * @public\n */\nexport function createStaticBuildContext(filePath: string): StaticBuildContext {\n return toStaticBuildContext(createProgramContext(filePath));\n}\n\n/**\n * Creates a supported static build context from an existing host-owned program.\n *\n * @param program - Existing TypeScript program supplied by the caller\n * @param filePath - Entry TypeScript source file used for export resolution\n * @returns Reusable build context containing the program, checker, and source file\n *\n * @public\n */\nexport function createStaticBuildContextFromProgram(\n program: ts.Program,\n filePath: string\n): StaticBuildContext {\n return toStaticBuildContext(createProgramContextFromProgram(program, filePath));\n}\n\nfunction getModuleSymbol(context: StaticBuildContext): ts.Symbol | undefined {\n const sourceFileWithSymbol = context.sourceFile as ts.SourceFile & { symbol?: ts.Symbol };\n return context.checker.getSymbolAtLocation(context.sourceFile) ?? sourceFileWithSymbol.symbol;\n}\n\nfunction isSchemaSourceDeclaration(\n declaration: ts.Declaration\n): declaration is ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration {\n return (\n ts.isClassDeclaration(declaration) ||\n ts.isInterfaceDeclaration(declaration) ||\n ts.isTypeAliasDeclaration(declaration)\n );\n}\n\n/**\n * Resolves an export from the context source file, following aliases and re-exports.\n *\n * @param context - Static build context created for the entry source file\n * @param exportName - Export name to resolve. Defaults to `\"default\"`.\n * @returns Resolved symbol for the export, or `null` when it cannot be found\n *\n * @public\n */\nexport function resolveModuleExport(\n context: StaticBuildContext,\n exportName = \"default\"\n): ts.Symbol | null {\n const moduleSymbol = getModuleSymbol(context);\n if (moduleSymbol === undefined) {\n return null;\n }\n\n const exportSymbol =\n context.checker\n .getExportsOfModule(moduleSymbol)\n .find((candidate) => candidate.name === exportName) ?? null;\n if (exportSymbol === null) {\n return null;\n }\n\n return exportSymbol.flags & ts.SymbolFlags.Alias\n ? context.checker.getAliasedSymbol(exportSymbol)\n : exportSymbol;\n}\n\n/**\n * Resolves the declaration behind an export from the context source file,\n * following aliases and re-exports. This helper is intentionally limited to\n * declaration kinds accepted by declaration-driven schema generation.\n *\n * @param context - Static build context created for the entry source file\n * @param exportName - Export name to resolve. Defaults to `\"default\"`.\n * @returns Resolved class, interface, or type-alias declaration for the export,\n * or `null` when the export does not resolve to one of those schema-source kinds\n *\n * @public\n */\nexport function resolveModuleExportDeclaration(\n context: StaticBuildContext,\n exportName = \"default\"\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null {\n return (\n resolveModuleExport(context, exportName)?.declarations?.find(isSchemaSourceDeclaration) ?? null\n );\n}\n","import * as ts from \"typescript\";\nimport { analyzeMetadataForNodeWithChecker } from \"@formspec/analysis/internal\";\nimport type {\n AnnotationNode,\n ObjectProperty,\n TypeDefinition,\n TypeNode,\n} from \"@formspec/core/internals\";\nimport type { MetadataPolicyInput, ResolvedMetadata } from \"@formspec/core\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport type { StaticBuildContext } from \"../static-build.js\";\nimport {\n analyzeDeclarationRootInfo,\n analyzeClassToIR,\n analyzeInterfaceToIR,\n analyzeTypeAliasToIR,\n createAnalyzerMetadataPolicy,\n resolveTypeNode,\n type IRClassAnalysis,\n} from \"../analyzer/class-analyzer.js\";\nimport {\n generateClassSchemas,\n resolveStaticOptions,\n type ClassSchemas,\n type StaticSchemaGenerationOptions,\n} from \"./class-schema.js\";\nimport { generateJsonSchemaFromIR, type JsonSchema2020 } from \"../json-schema/ir-generator.js\";\nimport { IR_VERSION, type FieldNode } from \"@formspec/core/internals\";\nimport type { ConstraintSemanticDiagnostic } from \"@formspec/analysis/internal\";\nimport {\n getDeclarationMetadataPolicy,\n mergeResolvedMetadata,\n normalizeMetadataPolicy,\n resolveFormIRMetadata,\n} from \"../metadata/index.js\";\n\n/**\n * Generated schemas for a discovered declaration or signature type.\n *\n * `uiSchema` is `null` when the discovered type does not have an object-shaped\n * root that can be represented as a JSON Forms layout.\n *\n * @public\n */\nexport interface DiscoveredTypeSchemas {\n /** JSON Schema 2020-12 for the resolved type. */\n readonly jsonSchema: JsonSchema2020;\n /** UI Schema for object-shaped roots, or `null` when not applicable. */\n readonly uiSchema: UISchema | null;\n /**\n * Resolved type-level metadata used during generation, when available.\n *\n * This preserves explicit and inferred naming metadata such as singular and\n * plural API/display names for consumers that need the resolved values in\n * addition to the emitted schema artifacts.\n */\n readonly resolvedMetadata?: ResolvedMetadata | undefined;\n}\n\n/**\n * Supported declaration kinds for declaration-driven schema generation.\n *\n * @public\n */\nexport type SchemaSourceDeclaration =\n | ts.ClassDeclaration\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Supported declaration kinds for standalone metadata resolution.\n *\n * This helper is intentionally limited to named type declarations,\n * methods/functions, and object-like properties. It does not currently expose\n * parameter or variable metadata resolution on the public build surface.\n *\n * @public\n */\nexport type MetadataSourceDeclaration =\n | SchemaSourceDeclaration\n | ts.MethodDeclaration\n | ts.FunctionDeclaration\n | ts.PropertyDeclaration\n | ts.PropertySignature;\n\n/**\n * Options for generating schemas from a resolved declaration.\n *\n * @public\n */\nexport interface GenerateSchemasFromDeclarationOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Declaration to turn into schemas. */\n readonly declaration: SchemaSourceDeclaration;\n}\n\n/**\n * Options for generating schemas from a resolved TypeScript type.\n *\n * @public\n */\nexport interface GenerateSchemasFromTypeOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** TypeScript type to turn into schemas. */\n readonly type: ts.Type;\n /**\n * Optional source node associated with the type.\n *\n * When provided, FormSpec uses it as the source location for provenance and\n * inline-type analysis.\n */\n readonly sourceNode?: ts.Node | undefined;\n /** Optional logical name used for anonymous roots. */\n readonly name?: string | undefined;\n}\n\n/**\n * Options for generating schemas from a method or function parameter type.\n *\n * @public\n */\nexport interface GenerateSchemasFromParameterOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Parameter declaration whose type should be converted into schemas. */\n readonly parameter: ts.ParameterDeclaration;\n}\n\n/**\n * Options for generating schemas from a method or function return type.\n *\n * @public\n */\nexport interface GenerateSchemasFromReturnTypeOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Signature declaration whose return type should be converted into schemas. */\n readonly declaration: ts.SignatureDeclaration;\n}\n\n/**\n * Options for resolving metadata from a declaration against the active\n * metadata policy.\n *\n * @public\n */\nexport interface ResolveDeclarationMetadataOptions extends StaticSchemaGenerationOptions {\n /** Supported build context used for checker access and related analysis. */\n readonly context: StaticBuildContext;\n /** Declaration whose metadata should be resolved. */\n readonly declaration: MetadataSourceDeclaration;\n}\n\nfunction toDiscoveredTypeSchemas(\n result: ClassSchemas,\n resolvedMetadata?: ResolvedMetadata\n): DiscoveredTypeSchemas {\n return {\n ...result,\n ...(resolvedMetadata !== undefined && { resolvedMetadata }),\n };\n}\n\nfunction isNamedTypeDeclaration(\n declaration: ts.Declaration\n): declaration is ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration {\n return (\n ts.isClassDeclaration(declaration) ||\n ts.isInterfaceDeclaration(declaration) ||\n ts.isTypeAliasDeclaration(declaration)\n );\n}\n\nfunction hasConcreteTypeArguments(type: ts.Type, checker: ts.TypeChecker): boolean {\n if (\n \"aliasTypeArguments\" in type &&\n Array.isArray(type.aliasTypeArguments) &&\n type.aliasTypeArguments.length > 0\n ) {\n return true;\n }\n\n if ((type.flags & ts.TypeFlags.Object) === 0) {\n return false;\n }\n\n const objectType = type as ts.ObjectType;\n if ((objectType.objectFlags & ts.ObjectFlags.Reference) === 0) {\n return false;\n }\n\n return checker.getTypeArguments(objectType as ts.TypeReference).length > 0;\n}\n\nfunction getNamedTypeDeclaration(\n type: ts.Type\n): ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration | undefined {\n const symbol = type.getSymbol();\n if (symbol?.declarations !== undefined) {\n const declaration = symbol.declarations[0];\n if (declaration !== undefined && isNamedTypeDeclaration(declaration)) {\n return declaration;\n }\n }\n\n const aliasDeclaration = type.aliasSymbol?.declarations?.find(ts.isTypeAliasDeclaration);\n return aliasDeclaration;\n}\n\nfunction getFallbackName(sourceNode: ts.Node | undefined, fallback = \"AnonymousType\"): string {\n if (sourceNode !== undefined && \"name\" in sourceNode) {\n const namedNode = sourceNode as ts.Node & { name?: ts.PropertyName | ts.BindingName };\n if (namedNode.name !== undefined && ts.isIdentifier(namedNode.name)) {\n return namedNode.name.text;\n }\n }\n\n return fallback;\n}\n\nfunction createObjectRootAnalysis(\n name: string,\n properties: readonly ObjectProperty[],\n typeRegistry: Record<string, TypeDefinition>,\n metadata?: ResolvedMetadata,\n annotations?: readonly AnnotationNode[]\n): IRClassAnalysis {\n const fields: FieldNode[] = properties.map((property) => ({\n kind: \"field\",\n name: property.name,\n ...(property.metadata !== undefined && { metadata: property.metadata }),\n type: property.type,\n required: !property.optional,\n constraints: property.constraints,\n annotations: property.annotations,\n provenance: property.provenance,\n }));\n\n return {\n name,\n ...(metadata !== undefined && { metadata }),\n fields,\n fieldLayouts: fields.map(() => ({})),\n typeRegistry,\n ...(annotations !== undefined && annotations.length > 0 && { annotations }),\n instanceMethods: [],\n staticMethods: [],\n diagnostics: [],\n };\n}\n\ninterface RootTypeDescriptor {\n readonly name: string;\n readonly metadata?: ResolvedMetadata;\n readonly annotations?: readonly AnnotationNode[];\n readonly type: TypeNode;\n}\n\ninterface RootTypeOverride {\n readonly name?: string;\n readonly metadata?: ResolvedMetadata;\n readonly annotations?: readonly AnnotationNode[];\n}\n\nfunction omitApiName(metadata: ResolvedMetadata | undefined): ResolvedMetadata | undefined {\n if (metadata?.apiName === undefined) {\n return metadata;\n }\n\n const { apiName: _apiName, ...rest } = metadata;\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nfunction enforceRequiredMetadata(\n metadata: ResolvedMetadata | undefined,\n declarationKind: \"type\" | \"field\" | \"method\",\n logicalName: string,\n metadataPolicy: MetadataPolicyInput | undefined\n): void {\n const declarationPolicy = getDeclarationMetadataPolicy(\n normalizeMetadataPolicy(metadataPolicy),\n declarationKind\n );\n\n if (metadata?.apiName === undefined && declarationPolicy.apiName.mode === \"require-explicit\") {\n throw new Error(\n `Metadata policy requires explicit apiName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.displayName === undefined &&\n declarationPolicy.displayName.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayName for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.apiNamePlural === undefined &&\n declarationPolicy.apiName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit apiNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n if (\n metadata?.displayNamePlural === undefined &&\n declarationPolicy.displayName.pluralization.mode === \"require-explicit\"\n ) {\n throw new Error(\n `Metadata policy requires explicit displayNamePlural for ${declarationKind} \"${logicalName}\" on the tsdoc surface.`\n );\n }\n}\n\nfunction describeRootType(\n rootType: TypeNode,\n typeRegistry: Readonly<Record<string, TypeDefinition>>,\n fallbackName: string\n): RootTypeDescriptor {\n if (rootType.kind !== \"reference\") {\n return {\n name: fallbackName,\n type: rootType,\n };\n }\n\n const definition = typeRegistry[rootType.name];\n if (definition === undefined) {\n return {\n name: rootType.name,\n type: rootType,\n };\n }\n\n return {\n name: definition.name,\n ...(definition.metadata !== undefined && { metadata: definition.metadata }),\n ...(definition.annotations !== undefined &&\n definition.annotations.length > 0 && { annotations: definition.annotations }),\n type: definition.type,\n };\n}\n\nfunction toStandaloneJsonSchema(\n root: RootTypeDescriptor,\n typeRegistry: Record<string, TypeDefinition>,\n resolved: ReturnType<typeof resolveStaticOptions> | undefined\n): JsonSchema2020 {\n const syntheticFieldMetadata = omitApiName(root.metadata);\n const syntheticField: FieldNode = {\n kind: \"field\",\n name: \"__result\",\n metadata: {\n ...syntheticFieldMetadata,\n // Pin apiName so metadata-policy transforms (e.g. toStripeApiCase)\n // cannot rename this synthetic wrapper field. The lookup below\n // expects \"__result\" in the output schema properties.\n apiName: { value: \"__result\", source: \"explicit\" },\n },\n type: root.type,\n required: true,\n constraints: [],\n annotations: [...(root.annotations ?? [])],\n provenance: {\n surface: \"tsdoc\",\n file: \"\",\n line: 1,\n column: 0,\n },\n };\n\n const ir = resolveFormIRMetadata(\n {\n kind: \"form-ir\",\n name: root.name,\n irVersion: IR_VERSION,\n elements: [syntheticField],\n ...(root.metadata !== undefined && { metadata: root.metadata }),\n ...(root.annotations !== undefined &&\n root.annotations.length > 0 && { rootAnnotations: root.annotations }),\n typeRegistry,\n provenance: syntheticField.provenance,\n },\n {\n policy: normalizeMetadataPolicy(resolved?.metadata),\n surface: \"tsdoc\",\n rootLogicalName: root.name,\n }\n );\n\n const schema = generateJsonSchemaFromIR(ir, {\n extensionRegistry: resolved?.extensionRegistry,\n enumSerialization: resolved?.enumSerialization,\n vendorPrefix: resolved?.vendorPrefix,\n });\n\n const result = schema.properties?.[\"__result\"];\n if (result === undefined) {\n throw new Error(\"FormSpec failed to extract the standalone schema root from the synthetic IR.\");\n }\n\n if (schema.$defs === undefined || Object.keys(schema.$defs).length === 0) {\n return {\n ...(schema.$schema !== undefined && { $schema: schema.$schema }),\n ...result,\n };\n }\n\n return {\n ...(schema.$schema !== undefined && { $schema: schema.$schema }),\n ...result,\n $defs: schema.$defs,\n };\n}\n\nfunction generateSchemasFromAnalysis(\n analysis: IRClassAnalysis,\n filePath: string,\n resolved: ReturnType<typeof resolveStaticOptions> | undefined\n): DiscoveredTypeSchemas {\n return toDiscoveredTypeSchemas(\n generateClassSchemas(\n analysis,\n { file: filePath },\n {\n extensionRegistry: resolved?.extensionRegistry,\n enumSerialization: resolved?.enumSerialization,\n metadata: resolved?.metadata,\n vendorPrefix: resolved?.vendorPrefix,\n }\n ),\n analysis.metadata\n );\n}\n\nfunction generateSchemasFromResolvedType(\n options: GenerateSchemasFromTypeOptions,\n skipNamedDeclaration = false,\n rootOverride?: RootTypeOverride\n): DiscoveredTypeSchemas {\n const resolved = resolveStaticOptions(options);\n const namedDeclaration =\n skipNamedDeclaration || hasConcreteTypeArguments(options.type, options.context.checker)\n ? undefined\n : getNamedTypeDeclaration(options.type);\n if (namedDeclaration !== undefined) {\n return generateSchemasFromDeclaration({\n ...options,\n declaration: namedDeclaration,\n });\n }\n\n const filePath =\n options.sourceNode?.getSourceFile().fileName ?? options.context.sourceFile.fileName;\n const typeRegistry: Record<string, TypeDefinition> = {};\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const rootType = resolveTypeNode(\n options.type,\n options.context.checker,\n filePath,\n typeRegistry,\n new Set<ts.Type>(),\n options.sourceNode,\n createAnalyzerMetadataPolicy(resolved.metadata, options.discriminator),\n resolved.extensionRegistry,\n diagnostics\n );\n\n if (diagnostics.length > 0) {\n const diagnosticDetails = diagnostics\n .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)\n .join(\"; \");\n throw new Error(\n `FormSpec validation failed while generating discovered type schemas. ${diagnosticDetails}`\n );\n }\n\n const describedRoot = describeRootType(\n rootType,\n typeRegistry,\n options.name ?? getFallbackName(options.sourceNode)\n );\n const mergedMetadata = mergeResolvedMetadata(describedRoot.metadata, rootOverride?.metadata);\n const root: RootTypeDescriptor = {\n ...describedRoot,\n ...(rootOverride?.name !== undefined && { name: rootOverride.name }),\n ...(mergedMetadata !== undefined && { metadata: mergedMetadata }),\n ...(rootOverride?.annotations !== undefined && { annotations: rootOverride.annotations }),\n };\n\n if (root.type.kind === \"object\") {\n return generateSchemasFromAnalysis(\n createObjectRootAnalysis(\n options.name ?? root.name,\n root.type.properties,\n typeRegistry,\n root.metadata,\n root.annotations\n ),\n filePath,\n resolved\n );\n }\n\n return {\n jsonSchema: toStandaloneJsonSchema(root, typeRegistry, resolved),\n uiSchema: null,\n ...(root.metadata !== undefined && { resolvedMetadata: root.metadata }),\n };\n}\n\n/**\n * Generates schemas from a resolved declaration using the supported public\n * static-build workflow.\n *\n * Named declarations reuse the same analyzer semantics as FormSpec's existing\n * top-level generation APIs. Non-object type aliases fall back to the generic\n * resolved-type entry point.\n *\n * @public\n */\nexport function generateSchemasFromDeclaration(\n options: GenerateSchemasFromDeclarationOptions\n): DiscoveredTypeSchemas {\n const filePath = options.declaration.getSourceFile().fileName;\n const resolved = resolveStaticOptions(options);\n\n if (ts.isClassDeclaration(options.declaration)) {\n return generateSchemasFromAnalysis(\n analyzeClassToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n ),\n filePath,\n resolved\n );\n }\n\n if (ts.isInterfaceDeclaration(options.declaration)) {\n return generateSchemasFromAnalysis(\n analyzeInterfaceToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n ),\n filePath,\n resolved\n );\n }\n\n if (ts.isTypeAliasDeclaration(options.declaration)) {\n const analyzedAlias = analyzeTypeAliasToIR(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata,\n options.discriminator\n );\n if (analyzedAlias.ok) {\n return generateSchemasFromAnalysis(analyzedAlias.analysis, filePath, resolved);\n }\n const aliasRootInfo = analyzeDeclarationRootInfo(\n options.declaration,\n options.context.checker,\n filePath,\n resolved.extensionRegistry,\n resolved.metadata\n );\n if (aliasRootInfo.diagnostics.length > 0) {\n const diagnosticDetails = aliasRootInfo.diagnostics\n .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)\n .join(\"; \");\n throw new Error(\n `FormSpec validation failed while generating discovered type schemas. ${diagnosticDetails}`\n );\n }\n\n return generateSchemasFromResolvedType(\n {\n ...options,\n type: options.context.checker.getTypeAtLocation(options.declaration),\n sourceNode: options.declaration,\n name: options.declaration.name.text,\n },\n true,\n {\n name: options.declaration.name.text,\n ...(aliasRootInfo.metadata !== undefined && { metadata: aliasRootInfo.metadata }),\n ...(aliasRootInfo.annotations.length > 0 && { annotations: aliasRootInfo.annotations }),\n }\n );\n }\n\n const _exhaustive: never = options.declaration;\n return _exhaustive;\n}\n\n/**\n * Generates schemas from a resolved TypeScript type.\n *\n * This is the advanced public entry point for build tooling that already uses\n * the TypeScript compiler API to discover types before handing them to\n * FormSpec.\n *\n * @public\n */\nexport function generateSchemasFromType(\n options: GenerateSchemasFromTypeOptions\n): DiscoveredTypeSchemas {\n return generateSchemasFromResolvedType(options);\n}\n\n/**\n * Generates schemas for a method or function parameter type.\n *\n * @public\n */\nexport function generateSchemasFromParameter(\n options: GenerateSchemasFromParameterOptions\n): DiscoveredTypeSchemas {\n return generateSchemasFromResolvedType({\n ...options,\n type: options.context.checker.getTypeAtLocation(options.parameter),\n sourceNode: options.parameter,\n name: getFallbackName(options.parameter, \"Parameter\"),\n });\n}\n\n/**\n * Generates schemas for a method or function return type.\n *\n * Awaited `Promise<T>`-style return types are unwrapped before generation.\n *\n * @public\n */\nexport function generateSchemasFromReturnType(\n options: GenerateSchemasFromReturnTypeOptions\n): DiscoveredTypeSchemas {\n const signature = options.context.checker.getSignatureFromDeclaration(options.declaration);\n const returnType =\n signature !== undefined\n ? options.context.checker.getReturnTypeOfSignature(signature)\n : options.context.checker.getTypeAtLocation(options.declaration);\n const type = unwrapPromiseType(options.context.checker, returnType);\n const sourceNode =\n type !== returnType\n ? (unwrapPromiseTypeNode(options.declaration.type) ??\n options.declaration.type ??\n options.declaration)\n : (options.declaration.type ?? options.declaration);\n\n const fallbackName =\n options.declaration.name !== undefined && ts.isIdentifier(options.declaration.name)\n ? `${options.declaration.name.text}ReturnType`\n : \"ReturnType\";\n\n return generateSchemasFromResolvedType({\n ...options,\n type,\n sourceNode,\n name: fallbackName,\n });\n}\n\n/**\n * Resolves metadata from a declaration using FormSpec's configured metadata\n * policy for the matching declaration kind.\n *\n * @public\n */\nexport function resolveDeclarationMetadata(\n options: ResolveDeclarationMetadataOptions\n): ResolvedMetadata | undefined {\n const resolved = resolveStaticOptions(options);\n const analysis = analyzeMetadataForNodeWithChecker({\n checker: options.context.checker,\n node: options.declaration,\n metadata: resolved.metadata,\n extensions: resolved.extensionRegistry?.extensions,\n buildContext: options.context,\n });\n if (analysis === null) {\n return undefined;\n }\n\n const metadata = analysis.resolvedMetadata;\n\n enforceRequiredMetadata(metadata, analysis.declarationKind, analysis.logicalName, resolved.metadata);\n return metadata;\n}\n\nfunction unwrapPromiseType(checker: ts.TypeChecker, type: ts.Type): ts.Type {\n if (!(\"getAwaitedType\" in checker) || typeof checker.getAwaitedType !== \"function\") {\n return type;\n }\n\n const awaited = checker.getAwaitedType(type) ?? type;\n if (awaited === type && looksLikePromiseType(checker, type)) {\n // The type prints as `Promise<T>` but the checker could not await it. The\n // most common cause is a TypeScript compiler host that cannot locate its\n // default lib files (e.g. `lib.es2015.promise.d.ts`) — for example after\n // bundling `typescript` with esbuild. Without this check, the payload type\n // would silently degrade to `{ type: \"string\" }` in the generated schema\n // (see issue #256).\n throw new Error(\n `FormSpec could not unwrap the awaited type from \"${checker.typeToString(type)}\". ` +\n `This usually indicates the TypeScript compiler host cannot resolve its default ` +\n `lib files (for example \"lib.es2015.promise.d.ts\"). Ensure the program is configured ` +\n `with the standard library available to \\`ts.createProgram\\`.`\n );\n }\n\n return awaited;\n}\n\nfunction looksLikePromiseType(checker: ts.TypeChecker, type: ts.Type): boolean {\n const symbolName = type.getSymbol()?.getName();\n if (symbolName === \"Promise\" || symbolName === \"PromiseLike\") {\n return true;\n }\n return /^(?:Promise|PromiseLike)\\b/.test(checker.typeToString(type));\n}\n\nfunction unwrapPromiseTypeNode(typeNode: ts.TypeNode | undefined): ts.TypeNode | undefined {\n if (typeNode === undefined) {\n return undefined;\n }\n\n if (ts.isParenthesizedTypeNode(typeNode)) {\n const unwrapped = unwrapPromiseTypeNode(typeNode.type);\n return unwrapped ?? typeNode;\n }\n\n return isPromiseTypeReferenceNode(typeNode) ? typeNode.typeArguments[0] : typeNode;\n}\n\nfunction isPromiseTypeReferenceNode(\n typeNode: ts.TypeNode\n): typeNode is ts.TypeReferenceNode & { typeArguments: [ts.TypeNode, ...ts.TypeNode[]] } {\n return (\n ts.isTypeReferenceNode(typeNode) &&\n ts.isIdentifier(typeNode.typeName) &&\n typeNode.typeName.text === \"Promise\" &&\n typeNode.typeArguments !== undefined &&\n typeNode.typeArguments.length > 0\n );\n}\n","/**\n * Mixed-authoring schema generator.\n *\n * Composes a statically analyzed TSDoc/class/interface/type-alias model with\n * ChainDSL-authored field overlays. The static model remains authoritative for\n * structure and constraints; overlays may add runtime field behavior such as\n * dynamic enum or dynamic schema metadata.\n */\n\nimport type { FormElement, FormSpec } from \"@formspec/core\";\nimport type { AnnotationNode, FieldNode, FormIRElement, TypeNode } from \"@formspec/core/internals\";\nimport type { JsonSchema2020 } from \"../json-schema/ir-generator.js\";\nimport { generateJsonSchemaFromIR } from \"../json-schema/ir-generator.js\";\nimport { generateUiSchemaFromIR } from \"../ui-schema/ir-generator.js\";\nimport type { UISchema } from \"../ui-schema/types.js\";\nimport { canonicalizeChainDSL, canonicalizeTSDoc } from \"../canonicalize/index.js\";\nimport { analyzeNamedTypeToIR } from \"../analyzer/program.js\";\nimport type { IRClassAnalysis } from \"../analyzer/class-analyzer.js\";\nimport type { StaticSchemaGenerationOptions } from \"./class-schema.js\";\nimport { mergeResolvedMetadata } from \"../metadata/index.js\";\n\n/**\n * Result of generating schemas from a mixed-authoring composition.\n *\n * @public\n */\nexport interface MixedAuthoringSchemas {\n /** JSON Schema 2020-12 for validation. */\n readonly jsonSchema: JsonSchema2020;\n /** JSON Forms UI Schema for rendering. */\n readonly uiSchema: UISchema;\n}\n\n/**\n * Options for generating mixed-authoring schemas.\n *\n * The `typeName` can resolve to a class, interface, or object type alias, just\n * like `generateSchemas()`.\n *\n * @public\n */\nexport interface BuildMixedAuthoringSchemasOptions extends StaticSchemaGenerationOptions {\n /** Path to the TypeScript source file. */\n readonly filePath: string;\n /** Name of the class, interface, or type alias to analyze. */\n readonly typeName: string;\n /** ChainDSL overlays to apply to the static model. Groups and conditionals are flattened by field name. */\n readonly overlays: FormSpec<readonly FormElement[]>;\n}\n\n/**\n * Builds JSON Schema and UI Schema from a TSDoc-derived model with ChainDSL\n * field overlays.\n *\n * Overlays are matched by field name. The static model wins for structure,\n * ordering, and constraints; ChainDSL overlays may contribute dynamic runtime\n * field metadata such as dynamic enum or dynamic schema keywords, and may fill\n * in missing annotations.\n *\n * @public\n */\nexport function buildMixedAuthoringSchemas(\n options: BuildMixedAuthoringSchemasOptions\n): MixedAuthoringSchemas {\n const { filePath, typeName, overlays, ...schemaOptions } = options;\n const analysis = analyzeNamedTypeToIR(\n filePath,\n typeName,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.extensionRegistry,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.metadata,\n schemaOptions.discriminator\n );\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n const composedAnalysis = composeAnalysisWithOverlays(analysis, overlays, schemaOptions.metadata);\n const ir = canonicalizeTSDoc(\n composedAnalysis,\n { file: filePath },\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- migration bridge reads deprecated fields\n schemaOptions.metadata !== undefined ? { metadata: schemaOptions.metadata } : undefined\n );\n\n return {\n jsonSchema: generateJsonSchemaFromIR(ir, schemaOptions),\n uiSchema: generateUiSchemaFromIR(ir),\n };\n}\n\nfunction composeAnalysisWithOverlays(\n analysis: IRClassAnalysis,\n overlays: FormSpec<readonly FormElement[]>,\n metadata: StaticSchemaGenerationOptions[\"metadata\"]\n): IRClassAnalysis {\n const overlayIR = canonicalizeChainDSL(\n overlays,\n metadata !== undefined ? { metadata } : undefined\n );\n const overlayFields = collectOverlayFields(overlayIR.elements);\n\n if (overlayFields.length === 0) {\n return analysis;\n }\n\n const overlayByName = new Map<string, FieldNode>();\n for (const field of overlayFields) {\n if (overlayByName.has(field.name)) {\n throw new Error(`Mixed-authoring overlays define \"${field.name}\" more than once`);\n }\n overlayByName.set(field.name, field);\n }\n\n const mergedFields: FieldNode[] = [];\n\n for (const baseField of analysis.fields) {\n const overlayField = overlayByName.get(baseField.name);\n if (overlayField === undefined) {\n mergedFields.push(baseField);\n continue;\n }\n\n mergedFields.push(mergeFieldOverlay(baseField, overlayField, analysis.typeRegistry));\n overlayByName.delete(baseField.name);\n }\n\n if (overlayByName.size > 0) {\n const unknownFields = [...overlayByName.keys()].sort().join(\", \");\n throw new Error(\n `Mixed-authoring overlays reference fields that are not present in the static model: ${unknownFields}`\n );\n }\n\n return {\n ...analysis,\n fields: mergedFields,\n };\n}\n\nfunction collectOverlayFields(elements: readonly FormIRElement[]): FieldNode[] {\n const fields: FieldNode[] = [];\n\n for (const element of elements) {\n switch (element.kind) {\n case \"field\":\n fields.push(element);\n break;\n case \"group\":\n fields.push(...collectOverlayFields(element.elements));\n break;\n case \"conditional\":\n fields.push(...collectOverlayFields(element.elements));\n break;\n default: {\n const _exhaustive: never = element;\n void _exhaustive;\n }\n }\n }\n\n return fields;\n}\n\nfunction mergeFieldOverlay(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): FieldNode {\n assertSupportedOverlayField(baseField, overlayField);\n const metadata = mergeResolvedMetadata(baseField.metadata, overlayField.metadata);\n return {\n ...baseField,\n ...(metadata !== undefined && { metadata }),\n type: mergeFieldType(baseField, overlayField, typeRegistry),\n annotations: mergeAnnotations(baseField.annotations, overlayField.annotations),\n };\n}\n\nfunction assertSupportedOverlayField(baseField: FieldNode, overlayField: FieldNode): void {\n if (overlayField.constraints.length > 0) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" cannot define constraints; keep constraints on the static model`\n );\n }\n\n if (overlayField.required && !baseField.required) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" cannot change requiredness; keep requiredness on the static model`\n );\n }\n}\n\nfunction mergeFieldType(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): TypeNode {\n const { type: baseType } = baseField;\n const { type: overlayType } = overlayField;\n\n if (overlayType.kind === \"object\" || overlayType.kind === \"array\") {\n throw new Error(\n `Mixed-authoring overlays do not support nested object or array overlays for \"${baseField.name}\"`\n );\n }\n\n if (overlayType.kind === \"dynamic\") {\n if (!isCompatibleDynamicOverlay(baseField, overlayField, typeRegistry)) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" is incompatible with the static field type`\n );\n }\n return overlayType;\n }\n\n if (!isSameStaticTypeShape(baseType, overlayType)) {\n throw new Error(\n `Mixed-authoring overlay for \"${baseField.name}\" must preserve the static field type`\n );\n }\n\n return baseType;\n}\n\nfunction isCompatibleDynamicOverlay(\n baseField: FieldNode,\n overlayField: FieldNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"]\n): boolean {\n const overlayType = overlayField.type;\n if (overlayType.kind !== \"dynamic\") {\n return false;\n }\n\n const resolvedBaseType = resolveReferenceType(baseField.type, typeRegistry);\n if (resolvedBaseType === null) {\n return false;\n }\n\n if (overlayType.dynamicKind === \"enum\") {\n return resolvedBaseType.kind === \"primitive\"\n ? resolvedBaseType.primitiveKind === \"string\"\n : resolvedBaseType.kind === \"enum\";\n }\n\n return resolvedBaseType.kind === \"object\" || resolvedBaseType.kind === \"record\";\n}\n\nfunction resolveReferenceType(\n type: TypeNode,\n typeRegistry: IRClassAnalysis[\"typeRegistry\"],\n seen = new Set<string>()\n): TypeNode | null {\n if (type.kind !== \"reference\") {\n return type;\n }\n\n if (seen.has(type.name)) {\n return null;\n }\n\n const definition = typeRegistry[type.name];\n if (definition === undefined) {\n return null;\n }\n\n seen.add(type.name);\n return resolveReferenceType(definition.type, typeRegistry, seen);\n}\n\nfunction isSameStaticTypeShape(baseType: TypeNode, overlayType: TypeNode): boolean {\n if (baseType.kind !== overlayType.kind) {\n return false;\n }\n\n switch (baseType.kind) {\n case \"primitive\":\n return (\n overlayType.kind === \"primitive\" && baseType.primitiveKind === overlayType.primitiveKind\n );\n case \"enum\":\n return overlayType.kind === \"enum\";\n case \"dynamic\":\n return (\n overlayType.kind === \"dynamic\" &&\n baseType.dynamicKind === overlayType.dynamicKind &&\n baseType.sourceKey === overlayType.sourceKey\n );\n case \"record\":\n return overlayType.kind === \"record\";\n case \"reference\":\n return overlayType.kind === \"reference\" && baseType.name === overlayType.name;\n case \"union\":\n return overlayType.kind === \"union\";\n case \"custom\":\n return overlayType.kind === \"custom\" && baseType.typeId === overlayType.typeId;\n case \"object\":\n case \"array\":\n // Mixed authoring keeps the static type verbatim for structured fields.\n // We only need shape equality for scalar-like overlays that could replace\n // the static field type if we returned the overlay type by mistake.\n return true;\n default: {\n const _exhaustive: never = baseType;\n return _exhaustive;\n }\n }\n}\n\nfunction mergeAnnotations(\n baseAnnotations: readonly AnnotationNode[],\n overlayAnnotations: readonly AnnotationNode[]\n): AnnotationNode[] {\n const baseKeys = new Set(baseAnnotations.map(annotationKey));\n const overlayOnly = overlayAnnotations.filter(\n (annotation) => !baseKeys.has(annotationKey(annotation))\n );\n return [...baseAnnotations, ...overlayOnly];\n}\n\nfunction annotationKey(annotation: AnnotationNode): string {\n return annotation.annotationKind === \"custom\"\n ? `${annotation.annotationKind}:${annotation.annotationId}`\n : annotation.annotationKind;\n}\n"],"mappings":"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","names":["import_core","import_internals","import_core","import_zod","path","import_internals","import_zod","ts","ts","ts","import_internal","ts","ts","import_internal","import_internals","import_core","ts","import_internal","import_internal","import_internal","path","result","text","provenance","members","isBooleanUnion","ts","path","import_internal","ts","ts","import_internal","import_internals","getNamedTypeDeclaration","uiSchema"]}
|