import type { WorkspaceInventoryAppendOptionKey, WorkspaceInventoryEntriesKey, WorkspaceInventorySectionFlagKey } from './workspace-inventory-types.js'; import type { ScaffoldCompatibilityConfig } from '../templates/scaffold-compatibility.js'; /** * Literal value shape accepted by descriptor-driven inventory entry fields. */ export type InventoryEntryFieldValue = string | string[] | boolean | ScaffoldCompatibilityConfig | undefined; /** * Context passed to custom field validators while parsing one inventory entry. */ export type InventoryEntryFieldValidationContext = { elementIndex: number; entryName: string; key: string; }; type InventoryEntryFieldDescriptor = { key: string; kind?: 'boolean' | 'compatibilityConfig' | 'string' | 'stringArray'; required?: boolean; validate?: (value: InventoryEntryFieldValue, context: InventoryEntryFieldValidationContext) => void; }; /** * Runtime parser contract for one exported inventory array. * * `entryName` is used in diagnostics and `fields` defines the literal values, * required flags, and custom validators accepted for each object entry. */ export type InventoryEntryParserDescriptor = { entryName: string; fields: readonly InventoryEntryFieldDescriptor[]; }; type RequiredInventoryEntryKey = Extract<{ [Key in keyof T]-?: undefined extends T[Key] ? never : Key; }[keyof T], string>; type TypedInventoryEntryFieldDescriptor = Extract> = TKey extends Extract ? Omit & { key: TKey; } & (TKey extends RequiredInventoryEntryKey ? { required: true; } : { required?: boolean; }) : never; type RequiredInventoryEntryFieldDescriptor = Omit & { key: RequiredInventoryEntryKey; required: true; }; type MissingRequiredInventoryEntryKeys[]> = Exclude, TFields[number]['key']>; type RequiredInventoryEntryFieldsPresent[]> = MissingRequiredInventoryEntryKeys extends never ? unknown : { missingRequiredInventoryEntryFields: MissingRequiredInventoryEntryKeys; }; type RequiredInventoryEntryFieldsMarkedRequired[]> = Extract; }> extends RequiredInventoryEntryFieldDescriptor ? unknown : { requiredInventoryEntryFieldsMustSetRequiredTrue: RequiredInventoryEntryKey; }; /** * Shared descriptor contract for generated workspace inventory sections. * * Callers rely on `append` markers when inserting generated entries, `parse` * metadata when reading exported arrays, and `interface`/`value` sections when * repairing older `scripts/block-config.ts` files. */ export type InventorySectionDescriptor = { /** Optional marker metadata used when appending generated entries. */ append?: { marker: string; optionKey: WorkspaceInventoryAppendOptionKey; }; /** Optional exported interface that backs the inventory section entries. */ interface?: { name: string; section: string; }; /** Optional parser metadata for descriptor-driven inventory reads. */ parse?: { entriesKey: WorkspaceInventoryEntriesKey; entry: InventoryEntryParserDescriptor; exportName?: string; hasSectionKey?: WorkspaceInventorySectionFlagKey; required?: boolean; }; /** Optional exported const array that stores the inventory section entries. */ value?: { name: string; section: string; }; }; /** * Define a typed inventory entry parser while enforcing required fields at * compile time. * * The returned descriptor is consumed by `parseInventorySection` to extract * literal field values and run runtime validators. */ export declare function defineInventoryEntryParser(): []>(descriptor: { entryName: string; fields: TFields; } & RequiredInventoryEntryFieldsPresent & RequiredInventoryEntryFieldsMarkedRequired) => InventoryEntryParserDescriptor; /** * Assert that a parsed inventory entry contains every required descriptor * field. * * Missing `undefined` values and empty strings throw with diagnostics tied to * the original exported inventory array name and element index. */ export declare function assertParsedInventoryEntry(entry: Record, descriptor: InventoryEntryParserDescriptor, elementIndex: number): asserts entry is Record & T; export {};