{"version":3,"sources":["../src/index.ts","../src/field.ts","../src/factory.ts","../src/validation.ts","../src/structure.ts","../src/predicate.ts"],"sourcesContent":["/**\n * `@formspec/dsl` - DSL functions for defining FormSpec forms\n *\n * This package provides the builder functions for creating form specifications:\n * - `field.*` - Field builders (text, number, boolean, enum, dynamicEnum)\n * - `group()` - Visual grouping\n * - `when()` + `is()` - Conditional visibility\n * - `formspec()` - Top-level form definition\n *\n * @example\n * ```typescript\n * import { formspec, field, group, when, is } from \"@formspec/dsl\";\n *\n * const InvoiceForm = formspec(\n *   group(\"Customer\",\n *     field.text(\"customerName\", { label: \"Customer Name\" }),\n *     field.dynamicEnum(\"country\", \"fetch_countries\", { label: \"Country\" }),\n *   ),\n *   group(\"Invoice Details\",\n *     field.number(\"amount\", { label: \"Amount\", min: 0 }),\n *     field.enum(\"status\", [\"draft\", \"sent\", \"paid\"] as const),\n *     when(is(\"status\", \"draft\"),\n *       field.text(\"internalNotes\", { label: \"Internal Notes\" }),\n *     ),\n *   ),\n * );\n * ```\n *\n * @packageDocumentation\n */\n\n// Field builders\nexport { field, createFieldBuilders } from \"./field.js\";\nexport type {\n  ApiNameConfig,\n  ArrayBuilderArgs,\n  ArrayFieldConfig,\n  BooleanFieldConfig,\n  FieldMetadataPolicy,\n  DynamicEnumFieldConfig,\n  DynamicSchemaFieldConfig,\n  FieldBuilderElement,\n  FieldBuilderInputElement,\n  FieldBuilderNamespace,\n  HasRequiredMetadata,\n  IsRequiredMetadata,\n  LabelDisplayNameConfig,\n  MaybeRequiredConfigArg,\n  MetadataAwareFieldConfig,\n  NumberFieldConfig,\n  ObjectBuilderArgs,\n  ObjectFieldConfig,\n  StaticEnumFieldConfig,\n  TextFieldConfig,\n} from \"./field.js\";\nexport { createFormSpecFactory } from \"./factory.js\";\nexport type { FormSpecFactory } from \"./factory.js\";\n\n// Predicate builders\nexport { is } from \"./predicate.js\";\n\n// Structure builders\nexport { group, when, formspec, formspecWithValidation } from \"./structure.js\";\nexport type { FormSpecOptions } from \"./structure.js\";\n\n// Validation\nexport { validateForm, logValidationIssues } from \"./validation.js\";\nexport type { ValidationSeverity, ValidationIssue, ValidationResult } from \"./validation.js\";\n\n// Type inference utilities\nexport type {\n  InferFieldValue,\n  ExtractFields,\n  ExtractFieldsFromArray,\n  ExtractNonConditionalFields,\n  ExtractNonConditionalFieldsFromArray,\n  ExtractConditionalFields,\n  ExtractConditionalFieldsFromArray,\n  BuildSchema,\n  FlattenIntersection,\n  InferSchema,\n  InferFormSchema,\n} from \"./inference.js\";\n\n// Re-export enum option types from core for convenience\nexport type {\n  AnyField,\n  ArrayField,\n  BooleanField,\n  Conditional,\n  DeclarationMetadataPolicyInput,\n  DataSourceRegistry,\n  DataSourceValueType,\n  DynamicEnumField,\n  DynamicSchemaField,\n  EnumOption,\n  EnumOptionValue,\n  EqualsPredicate,\n  FormElement,\n  FormSpec,\n  Group,\n  MetadataAuthoringSurface,\n  MetadataDeclarationKind,\n  MetadataInferenceContext,\n  MetadataInferenceFn,\n  EnumMemberMetadataInferenceContext,\n  EnumMemberMetadataInferenceFn,\n  MetadataPluralizationContext,\n  MetadataPluralizationDisabledPolicyInput,\n  MetadataPluralizationFn,\n  MetadataPluralizationInferIfMissingPolicyInput,\n  MetadataPluralizationPolicyInput,\n  MetadataPluralizationRequireExplicitPolicyInput,\n  MetadataResolutionMode,\n  MetadataSource,\n  MetadataValueDisabledPolicyInput,\n  MetadataValueInferIfMissingPolicyInput,\n  MetadataValuePolicyInput,\n  MetadataValueRequireExplicitPolicyInput,\n  EnumMemberDisplayNameDisabledPolicyInput,\n  EnumMemberDisplayNameRequireExplicitPolicyInput,\n  EnumMemberDisplayNameInferIfMissingPolicyInput,\n  EnumMemberDisplayNamePolicyInput,\n  EnumMemberMetadataPolicyInput,\n  NumberField,\n  ObjectField,\n  Predicate,\n  ResolvedMetadata,\n  ResolvedScalarMetadata,\n  StaticEnumField,\n  TextField,\n  MetadataPolicyInput,\n} from \"@formspec/core\";\n","/**\n * Field builder functions for creating form field definitions.\n *\n * Each function creates a field descriptor that captures both schema information\n * (name, type) and UI hints (label, placeholder, etc.).\n */\n\nimport type {\n  ArrayField,\n  BooleanField,\n  DynamicEnumField,\n  DynamicSchemaField,\n  EnumOptionValue,\n  FormElement,\n  MetadataPolicyInput,\n  NumberField,\n  ObjectField,\n  StaticEnumField,\n  TextField,\n} from \"@formspec/core\";\n\ndeclare const FIELD_POLICY_BRAND: unique symbol;\n\n/**\n * Branded field element produced by a policy-scoped builder namespace.\n *\n * @public\n */\nexport type FieldBuilderElement<Policy, Element extends FormElement = FormElement> = Element & {\n  readonly [FIELD_POLICY_BRAND]: Policy extends undefined\n    ? { readonly __formspecDefaultFieldPolicy: true }\n    : Policy;\n};\n\n/**\n * Input element accepted by policy-scoped composite field builders.\n *\n * @public\n */\nexport type FieldBuilderInputElement<Policy> = Policy extends undefined\n  ? FormElement\n  : FieldBuilderElement<Policy>;\n\n/**\n * Field-specific metadata policy extracted from a broader metadata policy input.\n *\n * @public\n */\nexport type FieldMetadataPolicy<Policy> = Policy extends { readonly field?: infer FieldPolicy }\n  ? FieldPolicy\n  : undefined;\n\n/**\n * Whether a specific metadata key is required by the active policy.\n *\n * @public\n */\nexport type IsRequiredMetadata<Policy, Key extends \"apiName\" | \"displayName\"> =\n  FieldMetadataPolicy<Policy> extends Record<string, unknown>\n    ? FieldMetadataPolicy<Policy>[Key] extends { readonly mode: \"require-explicit\" }\n      ? true\n      : false\n    : false;\n\n/**\n * Label/displayName config shape under a required-or-optional policy.\n *\n * @public\n */\nexport type LabelDisplayNameConfig<Required extends boolean> = Required extends true\n  ?\n      | { readonly label: string; readonly displayName?: never }\n      | { readonly label?: never; readonly displayName: string }\n  :\n      | { readonly label?: string; readonly displayName?: never }\n      | { readonly label?: never; readonly displayName?: string }\n      | { readonly label?: undefined; readonly displayName?: undefined };\n\n/**\n * apiName config shape under a required-or-optional policy.\n *\n * @public\n */\nexport type ApiNameConfig<Required extends boolean> = Required extends true\n  ? { readonly apiName: string }\n  : { readonly apiName?: string };\n\n/**\n * Whether the active policy requires any explicit field metadata.\n *\n * @public\n */\nexport type HasRequiredMetadata<Policy> =\n  IsRequiredMetadata<Policy, \"apiName\"> extends true\n    ? true\n    : IsRequiredMetadata<Policy, \"displayName\"> extends true\n      ? true\n      : false;\n\n/**\n * Base field config augmented with metadata requirements from the active policy.\n *\n * @public\n */\nexport type MetadataAwareFieldConfig<BaseConfig, Policy> = Omit<\n  BaseConfig,\n  \"label\" | \"displayName\" | \"apiName\"\n> &\n  ApiNameConfig<IsRequiredMetadata<Policy, \"apiName\">> &\n  LabelDisplayNameConfig<IsRequiredMetadata<Policy, \"displayName\">>;\n\n/**\n * Optional-or-required config tuple driven by the active metadata policy.\n *\n * @public\n */\nexport type MaybeRequiredConfigArg<Config, Policy> =\n  HasRequiredMetadata<Policy> extends true ? readonly [config: Config] : readonly [config?: Config];\n\n/**\n * Argument tuple for policy-scoped array field builders.\n *\n * @public\n */\nexport type ArrayBuilderArgs<\n  N extends string,\n  Items extends readonly FieldBuilderInputElement<Policy>[],\n  Policy,\n> =\n  HasRequiredMetadata<Policy> extends true\n    ? readonly [config: ArrayFieldConfig<N, Items, Policy>, ...items: Items]\n    :\n        | readonly [...items: Items]\n        | readonly [config: ArrayFieldConfig<N, Items, Policy>, ...items: Items];\n\n/**\n * Argument tuple for policy-scoped object field builders.\n *\n * @public\n */\nexport type ObjectBuilderArgs<\n  N extends string,\n  Properties extends readonly FieldBuilderInputElement<Policy>[],\n  Policy,\n> =\n  HasRequiredMetadata<Policy> extends true\n    ? readonly [config: ObjectFieldConfig<N, Properties, Policy>, ...properties: Properties]\n    :\n        | readonly [...properties: Properties]\n        | readonly [config: ObjectFieldConfig<N, Properties, Policy>, ...properties: Properties];\n\n/**\n * Config accepted by policy-scoped text field builders.\n *\n * @public\n */\nexport type TextFieldConfig<N extends string, Policy> = MetadataAwareFieldConfig<\n  Omit<TextField<N>, \"_type\" | \"_field\" | \"name\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped number field builders.\n *\n * @public\n */\nexport type NumberFieldConfig<N extends string, Policy> = MetadataAwareFieldConfig<\n  Omit<NumberField<N>, \"_type\" | \"_field\" | \"name\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped boolean field builders.\n *\n * @public\n */\nexport type BooleanFieldConfig<N extends string, Policy> = MetadataAwareFieldConfig<\n  Omit<BooleanField<N>, \"_type\" | \"_field\" | \"name\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped static enum field builders.\n *\n * @public\n */\nexport type StaticEnumFieldConfig<\n  N extends string,\n  O extends readonly EnumOptionValue[],\n  Policy,\n> = MetadataAwareFieldConfig<\n  Omit<StaticEnumField<N, O>, \"_type\" | \"_field\" | \"name\" | \"options\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped dynamic enum field builders.\n *\n * @public\n */\nexport type DynamicEnumFieldConfig<\n  N extends string,\n  Source extends string,\n  Policy,\n> = MetadataAwareFieldConfig<\n  Omit<DynamicEnumField<N, Source>, \"_type\" | \"_field\" | \"name\" | \"source\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped dynamic schema field builders.\n *\n * @public\n */\nexport type DynamicSchemaFieldConfig<N extends string, Policy> = MetadataAwareFieldConfig<\n  Omit<DynamicSchemaField<N>, \"_type\" | \"_field\" | \"name\" | \"schemaSource\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped array field builders.\n *\n * @public\n */\nexport type ArrayFieldConfig<\n  N extends string,\n  Items extends readonly FormElement[],\n  Policy,\n> = MetadataAwareFieldConfig<\n  Omit<ArrayField<N, Items>, \"_type\" | \"_field\" | \"name\" | \"items\">,\n  Policy\n>;\n\n/**\n * Config accepted by policy-scoped object field builders.\n *\n * @public\n */\nexport type ObjectFieldConfig<\n  N extends string,\n  Properties extends readonly FormElement[],\n  Policy,\n> = MetadataAwareFieldConfig<\n  Omit<ObjectField<N, Properties>, \"_type\" | \"_field\" | \"name\" | \"properties\">,\n  Policy\n>;\n\n/**\n * Namespace of field builder functions produced by the DSL.\n *\n * @public\n */\nexport interface FieldBuilderNamespace<Policy extends MetadataPolicyInput | undefined = undefined> {\n  /** Builds a text field. */\n  readonly text: <const N extends string>(\n    name: N,\n    ...args: MaybeRequiredConfigArg<TextFieldConfig<N, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, TextField<N>>;\n  /** Builds a number field. */\n  readonly number: <const N extends string>(\n    name: N,\n    ...args: MaybeRequiredConfigArg<NumberFieldConfig<N, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, NumberField<N>>;\n  /** Builds a boolean field. */\n  readonly boolean: <const N extends string>(\n    name: N,\n    ...args: MaybeRequiredConfigArg<BooleanFieldConfig<N, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, BooleanField<N>>;\n  /** Builds a static enum field. */\n  readonly enum: <const N extends string, const O extends readonly EnumOptionValue[]>(\n    name: N,\n    options: O,\n    ...args: MaybeRequiredConfigArg<StaticEnumFieldConfig<N, O, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, StaticEnumField<N, O>>;\n  /** Builds a dynamic enum field. */\n  readonly dynamicEnum: <const N extends string, const Source extends string>(\n    name: N,\n    source: Source,\n    ...args: MaybeRequiredConfigArg<DynamicEnumFieldConfig<N, Source, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, DynamicEnumField<N, Source>>;\n  /** Builds a dynamic schema field. */\n  readonly dynamicSchema: <const N extends string>(\n    name: N,\n    schemaSource: string,\n    ...args: MaybeRequiredConfigArg<DynamicSchemaFieldConfig<N, Policy>, Policy>\n  ) => FieldBuilderElement<Policy, DynamicSchemaField<N>>;\n  /** Builds an array field, optionally with config as the second argument. */\n  readonly array: <\n    const N extends string,\n    const Items extends readonly FieldBuilderInputElement<Policy>[],\n  >(\n    name: N,\n    ...args: ArrayBuilderArgs<N, Items, Policy>\n  ) => FieldBuilderElement<Policy, ArrayField<N, Items>>;\n  /** Builds an array field with an explicit config object. */\n  readonly arrayWithConfig: <\n    const N extends string,\n    const Items extends readonly FieldBuilderInputElement<Policy>[],\n  >(\n    name: N,\n    config: ArrayFieldConfig<N, Items, Policy>,\n    ...items: Items\n  ) => FieldBuilderElement<Policy, ArrayField<N, Items>>;\n  /** Builds an object field, optionally with config as the second argument. */\n  readonly object: <\n    const N extends string,\n    const Properties extends readonly FieldBuilderInputElement<Policy>[],\n  >(\n    name: N,\n    ...args: ObjectBuilderArgs<N, Properties, Policy>\n  ) => FieldBuilderElement<Policy, ObjectField<N, Properties>>;\n  /** Builds an object field with an explicit config object. */\n  readonly objectWithConfig: <\n    const N extends string,\n    const Properties extends readonly FieldBuilderInputElement<Policy>[],\n  >(\n    name: N,\n    config: ObjectFieldConfig<N, Properties, Policy>,\n    ...properties: Properties\n  ) => FieldBuilderElement<Policy, ObjectField<N, Properties>>;\n}\n\nfunction assertCompatibleDisplayNameAlias(\n  builderName: string,\n  config:\n    | { readonly label?: string | undefined; readonly displayName?: string | undefined }\n    | undefined\n): void {\n  if (config?.label !== undefined && config.displayName !== undefined) {\n    throw new Error(\n      `field.${builderName}(): pass either \"label\" or \"displayName\", not both. They are aliases for the same metadata.`\n    );\n  }\n}\n\nfunction isFieldConfigArgument(value: unknown): value is {\n  readonly label?: string;\n  readonly displayName?: string;\n  readonly apiName?: string;\n} {\n  return typeof value === \"object\" && value !== null && !(\"_type\" in value);\n}\n\nfunction compactConfig<T extends Record<string, unknown> | undefined>(\n  config: T\n): Partial<NonNullable<T>> {\n  if (config === undefined) {\n    return {};\n  }\n\n  const entries = Object.entries(config).filter(([, value]) => value !== undefined);\n  return Object.fromEntries(entries) as Partial<NonNullable<T>>;\n}\n\n/**\n * Field builder namespace containing functions to create each field type.\n *\n * @example\n * ```typescript\n * import { field } from \"@formspec/dsl\";\n *\n * field.text(\"name\", { label: \"Full Name\" });\n * field.number(\"age\", { min: 0, max: 150 });\n * field.enum(\"status\", [\"draft\", \"sent\", \"paid\"]);\n * field.dynamicEnum(\"country\", \"countries\", { label: \"Country\" });\n * ```\n *\n * @public\n */\nexport function createFieldBuilders<\n  const Policy extends MetadataPolicyInput | undefined = undefined,\n>(): FieldBuilderNamespace<Policy> {\n  return {\n    text: <const N extends string>(\n      name: N,\n      ...args: MaybeRequiredConfigArg<TextFieldConfig<N, Policy>, Policy>\n    ): FieldBuilderElement<Policy, TextField<N>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"text\", config);\n      return {\n        _type: \"field\",\n        _field: \"text\",\n        name,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, TextField<N>>;\n    },\n\n    number: <const N extends string>(\n      name: N,\n      ...args: MaybeRequiredConfigArg<NumberFieldConfig<N, Policy>, Policy>\n    ): FieldBuilderElement<Policy, NumberField<N>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"number\", config);\n      return {\n        _type: \"field\",\n        _field: \"number\",\n        name,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, NumberField<N>>;\n    },\n\n    boolean: <const N extends string>(\n      name: N,\n      ...args: MaybeRequiredConfigArg<BooleanFieldConfig<N, Policy>, Policy>\n    ): FieldBuilderElement<Policy, BooleanField<N>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"boolean\", config);\n      return {\n        _type: \"field\",\n        _field: \"boolean\",\n        name,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, BooleanField<N>>;\n    },\n\n    enum: <const N extends string, const O extends readonly EnumOptionValue[]>(\n      name: N,\n      options: O,\n      ...args: MaybeRequiredConfigArg<StaticEnumFieldConfig<N, O, Policy>, Policy>\n    ): FieldBuilderElement<Policy, StaticEnumField<N, O>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"enum\", config);\n\n      if (options.length > 0) {\n        const first = options[0];\n        const firstIsObject = typeof first === \"object\";\n\n        for (const opt of options) {\n          const optIsObject = typeof opt === \"object\";\n          if (optIsObject !== firstIsObject) {\n            throw new Error(\n              `field.enum(\"${name}\"): options must be all strings or all objects with {id, label}, not mixed. ` +\n                `Received mixed types in options array.`\n            );\n          }\n        }\n\n        if (firstIsObject) {\n          for (const opt of options) {\n            const obj = opt as { id?: unknown; label?: unknown };\n            if (typeof obj.id !== \"string\" || typeof obj.label !== \"string\") {\n              throw new Error(\n                `field.enum(\"${name}\"): object options must have string \"id\" and \"label\" properties. ` +\n                  `Received: ${JSON.stringify(opt)}`\n              );\n            }\n          }\n        }\n      }\n\n      return {\n        _type: \"field\",\n        _field: \"enum\",\n        name,\n        options,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, StaticEnumField<N, O>>;\n    },\n\n    dynamicEnum: <const N extends string, const Source extends string>(\n      name: N,\n      source: Source,\n      ...args: MaybeRequiredConfigArg<DynamicEnumFieldConfig<N, Source, Policy>, Policy>\n    ): FieldBuilderElement<Policy, DynamicEnumField<N, Source>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"dynamicEnum\", config);\n      return {\n        _type: \"field\",\n        _field: \"dynamic_enum\",\n        name,\n        source,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, DynamicEnumField<N, Source>>;\n    },\n\n    dynamicSchema: <const N extends string>(\n      name: N,\n      schemaSource: string,\n      ...args: MaybeRequiredConfigArg<DynamicSchemaFieldConfig<N, Policy>, Policy>\n    ): FieldBuilderElement<Policy, DynamicSchemaField<N>> => {\n      const [config] = args;\n      assertCompatibleDisplayNameAlias(\"dynamicSchema\", config);\n      return {\n        _type: \"field\",\n        _field: \"dynamic_schema\",\n        name,\n        schemaSource,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, DynamicSchemaField<N>>;\n    },\n\n    array: <\n      const N extends string,\n      const Items extends readonly FieldBuilderInputElement<Policy>[],\n    >(\n      name: N,\n      ...args: ArrayBuilderArgs<N, Items, Policy>\n    ): FieldBuilderElement<Policy, ArrayField<N, Items>> => {\n      const [firstArg, ...restArgs] = args;\n      const config = isFieldConfigArgument(firstArg)\n        ? (firstArg as unknown as ArrayFieldConfig<N, Items, Policy>)\n        : undefined;\n      const items = (config === undefined ? args : restArgs) as unknown as Items;\n      assertCompatibleDisplayNameAlias(\"array\", config);\n      return {\n        _type: \"field\",\n        _field: \"array\",\n        name,\n        items,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, ArrayField<N, Items>>;\n    },\n\n    arrayWithConfig: <\n      const N extends string,\n      const Items extends readonly FieldBuilderInputElement<Policy>[],\n    >(\n      name: N,\n      config: ArrayFieldConfig<N, Items, Policy>,\n      ...items: Items\n    ): FieldBuilderElement<Policy, ArrayField<N, Items>> => {\n      assertCompatibleDisplayNameAlias(\"arrayWithConfig\", config);\n      return {\n        _type: \"field\",\n        _field: \"array\",\n        name,\n        items,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, ArrayField<N, Items>>;\n    },\n\n    object: <\n      const N extends string,\n      const Properties extends readonly FieldBuilderInputElement<Policy>[],\n    >(\n      name: N,\n      ...args: ObjectBuilderArgs<N, Properties, Policy>\n    ): FieldBuilderElement<Policy, ObjectField<N, Properties>> => {\n      const [firstArg, ...restArgs] = args;\n      const config = isFieldConfigArgument(firstArg)\n        ? (firstArg as unknown as ObjectFieldConfig<N, Properties, Policy>)\n        : undefined;\n      const properties = (config === undefined ? args : restArgs) as unknown as Properties;\n      assertCompatibleDisplayNameAlias(\"object\", config);\n      return {\n        _type: \"field\",\n        _field: \"object\",\n        name,\n        properties,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, ObjectField<N, Properties>>;\n    },\n\n    objectWithConfig: <\n      const N extends string,\n      const Properties extends readonly FieldBuilderInputElement<Policy>[],\n    >(\n      name: N,\n      config: ObjectFieldConfig<N, Properties, Policy>,\n      ...properties: Properties\n    ): FieldBuilderElement<Policy, ObjectField<N, Properties>> => {\n      assertCompatibleDisplayNameAlias(\"objectWithConfig\", config);\n      return {\n        _type: \"field\",\n        _field: \"object\",\n        name,\n        properties,\n        ...compactConfig(config),\n      } as unknown as FieldBuilderElement<Policy, ObjectField<N, Properties>>;\n    },\n  };\n}\n\n/**\n * Field builder namespace containing functions to create each field type.\n *\n * @public\n */\nexport const field = createFieldBuilders();\n","import type {\n  Conditional,\n  FormElement,\n  FormSpec,\n  Group,\n  MetadataPolicyInput,\n  Predicate,\n} from \"@formspec/core\";\nimport { _attachFormSpecMetadataPolicy } from \"@formspec/core/internals\";\nimport {\n  createFieldBuilders,\n  type FieldBuilderElement,\n  type FieldBuilderNamespace,\n} from \"./field.js\";\nimport { formspec, formspecWithValidation, group, when } from \"./structure.js\";\nimport type { FormSpecOptions } from \"./structure.js\";\nimport { is } from \"./predicate.js\";\n\n/**\n * A configured DSL surface with policy-aware field builders and structure helpers.\n *\n * @public\n */\nexport interface FormSpecFactory<Policy extends MetadataPolicyInput | undefined = undefined> {\n  /** Field builders scoped to the factory metadata policy. */\n  readonly field: FieldBuilderNamespace<Policy>;\n  /** Creates a `FormSpec` carrying the factory metadata policy. */\n  readonly formspec: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n    ...elements: Elements\n  ) => FormSpec<Elements>;\n  /** Creates a validating `FormSpec` carrying the factory metadata policy. */\n  readonly formspecWithValidation: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n    options: FormSpecOptions,\n    ...elements: Elements\n  ) => FormSpec<Elements>;\n  /** Policy-scoped re-export of `group()`. */\n  readonly group: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n    label: string,\n    ...elements: Elements\n  ) => FieldBuilderElement<Policy, Group<Elements>>;\n  /** Policy-scoped re-export of `when()`. */\n  readonly when: <\n    const K extends string,\n    const V,\n    const Elements extends readonly FieldBuilderElement<Policy>[],\n  >(\n    predicate: Predicate<K, V>,\n    ...elements: Elements\n  ) => FieldBuilderElement<Policy, Conditional<K, V, Elements>>;\n  /** Re-export of `is()`. */\n  readonly is: typeof is;\n}\n\nfunction applyMetadataPolicy<const Elements extends readonly FormElement[]>(\n  form: FormSpec<Elements>,\n  metadataPolicy: MetadataPolicyInput | undefined\n): FormSpec<Elements> {\n  return _attachFormSpecMetadataPolicy(form, metadataPolicy);\n}\n\nfunction scopeElement<Policy, Element extends FormElement>(\n  element: Element\n): FieldBuilderElement<Policy, Element> {\n  return element as FieldBuilderElement<Policy, Element>;\n}\n\n/**\n * Creates a DSL factory whose field builders and generated forms share a metadata policy.\n *\n * @public\n */\nexport function createFormSpecFactory<\n  const Policy extends MetadataPolicyInput | undefined = undefined,\n>(options?: { readonly metadata?: Policy }): FormSpecFactory<Policy> {\n  const metadataPolicy = options?.metadata;\n\n  return {\n    field: createFieldBuilders<Policy>(),\n    formspec: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n      ...elements: Elements\n    ) => applyMetadataPolicy(formspec(...elements), metadataPolicy),\n    formspecWithValidation: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n      validationOptions: FormSpecOptions,\n      ...elements: Elements\n    ) =>\n      applyMetadataPolicy(formspecWithValidation(validationOptions, ...elements), metadataPolicy),\n    group: <const Elements extends readonly FieldBuilderElement<Policy>[]>(\n      label: string,\n      ...elements: Elements\n    ) => scopeElement<Policy, Group<Elements>>(group(label, ...elements)),\n    when: <\n      const K extends string,\n      const V,\n      const Elements extends readonly FieldBuilderElement<Policy>[],\n    >(\n      predicate: Predicate<K, V>,\n      ...elements: Elements\n    ) => scopeElement<Policy, Conditional<K, V, Elements>>(when(predicate, ...elements)),\n    is,\n  };\n}\n","/**\n * Runtime validation for form specifications.\n *\n * Validates:\n * - No duplicate field names at the same scope level\n * - All field references in conditionals point to existing fields\n */\n\nimport type { FormElement, Group, Conditional, ArrayField, ObjectField } from \"@formspec/core\";\n\n/**\n * Validation issue severity levels.\n *\n * @public\n */\nexport type ValidationSeverity = \"error\" | \"warning\";\n\n/**\n * A validation issue found in a form specification.\n *\n * @public\n */\nexport interface ValidationIssue {\n  /** Severity of the issue */\n  severity: ValidationSeverity;\n  /** Human-readable message describing the issue */\n  message: string;\n  /** Path to the element with the issue (e.g., \"group.fieldName\") */\n  path: string;\n}\n\n/**\n * Result of validating a form specification.\n *\n * @public\n */\nexport interface ValidationResult {\n  /** Whether the form is valid (no errors, warnings are ok) */\n  valid: boolean;\n  /** List of validation issues found */\n  issues: ValidationIssue[];\n}\n\n/**\n * Collects all field names from a list of form elements.\n * Returns a Map of field name to count (for duplicate detection).\n */\nfunction collectFieldNames(\n  elements: readonly FormElement[],\n  path = \"\"\n): Map<string, { count: number; paths: string[] }> {\n  const fieldNames = new Map<string, { count: number; paths: string[] }>();\n\n  function visit(elements: readonly FormElement[], currentPath: string): void {\n    for (const element of elements) {\n      switch (element._type) {\n        case \"field\": {\n          // After type narrowing, element is known to be AnyField\n          const field = element;\n          const fieldPath = currentPath ? `${currentPath}.${field.name}` : field.name;\n          const existing = fieldNames.get(field.name);\n          if (existing !== undefined) {\n            existing.count++;\n            existing.paths.push(fieldPath);\n          } else {\n            fieldNames.set(field.name, { count: 1, paths: [fieldPath] });\n          }\n\n          // Recurse into array items and object properties\n          if (field._field === \"array\") {\n            const arrayField = field as ArrayField<string, readonly FormElement[]>;\n            visit(arrayField.items, `${fieldPath}[]`);\n          } else if (field._field === \"object\") {\n            const objectField = field as ObjectField<string, readonly FormElement[]>;\n            visit(objectField.properties, fieldPath);\n          }\n          break;\n        }\n\n        case \"group\": {\n          const group = element as Group<readonly FormElement[]>;\n          const groupPath = currentPath ? `${currentPath}.[${group.label}]` : `[${group.label}]`;\n          visit(group.elements, groupPath);\n          break;\n        }\n\n        case \"conditional\": {\n          const conditional = element as Conditional<string, unknown, readonly FormElement[]>;\n          const conditionalPath = currentPath\n            ? `${currentPath}.when(${conditional.field})`\n            : `when(${conditional.field})`;\n          visit(conditional.elements, conditionalPath);\n          break;\n        }\n      }\n    }\n  }\n\n  visit(elements, path);\n  return fieldNames;\n}\n\n/**\n * Collects all field references from conditionals.\n * Returns a list of { fieldName, path } for each reference.\n */\nfunction collectConditionalReferences(\n  elements: readonly FormElement[],\n  path = \"\"\n): { fieldName: string; path: string }[] {\n  const references: { fieldName: string; path: string }[] = [];\n\n  function visit(elements: readonly FormElement[], currentPath: string): void {\n    for (const element of elements) {\n      switch (element._type) {\n        case \"field\": {\n          // After type narrowing, element is known to be AnyField\n          const field = element;\n          const fieldPath = currentPath ? `${currentPath}.${field.name}` : field.name;\n\n          // Recurse into array items and object properties\n          if (field._field === \"array\") {\n            const arrayField = field as ArrayField<string, readonly FormElement[]>;\n            visit(arrayField.items, `${fieldPath}[]`);\n          } else if (field._field === \"object\") {\n            const objectField = field as ObjectField<string, readonly FormElement[]>;\n            visit(objectField.properties, fieldPath);\n          }\n          break;\n        }\n\n        case \"group\": {\n          const group = element as Group<readonly FormElement[]>;\n          const groupPath = currentPath ? `${currentPath}.[${group.label}]` : `[${group.label}]`;\n          visit(group.elements, groupPath);\n          break;\n        }\n\n        case \"conditional\": {\n          const conditional = element as Conditional<string, unknown, readonly FormElement[]>;\n          const conditionalPath = currentPath\n            ? `${currentPath}.when(${conditional.field})`\n            : `when(${conditional.field})`;\n\n          // Record this reference\n          references.push({\n            fieldName: conditional.field,\n            path: conditionalPath,\n          });\n\n          // Continue visiting children\n          visit(conditional.elements, conditionalPath);\n          break;\n        }\n      }\n    }\n  }\n\n  visit(elements, path);\n  return references;\n}\n\n/**\n * Validates a form specification for common issues.\n *\n * Checks for:\n * - Duplicate field names at the root level (warning)\n * - References to non-existent fields in conditionals (error)\n *\n * @example\n * ```typescript\n * const form = formspec(\n *   field.text(\"name\"),\n *   field.text(\"name\"), // Duplicate!\n *   when(\"nonExistent\", \"value\", // Reference to non-existent field!\n *     field.text(\"extra\"),\n *   ),\n * );\n *\n * const result = validateForm(form.elements);\n * // result.valid === false\n * // result.issues contains duplicate and reference errors\n * ```\n *\n * @param elements - The form elements to validate\n * @returns Validation result with any issues found\n *\n * @public\n */\nexport function validateForm(elements: readonly FormElement[]): ValidationResult {\n  const issues: ValidationIssue[] = [];\n\n  // Collect all field names\n  const fieldNames = collectFieldNames(elements);\n\n  // Check for duplicates at root level - duplicates are errors because they cause data loss\n  for (const [name, info] of fieldNames) {\n    if (info.count > 1 && info.paths[0] !== undefined) {\n      issues.push({\n        severity: \"error\",\n        message: `Duplicate field name \"${name}\" found ${String(info.count)} times at: ${info.paths.join(\", \")}`,\n        path: info.paths[0],\n      });\n    }\n  }\n\n  // Collect conditional references\n  const references = collectConditionalReferences(elements);\n\n  // Check that all referenced fields exist\n  for (const ref of references) {\n    if (!fieldNames.has(ref.fieldName)) {\n      issues.push({\n        severity: \"error\",\n        message: `Conditional references non-existent field \"${ref.fieldName}\"`,\n        path: ref.path,\n      });\n    }\n  }\n\n  return {\n    valid: issues.every((issue) => issue.severity !== \"error\"),\n    issues,\n  };\n}\n\n/**\n * Logs validation issues to the console.\n *\n * @param result - The validation result to log\n * @param formName - Optional name for the form (for better error messages)\n *\n * @public\n */\nexport function logValidationIssues(result: ValidationResult, formName?: string): void {\n  if (result.issues.length === 0) {\n    return;\n  }\n\n  const prefix = formName ? `FormSpec \"${formName}\"` : \"FormSpec\";\n\n  for (const issue of result.issues) {\n    const location = issue.path ? ` at ${issue.path}` : \"\";\n    const message = `${prefix}: ${issue.message}${location}`;\n\n    if (issue.severity === \"error\") {\n      console.error(message);\n    } else {\n      console.warn(message);\n    }\n  }\n}\n","/**\n * Structure builder functions for organizing form elements.\n *\n * These functions create layout and conditional structures:\n * - `group()` - Visual grouping of fields\n * - `when()` - Conditional visibility based on field values\n * - `formspec()` - Top-level form specification\n */\n\nimport type { FormElement, Group, Conditional, FormSpec, Predicate } from \"@formspec/core\";\nimport { validateForm, logValidationIssues } from \"./validation.js\";\n\n/**\n * Options for creating a form specification.\n *\n * @public\n */\nexport interface FormSpecOptions {\n  /**\n   * Whether to validate the form structure.\n   * - `true` or `\"warn\"`: Validate and log warnings/errors to console\n   * - `\"throw\"`: Validate and throw an error if validation fails\n   * - `false`: Skip validation (default in production for performance)\n   *\n   * @defaultValue false\n   */\n  validate?: boolean | \"warn\" | \"throw\";\n\n  /**\n   * Optional name for the form (used in validation messages).\n   */\n  name?: string;\n}\n\n/**\n * Creates a visual group of form elements.\n *\n * Groups provide visual organization and can be rendered as fieldsets or sections.\n * The nesting of groups defines the visual hierarchy of the form.\n *\n * @example\n * ```typescript\n * group(\"Customer Information\",\n *   field.text(\"name\", { label: \"Name\" }),\n *   field.text(\"email\", { label: \"Email\" }),\n * )\n * ```\n *\n * @param label - The group's display label\n * @param elements - The form elements contained in this group\n * @returns A Group descriptor\n *\n * @public\n */\nexport function group<const Elements extends readonly FormElement[]>(\n  label: string,\n  ...elements: Elements\n): Group<Elements> {\n  return { _type: \"group\", label, elements };\n}\n\n/**\n * Creates a conditional wrapper that shows elements based on a predicate.\n *\n * When the predicate evaluates to true, the contained elements are shown.\n * Otherwise, they are hidden (but still part of the schema).\n *\n * @example\n * ```typescript\n * import { is } from \"@formspec/dsl\";\n *\n * field.enum(\"status\", [\"draft\", \"sent\", \"paid\"] as const),\n * when(is(\"status\", \"draft\"),\n *   field.text(\"internalNotes\", { label: \"Internal Notes\" }),\n * )\n * ```\n *\n * @param predicate - The condition to evaluate (use `is()` to create)\n * @param elements - The form elements to show when condition is met\n * @returns A Conditional descriptor\n *\n * @public\n */\nexport function when<\n  const K extends string,\n  const V,\n  const Elements extends readonly FormElement[],\n>(predicate: Predicate<K, V>, ...elements: Elements): Conditional<K, V, Elements> {\n  return {\n    _type: \"conditional\",\n    field: predicate.field,\n    value: predicate.value,\n    elements,\n  };\n}\n\n/**\n * Creates a complete form specification.\n *\n * The structure IS the definition:\n * - Nesting with `group()` defines visual layout\n * - Nesting with `when()` defines conditional visibility\n * - Field type implies control type (text field → text input)\n * - Array position implies field ordering\n *\n * Schema is automatically inferred from all fields in the structure.\n *\n * @example\n * ```typescript\n * const InvoiceForm = formspec(\n *   group(\"Customer\",\n *     field.text(\"customerName\", { label: \"Customer Name\" }),\n *     field.dynamicEnum(\"country\", \"fetch_countries\", { label: \"Country\" }),\n *   ),\n *   group(\"Invoice Details\",\n *     field.number(\"amount\", { label: \"Amount\", min: 0 }),\n *     field.enum(\"status\", [\"draft\", \"sent\", \"paid\"] as const),\n *     when(is(\"status\", \"draft\"),\n *       field.text(\"internalNotes\", { label: \"Internal Notes\" }),\n *     ),\n *   ),\n * );\n * ```\n *\n * @param elements - The top-level form elements\n * @returns A FormSpec descriptor\n *\n * @public\n */\nexport function formspec<const Elements extends readonly FormElement[]>(\n  ...elements: Elements\n): FormSpec<Elements> {\n  return { elements };\n}\n\n/**\n * Creates a complete form specification with validation options.\n *\n * @example\n * ```typescript\n * const form = formspecWithValidation(\n *   { validate: true, name: \"MyForm\" },\n *   field.text(\"name\"),\n *   field.enum(\"status\", [\"draft\", \"sent\"] as const),\n *   when(is(\"status\", \"draft\"),\n *     field.text(\"notes\"),\n *   ),\n * );\n * ```\n *\n * @param options - Validation options\n * @param elements - The top-level form elements\n * @returns A FormSpec descriptor\n *\n * @public\n */\nexport function formspecWithValidation<const Elements extends readonly FormElement[]>(\n  options: FormSpecOptions,\n  ...elements: Elements\n): FormSpec<Elements> {\n  // Run validation if requested\n  if (options.validate) {\n    const result = validateForm(elements);\n\n    if (options.validate === \"throw\" && !result.valid) {\n      const errors = result.issues\n        .filter((i) => i.severity === \"error\")\n        .map((i) => i.message)\n        .join(\"; \");\n      throw new Error(`Form validation failed: ${errors}`);\n    }\n\n    if (options.validate === true || options.validate === \"warn\") {\n      logValidationIssues(result, options.name);\n    }\n  }\n\n  return { elements };\n}\n","/**\n * Predicate builder functions for conditional logic.\n *\n * These functions create predicates for use with `when()`:\n * - `is()` - Check if a field equals a specific value\n *\n * @example\n * ```typescript\n * when(is(\"status\", \"draft\"),\n *   field.text(\"notes\"),\n * )\n * ```\n */\n\nimport type { EqualsPredicate } from \"@formspec/core\";\n\n/**\n * Creates an equality predicate that checks if a field equals a specific value.\n *\n * Use this with `when()` to create readable conditional expressions:\n *\n * @example\n * ```typescript\n * // Show cardNumber field when paymentMethod is \"card\"\n * when(is(\"paymentMethod\", \"card\"),\n *   field.text(\"cardNumber\", { label: \"Card Number\" }),\n * )\n * ```\n *\n * @typeParam K - The field name (inferred as string literal)\n * @typeParam V - The value type (inferred as literal)\n * @param field - The name of the field to check\n * @param value - The value the field must equal\n * @returns An EqualsPredicate for use with `when()`\n * @public\n */\nexport function is<const K extends string, const V>(field: K, value: V): EqualsPredicate<K, V> {\n  return {\n    _predicate: \"equals\",\n    field,\n    value,\n  };\n}\n"],"mappings":"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","names":["elements","field","group","field"]}