@judo/codegen 0.1.0 → 0.2.0
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-reader-DZ5wLHJt.js","names":["SECTION_TYPE_FILTERS: [string, Set<string>][]","unique: ExtractedElement[]","filtered: ExtractedElement[]","keys: string[]","result: AnnotationComponentGroup[]","lines: string[]","sectionPages: string[]","elementKeyLiterals: string[]","tsType: string","temporalFields: Array<{ name: string; type: string }>","entries: Record<string, string>","systemMessages: Record<string, string>","defaultOptions","METADATA_SYMBOL","xmlNode","result","appElements: XmlElement[]","model: ExtractedModel","actions: ExtractedAction[]","elements: ExtractedElement[]","components: ExtractedComponent[]","extracted: ExtractedDataType","attributes: ExtractedTransferAttribute[]","relations: ExtractedTransferRelation[]","typeMap: Record<string, string>","names: string[]"],"sources":["../src/name-utils.ts","../src/generator.ts","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/util.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/validator.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js","../../../node_modules/.pnpm/strnum@2.2.0/node_modules/strnum/strnum.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/ignoreAttributes.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/node2json.js","../../../node_modules/.pnpm/fast-xml-parser@5.4.1/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js","../src/model-reader.ts"],"sourcesContent":["/**\n * Name utilities for converting model names to TypeScript identifiers.\n */\n\n/**\n * Convert a model page name to a TypeScript-safe identifier.\n *\n * Model page names use \"::\" separators, e.g.:\n * - \"Customer::customerOrders::AccessTablePage\"\n * - \"AddressDTO::Form::group::country::LinkSetSelectorPage\"\n * - \"Home::Order::ActionGroup::createNewOrder::Input::Form\"\n *\n * We take the last meaningful segment and PascalCase it, deduplicating if needed.\n */\nexport function toPageIdentifier(pageName: string): string {\n\t// Remove special characters and convert :: to segments\n\tconst segments = pageName\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\n\t// Use all segments joined in PascalCase\n\tconst result = segments.map((s) => toPascalCase(s)).join(\"\");\n\treturn sanitizeIdentifier(result);\n}\n\n/**\n * Convert a model action name to a TypeScript-safe camelCase identifier.\n *\n * Action names like \"Customer::customerOrders::Back\" → \"back\"\n * or \"OrderDTO::OrderView::itemsGroup::items::TabularReferenceTableBulkDeleteAction\" → \"itemsBulkDelete\"\n */\nexport function toActionIdentifier(actionName: string): string {\n\tconst segments = actionName\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\tconst lastSegment = segments[segments.length - 1] ?? actionName;\n\n\t// Clean up common suffixes from generated action names\n\tlet clean = lastSegment\n\t\t.replace(/TabularReferenceTable/g, \"\")\n\t\t.replace(/TabularReferenceFieldLink/g, \"\")\n\t\t.replace(/Action$/g, \"\")\n\t\t.replace(/ActionDefinition$/g, \"\");\n\n\t// For Operation-prefixed action types, include the parent segment (operation name).\n\t// This ensures each operation gets a unique, meaningful identifier instead of generic\n\t// names like \"operationFormCall\" that collide across multiple operations on the same page.\n\t// e.g. \"createDarkMatter::OperationFormCallAction\" → \"createDarkMatterCall\"\n\tif (clean.startsWith(\"Operation\")) {\n\t\tconst parentSegment = segments.length >= 2 ? segments[segments.length - 2] : \"\";\n\t\tif (parentSegment) {\n\t\t\tconst suffix = clean\n\t\t\t\t.replace(/^Operation/, \"\")\n\t\t\t\t.replace(/^Form/, \"\")\n\t\t\t\t.replace(/^Unmapped/, \"\");\n\t\t\tclean = suffix ? `${parentSegment}_${suffix}` : parentSegment;\n\t\t}\n\t}\n\n\t// If the clean name is empty or too generic, include the parent segment\n\tif (!clean || clean === \"Table\" || clean === \"Form\" || clean === \"View\") {\n\t\tconst parentSegment = segments.length >= 2 ? segments[segments.length - 2] : \"\";\n\t\tif (parentSegment) {\n\t\t\tclean = `${parentSegment}_${lastSegment}`;\n\t\t}\n\t}\n\n\treturn sanitizeIdentifier(toCamelCase(clean));\n}\n\n/**\n * Convert a model element name to a TypeScript-safe camelCase identifier.\n */\nexport function toElementIdentifier(elementName: string): string {\n\treturn sanitizeIdentifier(toCamelCase(elementName));\n}\n\n/**\n * Convert a model navigation item name to a clean PascalCase identifier\n * suitable for use as a translation key segment.\n *\n * Navigation item names like \"God::God::galaxies::NavigationItem\" → \"Galaxies\"\n * or \"Admin::orders::NavigationItem\" → \"Orders\"\n */\nexport function toNavItemIdentifier(navItemName: string): string {\n\tconst segments = navItemName\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\n\t// Find the meaningful segment — the one before \"NavigationItem\" suffix, or last\n\tconst idx = segments.findIndex((s) => s === \"NavigationItem\");\n\tconst meaningful = idx > 0 ? segments[idx - 1] : (segments[segments.length - 1] ?? navItemName);\n\n\treturn toPascalCase(meaningful);\n}\n\n/**\n * Convert a model component name to a TypeScript-safe PascalCase identifier.\n */\nexport function toComponentIdentifier(componentName: string): string {\n\treturn sanitizeIdentifier(toPascalCase(componentName));\n}\n\n/**\n * Convert a model transfer type or data type name to a TypeScript-safe PascalCase identifier.\n *\n * Transfer/data type names may contain \"::\" namespace separators:\n * - \"View::Galaxy\" → \"ViewGalaxy\"\n * - \"ReadOnlyTest::SpaceShipTransfer\" → \"ReadOnlyTestSpaceShipTransfer\"\n * - \"Galaxy\" → \"Galaxy\" (no namespace)\n */\nexport function toTransferIdentifier(name: string): string {\n\tconst segments = name\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\treturn sanitizeIdentifier(segments.map((s) => toPascalCase(s)).join(\"\"));\n}\n\n/**\n * Create a safe key for use in Record types (for generated source-id maps).\n * Uses the page name directly but sanitized.\n */\nexport function toSafeKey(name: string): string {\n\treturn name.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\n/**\n * Convert string to PascalCase.\n */\nexport function toPascalCase(str: string): string {\n\treturn str.replace(/[_\\-\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^./, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to camelCase.\n */\nexport function toCamelCase(str: string): string {\n\tconst pascal = toPascalCase(str);\n\treturn pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Ensure the identifier is a valid TypeScript identifier.\n */\nfunction sanitizeIdentifier(str: string): string {\n\t// Remove leading digits\n\tlet result = str.replace(/^[0-9]+/, \"\");\n\t// Replace non-alphanumeric chars\n\tresult = result.replace(/[^a-zA-Z0-9_$]/g, \"\");\n\t// If empty after sanitization, use a fallback\n\tif (!result) result = \"_unnamed\";\n\treturn result;\n}\n\n/**\n * Deduplicate names in a list by appending numeric suffixes.\n */\nexport function deduplicateNames(names: string[]): Map<string, string> {\n\tconst result = new Map<string, string>();\n\tconst counts = new Map<string, number>();\n\n\tfor (const original of names) {\n\t\tconst count = counts.get(original) ?? 0;\n\t\tif (count === 0) {\n\t\t\tresult.set(original, original);\n\t\t} else {\n\t\t\tresult.set(`${original}_${count}`, `${original}${count}`);\n\t\t}\n\t\tcounts.set(original, count + 1);\n\t}\n\n\treturn result;\n}\n","/**\n * Code generator — produces TypeScript source files from an extracted model.\n *\n * Generated output structure:\n * generated/\n * ├── index.ts # Re-exports everything\n * ├── customizations.ts # createCustomizations() factory\n * ├── _source-id-map.ts # INTERNAL name→sourceId mapping\n * ├── pages/\n * │ ├── index.ts\n * │ └── <PageName>.ts # Per-page action + element types\n * ├── components/\n * │ ├── index.ts\n * │ └── <ComponentName>.ts # Per-component typed props\n * ├── transfers/\n * │ ├── index.ts # Barrel re-export of all transfer types + enums\n * │ ├── _enums.ts # Domain enum string literal unions\n * │ └── <TransferName>.ts # Per-transfer interface (strict DTO typing)\n * └── stubs/ # Optional starter implementations\n * ├── pages/\n * │ └── use<PageName>Actions.ts\n * └── components/\n * └── <ComponentName>.tsx\n */\n\nimport type {\n\tExtractedAction,\n\tExtractedComponent,\n\tExtractedDataType,\n\tExtractedElement,\n\tExtractedModel,\n\tExtractedPage,\n\tExtractedTransferType,\n} from \"./model-reader\";\nimport {\n\ttoActionIdentifier,\n\ttoComponentIdentifier,\n\ttoNavItemIdentifier,\n\ttoPascalCase,\n\ttoTransferIdentifier,\n} from \"./name-utils\";\n\n// ============================================\n// ELEMENT TYPE CATEGORIES\n// ============================================\n\n/** Element types eligible for typeahead providers */\nconst TYPEAHEAD_ELEMENT_TYPES = new Set([\"TextInput\"]);\n/** Element types eligible for table row highlighting */\nconst TABLE_ELEMENT_TYPES = new Set([\"Table\"]);\n/** Element types eligible for enum option filtering */\nconst ENUM_ELEMENT_TYPES = new Set([\"EnumerationCombo\", \"EnumerationRadio\", \"EnumerationToggleButtonbar\"]);\n/** Element types eligible for date validation props */\nconst DATE_ELEMENT_TYPES = new Set([\"DateInput\", \"DateTimeInput\"]);\n/** Element types eligible for column customizers */\nconst COLUMN_ELEMENT_TYPES = new Set([\"Column\"]);\n\n/**\n * Maps section names (as used in TypedCustomizationsInput) to their element type filter sets.\n * Used to generate per-section source ID maps that enable section-local disambiguation.\n */\nconst SECTION_TYPE_FILTERS: [string, Set<string>][] = [\n\t[\"typeaheadProviders\", TYPEAHEAD_ELEMENT_TYPES],\n\t[\"tableRowHighlighting\", TABLE_ELEMENT_TYPES],\n\t[\"enumOptionFilter\", ENUM_ELEMENT_TYPES],\n\t[\"dateValidationProps\", DATE_ELEMENT_TYPES],\n\t[\"columnCustomizers\", COLUMN_ELEMENT_TYPES],\n\t[\"itemContainerConfigs\", TABLE_ELEMENT_TYPES],\n];\n\n/**\n * Computes human-readable short keys for elements within a page.\n * Uses just the element name when unique across the page, falling back to\n * progressively longer path suffixes for disambiguation.\n *\n * Examples:\n * - unique name: `\"galaxiesTable\"` (from path `\"View.galaxiesTable\"`)\n * - collision: `\"orders.price\"` vs `\"items.price\"` (from `\"View.orders.price\"` vs `\"View.items.price\"`)\n */\nfunction computeElementShortKeys(elements: ExtractedElement[]): Map<string, string> {\n\tconst result = new Map<string, string>();\n\tconst unique: ExtractedElement[] = [];\n\tconst seenPaths = new Set<string>();\n\tfor (const el of elements) {\n\t\tif (!seenPaths.has(el.path)) {\n\t\t\tseenPaths.add(el.path);\n\t\t\tunique.push(el);\n\t\t}\n\t}\n\tconst byName = new Map<string, ExtractedElement[]>();\n\tfor (const el of unique) {\n\t\tconst group = byName.get(el.name) ?? [];\n\t\tgroup.push(el);\n\t\tbyName.set(el.name, group);\n\t}\n\tfor (const [, group] of byName) {\n\t\tif (group.length === 1) {\n\t\t\tresult.set(group[0].path, group[0].name);\n\t\t} else {\n\t\t\tfor (const el of group) {\n\t\t\t\tconst segments = el.path.split(\".\");\n\t\t\t\tlet resolved = false;\n\t\t\t\tfor (let suffixLen = 2; suffixLen <= segments.length; suffixLen++) {\n\t\t\t\t\tconst candidate = segments.slice(-suffixLen).join(\".\");\n\t\t\t\t\tconst isUnique = group.every(\n\t\t\t\t\t\t(other) => other.path === el.path || other.path.split(\".\").slice(-suffixLen).join(\".\") !== candidate\n\t\t\t\t\t);\n\t\t\t\t\tif (isUnique) {\n\t\t\t\t\t\tresult.set(el.path, candidate);\n\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresult.set(el.path, el.path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Result of filtering elements by type — includes section-local short keys\n * and their sourceId mappings for runtime resolution.\n */\ninterface FilteredElementKeys {\n\t/** Ordered list of unique short keys for this section */\n\tkeys: string[];\n\t/** Map of short key → sourceId for runtime resolution */\n\tsourceMap: Map<string, string>;\n}\n\n/**\n * Filters page elements by type set, computing section-local short keys.\n * Disambiguation is performed only among the filtered subset, so elements\n * of different types sharing a name don't cause unnecessary path prefixes.\n */\nfunction filterElementKeys(elements: ExtractedElement[], typeSet: Set<string>): FilteredElementKeys {\n\t// Filter to matching element types, deduplicate by path\n\tconst seen = new Set<string>();\n\tconst filtered: ExtractedElement[] = [];\n\tfor (const el of elements) {\n\t\tif (typeSet.has(el.elementType) && !seen.has(el.path)) {\n\t\t\tseen.add(el.path);\n\t\t\tfiltered.push(el);\n\t\t}\n\t}\n\n\t// Compute short keys from the filtered subset only\n\tconst shortKeys = computeElementShortKeys(filtered);\n\n\tconst keys: string[] = [];\n\tconst sourceMap = new Map<string, string>();\n\tfor (const el of filtered) {\n\t\tconst key = shortKeys.get(el.path) ?? el.name;\n\t\tif (!sourceMap.has(key)) {\n\t\t\tkeys.push(key);\n\t\t\tsourceMap.set(key, el.sourceId);\n\t\t}\n\t}\n\treturn { keys, sourceMap };\n}\n\n// ============================================\n// PUBLIC API\n// ============================================\n\nexport interface GenerateOptions {\n\t/** Extracted model data */\n\tmodel: ExtractedModel;\n\t/** Whether to generate stub implementations */\n\tscaffoldStubs?: boolean;\n\t/** Only include pages from this application (actor) name. Omit to include all. */\n\tapplicationFilter?: string;\n\t/**\n\t * Prefix used to identify annotations that wire custom components.\n\t * Annotations matching this prefix are stripped to produce the component implementation name.\n\t * E.g., with prefix \"use\", annotation \"useFancyText\" → component name \"FancyText\".\n\t * @default \"use\"\n\t */\n\tcustomComponentAnnotationPrefix?: string;\n}\n\nexport interface GenerateResult {\n\t/** Map of relative file path → file content */\n\tfiles: Map<string, string>;\n}\n\n/**\n * An annotation-based component group: a single annotation name maps to\n * all element sourceIds that carry that annotation (with the prefix stripped).\n */\ninterface AnnotationComponentGroup {\n\t/** Stripped annotation name (e.g., \"FancyText\" from \"useFancyText\") */\n\tname: string;\n\t/** All element sourceIds that carry this annotation */\n\tsourceIds: string[];\n}\n\n/**\n * Build annotation component groups from components that have annotations matching the prefix.\n * Groups components by their stripped annotation name.\n */\nfunction buildAnnotationComponentGroups(components: ExtractedComponent[], prefix: string): AnnotationComponentGroup[] {\n\tconst groups = new Map<string, string[]>();\n\n\tfor (const comp of components) {\n\t\tif (!comp.annotations) continue;\n\t\tfor (const ann of comp.annotations) {\n\t\t\tif (ann.startsWith(prefix) && ann.length > prefix.length) {\n\t\t\t\tconst stripped = ann.slice(prefix.length);\n\t\t\t\tlet sourceIds = groups.get(stripped);\n\t\t\t\tif (!sourceIds) {\n\t\t\t\t\tsourceIds = [];\n\t\t\t\t\tgroups.set(stripped, sourceIds);\n\t\t\t\t}\n\t\t\t\tsourceIds.push(comp.sourceId);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: AnnotationComponentGroup[] = [];\n\tfor (const [name, sourceIds] of groups) {\n\t\tresult.push({ name, sourceIds });\n\t}\n\treturn result.toSorted((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Generate TypeScript source files from an extracted model.\n */\nexport function generate(options: GenerateOptions): GenerateResult {\n\tconst { model, scaffoldStubs = false, applicationFilter, customComponentAnnotationPrefix = \"use\" } = options;\n\tconst files = new Map<string, string>();\n\n\t// Filter pages by application if specified\n\tconst pages = applicationFilter ? model.pages.filter((p) => p.applicationName === applicationFilter) : model.pages;\n\n\t// Filter components (from filtered pages)\n\tconst pageNames = new Set(pages.map((p) => p.name));\n\tconst components = model.components.filter((c) => !c.pageName || pageNames.has(c.pageName));\n\n\t// Build annotation component groups from components with matching annotations\n\tconst annotationGroups = buildAnnotationComponentGroups(components, customComponentAnnotationPrefix);\n\n\t// Build page identifier map (deduplicate names across pages)\n\tconst pageIdentifiers = buildPageIdentifiers(pages);\n\tconst componentIdentifiers = buildComponentIdentifiers(components);\n\n\t// Generate source-id-map\n\tfiles.set(\n\t\t\"_source-id-map.ts\",\n\t\tgenerateSourceIdMap(pages, components, pageIdentifiers, componentIdentifiers, annotationGroups)\n\t);\n\n\t// Generate per-page types\n\tfor (const page of pages) {\n\t\tconst identifier = pageIdentifiers.get(page.sourceId)!;\n\t\tfiles.set(`pages/${identifier}.ts`, generatePageTypes(page, identifier));\n\t}\n\tfiles.set(\"pages/index.ts\", generatePagesIndex(pages, pageIdentifiers));\n\n\t// Generate per-component types\n\tfor (const component of components) {\n\t\tconst identifier = componentIdentifiers.get(component.sourceId)!;\n\t\tfiles.set(`components/${identifier}.ts`, generateComponentTypes(component, identifier));\n\t}\n\tfiles.set(\"components/index.ts\", generateComponentsIndex(components, componentIdentifiers));\n\n\t// Generate transfer type interfaces\n\tconst transferTypes = model.transferTypes ?? [];\n\tconst dataTypes = model.dataTypes ?? [];\n\tif (transferTypes.length > 0) {\n\t\tconst transferFiles = generateTransferFiles(transferTypes, dataTypes);\n\t\tfor (const [path, content] of transferFiles) {\n\t\t\tfiles.set(path, content);\n\t\t}\n\t}\n\n\t// Generate customizations factory\n\tconst subThemeNames = model.subThemeNames ?? [];\n\tfiles.set(\n\t\t\"customizations.ts\",\n\t\tgenerateCustomizationsFactory(\n\t\t\tpages,\n\t\t\tcomponents,\n\t\t\tpageIdentifiers,\n\t\t\tcomponentIdentifiers,\n\t\t\tsubThemeNames,\n\t\t\tannotationGroups\n\t\t)\n\t);\n\n\t// Generate barrel index\n\tfiles.set(\"index.ts\", generateIndex(transferTypes.length > 0));\n\n\t// Generate stubs if requested\n\tif (scaffoldStubs) {\n\t\tfor (const page of pages) {\n\t\t\tconst identifier = pageIdentifiers.get(page.sourceId)!;\n\t\t\tfiles.set(`stubs/pages/use${identifier}Actions.ts`, generatePageStub(page, identifier));\n\t\t}\n\t\tfor (const component of components) {\n\t\t\tconst identifier = componentIdentifiers.get(component.sourceId)!;\n\t\t\tfiles.set(`stubs/components/${identifier}.tsx`, generateComponentStub(component, identifier));\n\t\t}\n\t}\n\n\t// Generate baseline translation JSON\n\tconst navItems = model.navigationItems ?? [];\n\tfiles.set(\"locales/en-US.json\", generateTranslationBaseline(pages, navItems, pageIdentifiers));\n\n\t// Generate translation key map (sourceId → human-readable path)\n\tfiles.set(\"_translation-key-map.ts\", generateTranslationKeyMap(pages, navItems, pageIdentifiers));\n\n\treturn { files };\n}\n\n// ============================================\n// IDENTIFIER BUILDERS\n// ============================================\n\nfunction buildPageIdentifiers(pages: ExtractedPage[]): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tconst usedNames = new Map<string, number>();\n\n\tfor (const page of pages) {\n\t\tlet base = derivePageIdentifier(page.name);\n\t\tconst count = usedNames.get(base) ?? 0;\n\t\tusedNames.set(base, count + 1);\n\t\tif (count > 0) {\n\t\t\tbase = `${base}${count}`;\n\t\t}\n\t\tmap.set(page.sourceId, base);\n\t}\n\n\treturn map;\n}\n\nfunction derivePageIdentifier(pageName: string): string {\n\tconst segments = pageName\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\treturn segments.map((s) => toPascalCase(s)).join(\"\");\n}\n\nfunction buildComponentIdentifiers(components: ExtractedComponent[]): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tconst usedNames = new Map<string, number>();\n\n\tfor (const component of components) {\n\t\tlet base = toComponentIdentifier(component.name);\n\t\tconst count = usedNames.get(base) ?? 0;\n\t\tusedNames.set(base, count + 1);\n\t\tif (count > 0) {\n\t\t\tbase = `${base}${count}`;\n\t\t}\n\t\tmap.set(component.sourceId, base);\n\t}\n\n\treturn map;\n}\n\n// ============================================\n// FILE GENERATORS\n// ============================================\n\nfunction generateSourceIdMap(\n\tpages: ExtractedPage[],\n\tcomponents: ExtractedComponent[],\n\tpageIdentifiers: Map<string, string>,\n\tcomponentIdentifiers: Map<string, string>,\n\tannotationGroups: AnnotationComponentGroup[]\n): string {\n\tconst lines: string[] = [\n\t\t\"// AUTO-GENERATED — DO NOT EDIT\",\n\t\t\"// This file is internal to the generated code. Do not import directly.\",\n\t\t\"\",\n\t\t\"/** @internal */\",\n\t\t\"export const PAGE_SOURCE_IDS: Record<string, string> = {\",\n\t];\n\n\tfor (const page of pages) {\n\t\tconst id = pageIdentifiers.get(page.sourceId)!;\n\t\tlines.push(` ${JSON.stringify(id)}: ${JSON.stringify(page.sourceId)},`);\n\t}\n\tlines.push(\"};\", \"\");\n\n\tlines.push(\"/** @internal */\");\n\tlines.push(\"export const ACTION_SOURCE_IDS: Record<string, Record<string, string>> = {\");\n\tfor (const page of pages) {\n\t\tconst pageId = pageIdentifiers.get(page.sourceId)!;\n\t\tif (page.actions.length === 0) continue;\n\t\tconst actionIds = buildActionIdentifiers(page.actions);\n\t\tlines.push(` ${JSON.stringify(pageId)}: {`);\n\t\tfor (const action of page.actions) {\n\t\t\tconst actionId = actionIds.get(action.sourceId)!;\n\t\t\tlines.push(` ${JSON.stringify(actionId)}: ${JSON.stringify(action.sourceId)},`);\n\t\t}\n\t\tlines.push(\" },\");\n\t}\n\tlines.push(\"};\", \"\");\n\n\tlines.push(\"/** @internal */\");\n\tlines.push(\"export const COMPONENT_SOURCE_IDS: Record<string, string> = {\");\n\tfor (const component of components) {\n\t\tconst id = componentIdentifiers.get(component.sourceId)!;\n\t\tlines.push(` ${JSON.stringify(id)}: ${JSON.stringify(component.sourceId)},`);\n\t}\n\tlines.push(\"};\", \"\");\n\n\tlines.push(\"/** @internal */\");\n\tlines.push(\"export const ELEMENT_SOURCE_IDS: Record<string, Record<string, string>> = {\");\n\tfor (const page of pages) {\n\t\tconst pageId = pageIdentifiers.get(page.sourceId)!;\n\t\tif (page.elements.length === 0) continue;\n\t\tconst shortKeys = computeElementShortKeys(page.elements);\n\t\tlines.push(` ${JSON.stringify(pageId)}: {`);\n\t\tconst seenPaths = new Set<string>();\n\t\tfor (const el of page.elements) {\n\t\t\tif (seenPaths.has(el.path)) continue;\n\t\t\tseenPaths.add(el.path);\n\t\t\tconst shortKey = shortKeys.get(el.path) ?? el.name;\n\t\t\tlines.push(` ${JSON.stringify(shortKey)}: ${JSON.stringify(el.sourceId)},`);\n\t\t}\n\t\tlines.push(\" },\");\n\t}\n\tlines.push(\"};\");\n\n\t// Section-specific element source ID maps.\n\t// Each section computes short keys from only the elements matching its type filter,\n\t// avoiding cross-type name collisions (e.g., a Flex named \"Table\" won't affect\n\t// the key for a Table named \"Table\" in the tableRowHighlighting section).\n\tlines.push(\"\");\n\tlines.push(\"/** @internal — section-local element key → sourceId maps */\");\n\tlines.push(\"export const SECTION_ELEMENT_SOURCE_IDS: Record<string, Record<string, Record<string, string>>> = {\");\n\tfor (const [sectionName, typeSet] of SECTION_TYPE_FILTERS) {\n\t\tconst sectionPages: string[] = [];\n\t\tfor (const page of pages) {\n\t\t\tconst pageId = pageIdentifiers.get(page.sourceId)!;\n\t\t\tconst { keys, sourceMap } = filterElementKeys(page.elements, typeSet);\n\t\t\tif (keys.length === 0) continue;\n\t\t\tsectionPages.push(\n\t\t\t\t` ${JSON.stringify(pageId)}: {\\n${keys.map((k) => ` ${JSON.stringify(k)}: ${JSON.stringify(sourceMap.get(k)!)},`).join(\"\\n\")}\\n },`\n\t\t\t);\n\t\t}\n\t\tif (sectionPages.length > 0) {\n\t\t\tlines.push(` ${JSON.stringify(sectionName)}: {`);\n\t\t\tfor (const sp of sectionPages) {\n\t\t\t\tlines.push(sp);\n\t\t\t}\n\t\t\tlines.push(\" },\");\n\t\t}\n\t}\n\tlines.push(\"};\");\n\n\tif (annotationGroups.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"/** @internal */\");\n\t\tlines.push(\"export const ANNOTATION_COMPONENT_SOURCE_IDS: Record<string, string[]> = {\");\n\t\tfor (const group of annotationGroups) {\n\t\t\tconst ids = group.sourceIds.map((id) => JSON.stringify(id)).join(\", \");\n\t\t\tlines.push(` ${JSON.stringify(group.name)}: [${ids}],`);\n\t\t}\n\t\tlines.push(\"};\");\n\t}\n\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction buildActionIdentifiers(actions: ExtractedAction[]): Map<string, string> {\n\tconst map = new Map<string, string>();\n\tconst usedNames = new Map<string, number>();\n\n\tfor (const action of actions) {\n\t\tlet base = toActionIdentifier(action.name);\n\t\tconst count = usedNames.get(base) ?? 0;\n\t\tusedNames.set(base, count + 1);\n\t\tif (count > 0) {\n\t\t\tbase = `${base}${count}`;\n\t\t}\n\t\tmap.set(action.sourceId, base);\n\t}\n\n\treturn map;\n}\n\nfunction generatePageTypes(page: ExtractedPage, identifier: string): string {\n\tconst lines: string[] = [\n\t\t\"// AUTO-GENERATED — DO NOT EDIT\",\n\t\t\"\",\n\t\t'import type { ActionLifecycle } from \"@judo/model-api\";',\n\t\t\"\",\n\t];\n\n\t// Build action identifiers\n\tconst actionIds = buildActionIdentifiers(page.actions);\n\n\t// Page actions interface\n\tlines.push(\"/**\");\n\tlines.push(` * Action overrides for ${identifier}.`);\n\tlines.push(\" * Each property maps to an action on this page by its model name.\");\n\tlines.push(\" * All properties and their methods are optional.\");\n\tlines.push(\" */\");\n\tif (page.actions.length === 0) {\n\t\tlines.push(`export type ${identifier}Actions = Record<string, never>;`);\n\t} else {\n\t\tlines.push(`export interface ${identifier}Actions {`);\n\t\tfor (const action of page.actions) {\n\t\t\tconst actionId = actionIds.get(action.sourceId)!;\n\t\t\tconst lifecycleType = getLifecycleType(action.actionDefinitionType);\n\t\t\tlines.push(` /** ${action.actionDefinitionType} — ${action.name} */`);\n\t\t\tlines.push(` ${actionId}?: Partial<${lifecycleType}>;`);\n\t\t}\n\t\tlines.push(\"}\");\n\t}\n\n\t// Hook type\n\tlines.push(\"/**\");\n\tlines.push(` * Hook type for providing ${identifier} action overrides.`);\n\tlines.push(\" */\");\n\tlines.push(`export type Use${identifier}Actions = () => ${identifier}Actions;`);\n\tlines.push(\"\");\n\n\t// Element names union type (human-readable short keys)\n\tif (page.elements.length > 0) {\n\t\tlines.push(\"/**\");\n\t\tlines.push(` * Named elements on ${identifier}, for use with visual property overrides.`);\n\t\tlines.push(\" */\");\n\t\tconst shortKeys = computeElementShortKeys(page.elements);\n\t\tconst seen = new Set<string>();\n\t\tconst elementKeyLiterals: string[] = [];\n\t\tfor (const el of page.elements) {\n\t\t\tconst key = shortKeys.get(el.path) ?? el.name;\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\telementKeyLiterals.push(`\"${key}\"`);\n\t\t\t}\n\t\t}\n\t\tlines.push(`export type ${identifier}Elements = ${elementKeyLiterals.join(\" | \")};`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction generatePagesIndex(pages: ExtractedPage[], identifiers: Map<string, string>): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\tfor (const page of pages) {\n\t\tconst id = identifiers.get(page.sourceId)!;\n\t\tlines.push(`export type { ${id}Actions, Use${id}Actions } from \"./${id}\";`);\n\t}\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction generateComponentTypes(component: ExtractedComponent, identifier: string): string {\n\tconst elementType = component.elementType === \"Flex\" ? \"Flex\" : \"VisualElement\";\n\treturn [\n\t\t\"// AUTO-GENERATED — DO NOT EDIT\",\n\t\t\"\",\n\t\t`import type { CustomComponentProps } from \"@judo/model-api\";`,\n\t\t`import type { ${elementType} } from \"@judo/model-api\";`,\n\t\t\"\",\n\t\t\"/**\",\n\t\t` * Props for the ${identifier} custom component.`,\n\t\t` * The element is typed as ${elementType} (the VisualElement subtype from the model).`,\n\t\t\" */\",\n\t\t`export type ${identifier}Props = CustomComponentProps<${elementType}>;`,\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nfunction generateComponentsIndex(components: ExtractedComponent[], identifiers: Map<string, string>): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\tif (components.length === 0) {\n\t\tlines.push(\"export {};\");\n\t}\n\tfor (const component of components) {\n\t\tconst id = identifiers.get(component.sourceId)!;\n\t\tlines.push(`export type { ${id}Props } from \"./${id}\";`);\n\t}\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction generateCustomizationsFactory(\n\tpages: ExtractedPage[],\n\tcomponents: ExtractedComponent[],\n\tpageIdentifiers: Map<string, string>,\n\tcomponentIdentifiers: Map<string, string>,\n\tsubThemeNames: string[],\n\tannotationGroups: AnnotationComponentGroup[]\n): string {\n\tconst hasSubThemes = subThemeNames.length > 0;\n\tconst hasAnnotationComponents = annotationGroups.length > 0;\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\n\tif (hasSubThemes) {\n\t\tlines.push(\n\t\t\t'import type { ItemContainerConfig, ColumnCustomizerFn, CustomizationsConfig, ComponentInterceptors, CustomComponent, DateValidationFn, EnumOptionFilterFn, GuestPageProps, HeroComponentProps, NavigationItem, PageActionOverrides, PageCustomization, SubThemeHook, TableRowHighlightConfig, VisualPropertyOverrides } from \"@judo/model-api\";'\n\t\t);\n\t} else {\n\t\tlines.push(\n\t\t\t'import type { ItemContainerConfig, ColumnCustomizerFn, CustomizationsConfig, ComponentInterceptors, CustomComponent, DateValidationFn, EnumOptionFilterFn, GuestPageProps, HeroComponentProps, NavigationItem, PageActionOverrides, PageCustomization, TableRowHighlightConfig, VisualPropertyOverrides } from \"@judo/model-api\";'\n\t\t);\n\t}\n\tlines.push('import type { Flex, VisualElement } from \"@judo/model-api\";');\n\tlines.push('import type { ComponentType, ReactElement } from \"react\";');\n\n\t// Import page hook types\n\tfor (const page of pages) {\n\t\tconst id = pageIdentifiers.get(page.sourceId)!;\n\t\tlines.push(`import type { Use${id}Actions } from \"./pages/${id}\";`);\n\t}\n\n\tlines.push(\"\");\n\tlines.push(\"import {\");\n\tlines.push(\" PAGE_SOURCE_IDS,\");\n\tlines.push(\" ACTION_SOURCE_IDS,\");\n\tlines.push(\" COMPONENT_SOURCE_IDS,\");\n\tlines.push(\" ELEMENT_SOURCE_IDS,\");\n\tlines.push(\" SECTION_ELEMENT_SOURCE_IDS,\");\n\tif (hasAnnotationComponents) {\n\t\tlines.push(\" ANNOTATION_COMPONENT_SOURCE_IDS,\");\n\t}\n\tlines.push('} from \"./_source-id-map\";');\n\tlines.push(\"\");\n\n\t// Typed input interface\n\tlines.push(\"/**\");\n\tlines.push(\" * Typed customization configuration.\");\n\tlines.push(\" * All keys are human-readable model `name` attributes — never sourceIds.\");\n\tlines.push(\" */\");\n\tlines.push(\"export interface TypedCustomizationsInput {\");\n\tlines.push(\" pages?: {\");\n\tfor (const page of pages) {\n\t\tconst id = pageIdentifiers.get(page.sourceId)!;\n\t\tlines.push(` ${JSON.stringify(id)}?: {`);\n\t\tlines.push(` actions?: Use${id}Actions;`);\n\t\tlines.push(\" visualProperties?: () => VisualPropertyOverrides;\");\n\n\t\t// Typed element-name-keyed fields (only emitted when page has matching elements)\n\t\t// Each section computes its own short keys from only matching element types,\n\t\t// so cross-type name collisions don't cause unnecessary disambiguation.\n\n\t\tconst typeahead = filterElementKeys(page.elements, TYPEAHEAD_ELEMENT_TYPES);\n\t\tif (typeahead.keys.length > 0) {\n\t\t\tlines.push(\" typeaheadProviders?: {\");\n\t\t\tfor (const key of typeahead.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: (text: string) => Promise<string[]>;`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\tconst table = filterElementKeys(page.elements, TABLE_ELEMENT_TYPES);\n\t\tif (table.keys.length > 0) {\n\t\t\tlines.push(\" tableRowHighlighting?: {\");\n\t\t\tfor (const key of table.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: TableRowHighlightConfig[];`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\tconst enums = filterElementKeys(page.elements, ENUM_ELEMENT_TYPES);\n\t\tif (enums.keys.length > 0) {\n\t\t\tlines.push(\" enumOptionFilter?: {\");\n\t\t\tfor (const key of enums.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: EnumOptionFilterFn;`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\tconst dates = filterElementKeys(page.elements, DATE_ELEMENT_TYPES);\n\t\tif (dates.keys.length > 0) {\n\t\t\tlines.push(\" dateValidationProps?: {\");\n\t\t\tfor (const key of dates.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: DateValidationFn;`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\tconst columns = filterElementKeys(page.elements, COLUMN_ELEMENT_TYPES);\n\t\tif (columns.keys.length > 0) {\n\t\t\tlines.push(\" columnCustomizers?: {\");\n\t\t\tfor (const key of columns.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: ColumnCustomizerFn;`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\t// Card container configs — reuse TABLE_ELEMENT_TYPES (keyed by Table element name)\n\t\tconst cardTables = filterElementKeys(page.elements, TABLE_ELEMENT_TYPES);\n\t\tif (cardTables.keys.length > 0) {\n\t\t\tlines.push(\" itemContainerConfigs?: {\");\n\t\t\tfor (const key of cardTables.keys) {\n\t\t\t\tlines.push(` ${JSON.stringify(key)}?: ItemContainerConfig;`);\n\t\t\t}\n\t\t\tlines.push(\" };\");\n\t\t}\n\n\t\tlines.push(\" };\");\n\t}\n\tlines.push(\" };\");\n\n\tif (components.length > 0) {\n\t\tlines.push(\" components?: {\");\n\t\tfor (const component of components) {\n\t\t\tconst id = componentIdentifiers.get(component.sourceId)!;\n\t\t\tconst elementType = component.elementType === \"Flex\" ? \"Flex\" : \"VisualElement\";\n\t\t\tlines.push(` ${JSON.stringify(id)}?: CustomComponent<${elementType}>;`);\n\t\t}\n\t\tlines.push(\" };\");\n\t}\n\n\tif (hasAnnotationComponents) {\n\t\tlines.push(\" /**\");\n\t\tlines.push(\" * Annotation-based component overrides. A single component handles all visual elements\");\n\t\tlines.push(\" * sharing the same annotation (with the annotation prefix stripped).\");\n\t\tlines.push(' * E.g., annotation `useFancyText` → key `\"FancyText\"`.');\n\t\tlines.push(\" */\");\n\t\tlines.push(\" annotationComponents?: {\");\n\t\tfor (const group of annotationGroups) {\n\t\t\tlines.push(` ${JSON.stringify(group.name)}?: CustomComponent<VisualElement>;`);\n\t\t}\n\t\tlines.push(\" };\");\n\t}\n\n\tlines.push(\" componentInterceptors?: ComponentInterceptors;\");\n\n\tif (hasSubThemes) {\n\t\tlines.push(\" /**\");\n\t\tlines.push(\" * Sub-theme providers keyed by sub-theme name.\");\n\t\tlines.push(\" * Visual elements with matching subTheme values are wrapped in a scoped MUI ThemeProvider.\");\n\t\tlines.push(\" */\");\n\t\tlines.push(\" subThemeProviders?: {\");\n\t\tfor (const name of subThemeNames) {\n\t\t\tlines.push(` ${JSON.stringify(name)}?: SubThemeHook;`);\n\t\t}\n\t\tlines.push(\" };\");\n\t}\n\n\tlines.push(\" redirectHandler?: ComponentType;\");\n\tlines.push(\" customRoutes?: Array<{ path: string; element: ReactElement }>;\");\n\tlines.push(\" menuCustomizer?: (items: NavigationItem[]) => NavigationItem[];\");\n\tlines.push(\" footerText?: string | (() => string);\");\n\tlines.push(\" heroComponent?: ComponentType<HeroComponentProps>;\");\n\tlines.push(\" settingsPage?: ComponentType;\");\n\tlines.push(\" guestComponent?: ComponentType<GuestPageProps>;\");\n\tlines.push(\"}\", \"\");\n\n\t// Internal helper type for factory — union of all page bundles needs a common shape\n\tlines.push(\"/** @internal — common shape used by factory to handle the union of all per-page types */\");\n\tlines.push(\"type _PageBundle = {\");\n\tlines.push(\" actions?: () => Record<string, unknown>;\");\n\tlines.push(\" visualProperties?: () => VisualPropertyOverrides;\");\n\tlines.push(\" typeaheadProviders?: Record<string, (text: string) => Promise<string[]>>;\");\n\tlines.push(\" tableRowHighlighting?: Record<string, TableRowHighlightConfig[]>;\");\n\tlines.push(\" enumOptionFilter?: Record<string, EnumOptionFilterFn>;\");\n\tlines.push(\" dateValidationProps?: Record<string, DateValidationFn>;\");\n\tlines.push(\" columnCustomizers?: Record<string, ColumnCustomizerFn>;\");\n\tlines.push(\" itemContainerConfigs?: Record<string, ItemContainerConfig>;\");\n\tlines.push(\"};\", \"\");\n\n\t// Factory function\n\tlines.push(\"/**\");\n\tlines.push(\" * Creates a CustomizationsConfig with type-safe bindings.\");\n\tlines.push(\" * Developers use human-readable names; the factory resolves to sourceIds internally.\");\n\tlines.push(\" */\");\n\tlines.push(\"export function createCustomizations(input: TypedCustomizationsInput): CustomizationsConfig {\");\n\tlines.push(\" const config: CustomizationsConfig = {};\");\n\tlines.push(\"\");\n\tlines.push(\" if (input.pages) {\");\n\tlines.push(\" config.pages = {};\");\n\tlines.push(\" for (const [pageName, bundle] of Object.entries(input.pages)) {\");\n\tlines.push(\" const pageSourceId = PAGE_SOURCE_IDS[pageName];\");\n\tlines.push(\" if (!pageSourceId || !bundle) continue;\");\n\tlines.push(\"\");\n\tlines.push(\" // Cast to common shape — per-page types are narrower but factory handles all uniformly\");\n\tlines.push(\" const b = bundle as _PageBundle;\");\n\tlines.push(\" const pageCustomization: PageCustomization = {};\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.actions) {\");\n\tlines.push(\" const actionMap = ACTION_SOURCE_IDS[pageName];\");\n\tlines.push(\" const actionsHook = b.actions;\");\n\tlines.push(\" pageCustomization.actions = () => {\");\n\tlines.push(\" const namedOverrides = (actionsHook as () => Record<string, unknown>)();\");\n\tlines.push(\" const resolved: PageActionOverrides = {};\");\n\tlines.push(\" for (const [actionName, lifecycle] of Object.entries(namedOverrides)) {\");\n\tlines.push(\" const actionSourceId = actionMap?.[actionName];\");\n\tlines.push(\n\t\t\" if (actionSourceId && lifecycle) resolved[actionSourceId] = lifecycle as PageActionOverrides[string];\"\n\t);\n\tlines.push(\" }\");\n\tlines.push(\" return resolved;\");\n\tlines.push(\" };\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.visualProperties) {\");\n\tlines.push(\" const elementMap = ELEMENT_SOURCE_IDS[pageName];\");\n\tlines.push(\" const visualHook = b.visualProperties;\");\n\tlines.push(\" pageCustomization.visualProperties = () => {\");\n\tlines.push(\" const namedOverrides = (visualHook as () => Record<string, unknown>)();\");\n\tlines.push(\" const resolved: Record<string, unknown> = {};\");\n\tlines.push(\" for (const [elementName, props] of Object.entries(namedOverrides)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && props) resolved[elementSourceId] = props;\");\n\tlines.push(\" }\");\n\tlines.push(\" return resolved as VisualPropertyOverrides;\");\n\tlines.push(\" };\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.typeaheadProviders) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.typeaheadProviders?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, (text: string) => Promise<string[]>> = {};\");\n\tlines.push(\" for (const [elementName, provider] of Object.entries(b.typeaheadProviders)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && provider) resolved[elementSourceId] = provider;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.typeaheadProviders = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.tableRowHighlighting) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.tableRowHighlighting?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, TableRowHighlightConfig[]> = {};\");\n\tlines.push(\" for (const [elementName, configs] of Object.entries(b.tableRowHighlighting)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && configs) resolved[elementSourceId] = configs;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.tableRowHighlighting = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.enumOptionFilter) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.enumOptionFilter?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, EnumOptionFilterFn> = {};\");\n\tlines.push(\" for (const [elementName, filterFn] of Object.entries(b.enumOptionFilter)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && filterFn) resolved[elementSourceId] = filterFn;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.enumOptionFilter = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.dateValidationProps) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.dateValidationProps?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, DateValidationFn> = {};\");\n\tlines.push(\" for (const [elementName, validationFn] of Object.entries(b.dateValidationProps)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && validationFn) resolved[elementSourceId] = validationFn;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.dateValidationProps = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.columnCustomizers) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.columnCustomizers?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, ColumnCustomizerFn> = {};\");\n\tlines.push(\" for (const [elementName, customizerFn] of Object.entries(b.columnCustomizers)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && customizerFn) resolved[elementSourceId] = customizerFn;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.columnCustomizers = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" if (b.itemContainerConfigs) {\");\n\tlines.push(\" const elementMap = SECTION_ELEMENT_SOURCE_IDS.itemContainerConfigs?.[pageName];\");\n\tlines.push(\" const resolved: Record<string, ItemContainerConfig> = {};\");\n\tlines.push(\" for (const [elementName, config] of Object.entries(b.itemContainerConfigs)) {\");\n\tlines.push(\" const elementSourceId = elementMap?.[elementName];\");\n\tlines.push(\" if (elementSourceId && config) resolved[elementSourceId] = config;\");\n\tlines.push(\" }\");\n\tlines.push(\" pageCustomization.itemContainerConfigs = resolved;\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\tlines.push(\" config.pages[pageSourceId] = pageCustomization;\");\n\tlines.push(\" }\");\n\tlines.push(\" }\");\n\tlines.push(\"\");\n\n\tif (hasAnnotationComponents) {\n\t\tlines.push(\" // Annotation-based component overrides (lower priority than individual components)\");\n\t\tlines.push(\" if (input.annotationComponents) {\");\n\t\tlines.push(\" if (!config.components) config.components = {};\");\n\t\tlines.push(\" for (const [name, component] of Object.entries(input.annotationComponents)) {\");\n\t\tlines.push(\" const sourceIds = ANNOTATION_COMPONENT_SOURCE_IDS[name];\");\n\t\tlines.push(\" if (sourceIds && component) {\");\n\t\tlines.push(\" for (const sourceId of sourceIds) {\");\n\t\tlines.push(\" config.components[sourceId] = component as CustomComponent<VisualElement>;\");\n\t\tlines.push(\" }\");\n\t\tlines.push(\" }\");\n\t\tlines.push(\" }\");\n\t\tlines.push(\" }\");\n\t\tlines.push(\"\");\n\t}\n\n\tif (components.length > 0) {\n\t\tlines.push(\" // Individual component overrides (highest priority — overwrites annotation-based)\");\n\t\tlines.push(\" if (input.components) {\");\n\t\tlines.push(\" if (!config.components) config.components = {};\");\n\t\tlines.push(\" for (const [name, component] of Object.entries(input.components)) {\");\n\t\tlines.push(\" const sourceId = COMPONENT_SOURCE_IDS[name];\");\n\t\tlines.push(\n\t\t\t\" if (sourceId && component) config.components[sourceId] = component as CustomComponent<VisualElement>;\"\n\t\t);\n\t\tlines.push(\" }\");\n\t\tlines.push(\" }\");\n\t\tlines.push(\"\");\n\t}\n\n\tlines.push(\" if (input.componentInterceptors) {\");\n\tlines.push(\" config.componentInterceptors = input.componentInterceptors;\");\n\tlines.push(\" }\");\n\n\tif (hasSubThemes) {\n\t\tlines.push(\"\");\n\t\tlines.push(\" if (input.subThemeProviders) {\");\n\t\tlines.push(\" config.subThemeProviders = input.subThemeProviders;\");\n\t\tlines.push(\" }\");\n\t}\n\n\tlines.push(\"\");\n\tlines.push(\" if (input.redirectHandler) config.redirectHandler = input.redirectHandler;\");\n\tlines.push(\" if (input.customRoutes) config.customRoutes = input.customRoutes;\");\n\tlines.push(\" if (input.menuCustomizer) config.menuCustomizer = input.menuCustomizer;\");\n\tlines.push(\" if (input.footerText !== undefined) config.footerText = input.footerText;\");\n\tlines.push(\" if (input.heroComponent) config.heroComponent = input.heroComponent;\");\n\tlines.push(\" if (input.settingsPage) config.settingsPage = input.settingsPage;\");\n\tlines.push(\" if (input.guestComponent) config.guestComponent = input.guestComponent;\");\n\tlines.push(\"\");\n\tlines.push(\" return config;\");\n\tlines.push(\"}\");\n\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction generateIndex(hasTransfers: boolean): string {\n\tconst lines = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\", 'export * from \"./pages\";', 'export * from \"./components\";'];\n\tif (hasTransfers) {\n\t\tlines.push('export * from \"./transfers\";');\n\t}\n\tlines.push(\n\t\t'export { createCustomizations } from \"./customizations\";',\n\t\t'export type { TypedCustomizationsInput } from \"./customizations\";',\n\t\t'export { TRANSLATION_KEY_MAP } from \"./_translation-key-map\";',\n\t\t\"\"\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nfunction generatePageStub(page: ExtractedPage, identifier: string): string {\n\tconst actionIds = buildActionIdentifiers(page.actions);\n\tconst lines: string[] = [\n\t\t`import type { Use${identifier}Actions } from \"../../pages/${identifier}\";`,\n\t\t\"\",\n\t\t\"/**\",\n\t\t` * Action overrides for ${identifier}.`,\n\t\t\" * Implement the methods you want to customize.\",\n\t\t\" * Remove this file or clear the body to use all defaults.\",\n\t\t\" */\",\n\t\t`export const use${identifier}Actions: Use${identifier}Actions = () => ({`,\n\t];\n\n\tfor (const action of page.actions.slice(0, 3)) {\n\t\tconst actionId = actionIds.get(action.sourceId)!;\n\t\tlines.push(` // ${actionId}: {`);\n\t\tlines.push(` // before: async (context) => { /* custom pre-${actionId} logic */ },`);\n\t\tlines.push(` // after: async (context, result) => { /* custom post-${actionId} logic */ },`);\n\t\tlines.push(\" // },\");\n\t}\n\n\tlines.push(\"});\");\n\tlines.push(\"\");\n\treturn lines.join(\"\\n\");\n}\n\nfunction generateComponentStub(component: ExtractedComponent, identifier: string): string {\n\tconst _elementType = component.elementType === \"Flex\" ? \"Flex\" : \"VisualElement\";\n\treturn [\n\t\t`import type { ${identifier}Props } from \"../../components/${identifier}\";`,\n\t\t\"\",\n\t\t\"/**\",\n\t\t` * Custom implementation for ${identifier}.`,\n\t\t\" * This component replaces the default renderer for this element.\",\n\t\t\" */\",\n\t\t`export const ${identifier}: React.FC<${identifier}Props> = ({ element, page }) => {`,\n\t\t\" return (\",\n\t\t` <div data-source-id={element[\"xmi:id\"]}>`,\n\t\t` <p>${identifier} — custom implementation</p>`,\n\t\t\" </div>\",\n\t\t\" );\",\n\t\t\"};\",\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\n// ============================================\n// TRANSFER TYPE GENERATION\n// ============================================\n\n/**\n * Map a data:* xsi:type to a TypeScript type string.\n */\nfunction mapDataTypeToTS(xsiType: string): string {\n\tswitch (xsiType) {\n\t\tcase \"data:StringType\":\n\t\t\treturn \"string\";\n\t\tcase \"data:NumericType\":\n\t\t\treturn \"number\";\n\t\tcase \"data:BooleanType\":\n\t\t\treturn \"boolean\";\n\t\tcase \"data:DateType\":\n\t\tcase \"data:TimestampType\":\n\t\t\treturn \"Date\";\n\t\tcase \"data:TimeType\":\n\t\t\treturn \"string\";\n\t\tcase \"data:PasswordType\":\n\t\t\treturn \"string\";\n\t\tcase \"data:BinaryType\":\n\t\t\treturn \"string\";\n\t\tcase \"data:EnumerationType\":\n\t\t\treturn \"string\";\n\t\tdefault:\n\t\t\treturn \"unknown\";\n\t}\n}\n\n/**\n * Get the temporal field type for a data:* xsi:type, or null if not temporal.\n */\nfunction getTemporalFieldType(xsiType: string): string | null {\n\tswitch (xsiType) {\n\t\tcase \"data:DateType\":\n\t\t\treturn \"date\";\n\t\tcase \"data:TimestampType\":\n\t\t\treturn \"timestamp\";\n\t\tcase \"data:TimeType\":\n\t\t\treturn \"time\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Determine if an EnumerationType is a domain enum (not an operator enum).\n * Operator enums have names ending with \"Operation\" (e.g., StringOperation, NumericOperation).\n */\nfunction isDomainEnum(dt: ExtractedDataType): boolean {\n\treturn dt.xsiType === \"data:EnumerationType\" && !dt.name.endsWith(\"Operation\") && (dt.members?.length ?? 0) > 0;\n}\n\n/**\n * Generate all transfer type files: per-type interfaces, enum type aliases, and barrel index.\n */\nfunction generateTransferFiles(\n\ttransferTypes: ExtractedTransferType[],\n\tdataTypes: ExtractedDataType[]\n): Map<string, string> {\n\tconst files = new Map<string, string>();\n\n\t// Build data type index: xmiId → ExtractedDataType\n\tconst dataTypeIndex = new Map<string, ExtractedDataType>();\n\tfor (const dt of dataTypes) {\n\t\tdataTypeIndex.set(dt.xmiId, dt);\n\t}\n\n\t// Build transfer type index: xmiId → ExtractedTransferType\n\tconst transferTypeIndex = new Map<string, ExtractedTransferType>();\n\tfor (const tt of transferTypes) {\n\t\ttransferTypeIndex.set(tt.xmiId, tt);\n\t}\n\n\t// Identify domain enums referenced by attributes\n\tconst referencedEnumIds = new Set<string>();\n\tfor (const tt of transferTypes) {\n\t\tfor (const attr of tt.attributes) {\n\t\t\tconst dt = dataTypeIndex.get(attr.dataTypeRef);\n\t\t\tif (dt && isDomainEnum(dt)) {\n\t\t\t\treferencedEnumIds.add(dt.xmiId);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Collect domain enums to generate (sorted by name for deterministic output)\n\tconst domainEnums = dataTypes\n\t\t.filter((dt) => referencedEnumIds.has(dt.xmiId))\n\t\t.toSorted((a, b) => a.name.localeCompare(b.name));\n\n\t// Generate enum types file (if any)\n\tif (domainEnums.length > 0) {\n\t\tfiles.set(\"transfers/_enums.ts\", generateEnumTypesFile(domainEnums));\n\t}\n\n\t// Filter transfer types: exclude actor types, sort by name for deterministic output\n\tconst generatableTypes = transferTypes.filter((tt) => !tt.isActor).toSorted((a, b) => a.name.localeCompare(b.name));\n\n\t// Track which types have temporal fields (for registry and barrel index)\n\tconst typesWithTemporalFields = new Set<string>();\n\n\t// Generate per-transfer interface files\n\tfor (const tt of generatableTypes) {\n\t\tconst hasTemporalFields = tt.attributes.some((attr) => {\n\t\t\tconst dt = dataTypeIndex.get(attr.dataTypeRef);\n\t\t\treturn dt != null && getTemporalFieldType(dt.xsiType) != null;\n\t\t});\n\t\tif (hasTemporalFields) {\n\t\t\ttypesWithTemporalFields.add(tt.name);\n\t\t}\n\t\tfiles.set(\n\t\t\t`transfers/${toTransferIdentifier(tt.name)}.ts`,\n\t\t\tgenerateTransferTypeFile(tt, dataTypeIndex, transferTypeIndex, referencedEnumIds)\n\t\t);\n\t}\n\n\t// Generate temporal field registry (if any types have temporal fields)\n\tif (typesWithTemporalFields.size > 0) {\n\t\tfiles.set(\n\t\t\t\"transfers/_registry.ts\",\n\t\t\tgenerateTemporalRegistry(generatableTypes, dataTypeIndex, typesWithTemporalFields)\n\t\t);\n\t}\n\n\t// Generate barrel index\n\tfiles.set(\"transfers/index.ts\", generateTransfersIndex(generatableTypes, domainEnums, typesWithTemporalFields));\n\n\treturn files;\n}\n\n/**\n * Generate a file containing all domain enum type aliases.\n */\nfunction generateEnumTypesFile(enums: ExtractedDataType[]): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\n\tfor (const dt of enums) {\n\t\tconst safeName = toTransferIdentifier(dt.name);\n\t\tconst members = dt.members ?? [];\n\t\tconst union = members.map((m) => JSON.stringify(m)).join(\" | \");\n\t\tlines.push(`/** ${dt.name} enumeration values */`);\n\t\tlines.push(`export type ${safeName} = ${union};`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generate a single transfer type interface file.\n */\nfunction generateTransferTypeFile(\n\ttt: ExtractedTransferType,\n\tdataTypeIndex: Map<string, ExtractedDataType>,\n\ttransferTypeIndex: Map<string, ExtractedTransferType>,\n\treferencedEnumIds: Set<string>\n): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\n\t// Collect imports needed from other transfer types\n\tconst importedTypes = new Set<string>();\n\tfor (const rel of tt.relations) {\n\t\tconst target = transferTypeIndex.get(rel.targetRef);\n\t\tif (target && target.name !== tt.name && !target.isActor) {\n\t\t\timportedTypes.add(toTransferIdentifier(target.name));\n\t\t}\n\t}\n\n\t// Collect enum imports\n\tconst importedEnums = new Set<string>();\n\tfor (const attr of tt.attributes) {\n\t\tconst dt = dataTypeIndex.get(attr.dataTypeRef);\n\t\tif (dt && referencedEnumIds.has(dt.xmiId)) {\n\t\t\timportedEnums.add(toTransferIdentifier(dt.name));\n\t\t}\n\t}\n\n\t// Write imports for referenced transfer types\n\tconst sortedImports = [...importedTypes].toSorted();\n\tfor (const typeName of sortedImports) {\n\t\tlines.push(`import type { ${typeName} } from \"./${typeName}\";`);\n\t}\n\n\t// Write imports for enum types\n\tif (importedEnums.size > 0) {\n\t\tconst sortedEnums = [...importedEnums].toSorted();\n\t\tlines.push(`import type { ${sortedEnums.join(\", \")} } from \"./_enums\";`);\n\t}\n\n\tif (importedTypes.size > 0 || importedEnums.size > 0) {\n\t\tlines.push(\"\");\n\t}\n\n\t// Interface declaration\n\tlines.push(\"/**\");\n\tlines.push(` * Transfer type interface for ${tt.name}.`);\n\tlines.push(\" * Provides strict typing for fields defined in the model.\");\n\tlines.push(\" */\");\n\tlines.push(`export interface ${toTransferIdentifier(tt.name)} {`);\n\n\t// Attributes\n\tfor (const attr of tt.attributes) {\n\t\tconst dt = dataTypeIndex.get(attr.dataTypeRef);\n\t\tlet tsType: string;\n\t\tif (dt && referencedEnumIds.has(dt.xmiId)) {\n\t\t\t// Use the enum type name\n\t\t\ttsType = toTransferIdentifier(dt.name);\n\t\t} else if (dt) {\n\t\t\ttsType = mapDataTypeToTS(dt.xsiType);\n\t\t} else {\n\t\t\ttsType = \"unknown\";\n\t\t}\n\t\tlines.push(` ${attr.name}?: ${tsType};`);\n\t}\n\n\t// Relations\n\tfor (const rel of tt.relations) {\n\t\tconst target = transferTypeIndex.get(rel.targetRef);\n\t\tif (target && !target.isActor) {\n\t\t\tconst safeName = toTransferIdentifier(target.name);\n\t\t\tconst relType = rel.isCollection ? `${safeName}[]` : safeName;\n\t\t\tlines.push(` ${rel.name}?: ${relType};`);\n\t\t}\n\t}\n\n\tlines.push(\"}\");\n\tlines.push(\"\");\n\n\t// Generate temporal field metadata if this type has any temporal attributes\n\tconst temporalFields: Array<{ name: string; type: string }> = [];\n\tfor (const attr of tt.attributes) {\n\t\tconst dt = dataTypeIndex.get(attr.dataTypeRef);\n\t\tif (dt) {\n\t\t\tconst temporalType = getTemporalFieldType(dt.xsiType);\n\t\t\tif (temporalType != null) {\n\t\t\t\ttemporalFields.push({ name: attr.name, type: temporalType });\n\t\t\t}\n\t\t}\n\t}\n\n\tif (temporalFields.length > 0) {\n\t\tconst safeName = toTransferIdentifier(tt.name);\n\t\tlines.push(`/** Temporal field metadata for ${safeName} */`);\n\t\tlines.push(`export const ${safeName}TemporalFields: Record<string, string> = {`);\n\t\tfor (const tf of temporalFields) {\n\t\t\tlines.push(` ${tf.name}: \"${tf.type}\",`);\n\t\t}\n\t\tlines.push(\"};\");\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generate a temporal field registry combining all transfer types with temporal fields.\n * Keys are the original entity type FQNs (matching `__entityType` from API responses).\n */\nfunction generateTemporalRegistry(\n\ttransferTypes: ExtractedTransferType[],\n\tdataTypeIndex: Map<string, ExtractedDataType>,\n\ttypesWithTemporalFields: Set<string>\n): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\n\t// Sort for deterministic output\n\tconst typesWithFields = transferTypes\n\t\t.filter((tt) => typesWithTemporalFields.has(tt.name))\n\t\t.toSorted((a, b) => a.name.localeCompare(b.name));\n\n\t// Imports\n\tfor (const tt of typesWithFields) {\n\t\tconst safeName = toTransferIdentifier(tt.name);\n\t\tlines.push(`import { ${safeName}TemporalFields } from \"./${safeName}\";`);\n\t}\n\tlines.push(\"\");\n\n\tlines.push(\"/**\");\n\tlines.push(\" * Combined temporal field registry for all transfer types.\");\n\tlines.push(\" * Keys are entity type FQNs (matching __entityType from API responses).\");\n\tlines.push(\" */\");\n\tlines.push(\"export const temporalFieldRegistry: Record<string, Record<string, string>> = {\");\n\n\tfor (const tt of typesWithFields) {\n\t\tconst safeName = toTransferIdentifier(tt.name);\n\t\tlines.push(` ${JSON.stringify(tt.name)}: ${safeName}TemporalFields,`);\n\t}\n\n\tlines.push(\"};\");\n\tlines.push(\"\");\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generate barrel index for transfer types.\n */\nfunction generateTransfersIndex(\n\ttransferTypes: ExtractedTransferType[],\n\tdomainEnums: ExtractedDataType[],\n\ttypesWithTemporalFields: Set<string>\n): string {\n\tconst lines: string[] = [\"// AUTO-GENERATED — DO NOT EDIT\", \"\"];\n\n\tif (domainEnums.length > 0) {\n\t\tlines.push(\n\t\t\t\"export type { \" + domainEnums.map((e) => toTransferIdentifier(e.name)).join(\", \") + ' } from \"./_enums\";'\n\t\t);\n\t}\n\n\tfor (const tt of transferTypes) {\n\t\tconst safeName = toTransferIdentifier(tt.name);\n\t\tlines.push(`export type { ${safeName} } from \"./${safeName}\";`);\n\t\tif (typesWithTemporalFields.has(tt.name)) {\n\t\t\tlines.push(`export { ${safeName}TemporalFields } from \"./${safeName}\";`);\n\t\t}\n\t}\n\n\tif (typesWithTemporalFields.size > 0) {\n\t\tlines.push('export { temporalFieldRegistry } from \"./_registry\";');\n\t}\n\n\tif (transferTypes.length === 0 && domainEnums.length === 0) {\n\t\tlines.push(\"export {};\");\n\t}\n\n\tlines.push(\"\");\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================\n// HELPERS\n// ============================================\n\nfunction getLifecycleType(_actionDefType: string): string {\n\t// All action types use the base ActionLifecycle\n\t// Extended lifecycle interfaces (DeleteActionLifecycle, DialogActionLifecycle, etc.)\n\t// are defined in the spec but the base ActionLifecycle is sufficient for the core extensibility\n\treturn \"ActionLifecycle\";\n}\n\n// ============================================\n// TRANSLATION BASELINE GENERATION\n// ============================================\n\nimport type { ExtractedNavigationItem } from \"./model-reader\";\n\n/**\n * Derive a human-readable label from a page name.\n *\n * Page names follow the pattern `\"App::Owner::relation::PageTypeSuffix\"`. This extracts\n * the relation segment (second-to-last) and converts it to a readable form:\n * - `\"God::God::galaxies::AccessTablePage\"` → `\"Galaxies\"`\n * - `\"App::Transfer::stars::RelationFormPage\"` → `\"Stars\"`\n *\n * For operation input pages, the operation name is extracted instead:\n * - `\"View::Galaxy::Table::createDarkMatter::Input::Form\"` → `\"Create Dark Matter\"`\n * - `\"View::Creature::Table::talkToGod::Relation::Table::CallSelector\"` → `\"Talk To God\"`\n */\nfunction derivePageLabel(pageName: string): string {\n\tconst segments = pageName\n\t\t.split(\"::\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean);\n\n\t// Operation input form: ...::operationName::Input::Form\n\tconst inputFormMatch = pageName.match(/::(\\w+)::Input::Form$/);\n\tif (inputFormMatch) {\n\t\treturn camelCaseToTitleCase(inputFormMatch[1]);\n\t}\n\n\t// Operation input selector: ...::operationName::Relation::Table::CallSelector\n\tconst selectorMatch = pageName.match(/::(\\w+)::Relation::Table::CallSelector$/);\n\tif (selectorMatch) {\n\t\treturn camelCaseToTitleCase(selectorMatch[1]);\n\t}\n\n\t// Default: The second-to-last segment is typically the relation/feature name\n\tif (segments.length >= 2) {\n\t\tconst featureSegment = segments[segments.length - 2];\n\t\treturn camelCaseToTitleCase(featureSegment);\n\t}\n\treturn pageName;\n}\n\n/**\n * Convert a camelCase or PascalCase string to \"Title Case\" with spaces.\n * - `\"createDarkMatter\"` → `\"Create Dark Matter\"`\n * - `\"galaxies\"` → `\"Galaxies\"`\n * - `\"pictureInfo\"` → `\"Picture Info\"`\n */\nfunction camelCaseToTitleCase(input: string): string {\n\treturn input\n\t\t.replace(/_/g, \" \")\n\t\t.replace(/([a-z])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Generate a baseline en-US translation JSON from the model.\n *\n * Keys follow a human-readable hierarchical format:\n * - Application elements: `PageIdentifier.path.to.element` (value = model label)\n * - Navigation items: `nav.ItemName` (value = model label)\n * - System messages: `system.category.key` (value = English default)\n *\n * The JSON is sorted so that nav.*, page.*, and system.* blocks group naturally.\n */\nfunction generateTranslationBaseline(\n\tpages: ExtractedPage[],\n\tnavigationItems: ExtractedNavigationItem[],\n\tpageIdentifiers: Map<string, string>\n): string {\n\tconst entries: Record<string, string> = {};\n\n\t// Visual elements from all pages — use hierarchical path keys\n\tfor (const page of pages) {\n\t\tconst pageIdent = pageIdentifiers.get(page.sourceId);\n\t\tif (!pageIdent) continue;\n\n\t\t// Page-level entry (for page title translation)\n\t\tentries[pageIdent] = page.label ?? derivePageLabel(page.name);\n\n\t\tfor (const element of page.elements) {\n\t\t\tconst label = element.label ?? element.name;\n\t\t\t// Key: PageIdentifier.path (path is already hierarchical from collectElements)\n\t\t\tentries[`${pageIdent}.${element.path}`] = label;\n\t\t}\n\t}\n\n\t// Navigation items — use clean PascalCase identifier\n\tfor (const item of navigationItems) {\n\t\tconst navIdent = toNavItemIdentifier(item.name);\n\t\tentries[`nav.${navIdent}`] = item.label ?? item.name;\n\t}\n\n\t// System message keys (static, well-known keys)\n\tconst systemMessages: Record<string, string> = {\n\t\t\"system.action.save.success\": \"Saved successfully\",\n\t\t\"system.action.save.error\": \"Save failed\",\n\t\t\"system.action.delete.success\": \"Deleted successfully\",\n\t\t\"system.action.delete.error\": \"Delete failed\",\n\t\t\"system.action.delete.confirm\": \"Are you sure you want to delete this item?\",\n\t\t\"system.action.create.success\": \"Created successfully\",\n\t\t\"system.action.create.error\": \"Create failed\",\n\t\t\"system.action.refresh.error\": \"Failed to refresh\",\n\t\t\"system.validation.required\": \"This field is required\",\n\t\t\"system.validation.minLength\": \"Minimum length is {{min}}\",\n\t\t\"system.validation.maxLength\": \"Maximum length is {{max}}\",\n\t\t\"system.nav.back\": \"Back\",\n\t\t\"system.nav.home\": \"Home\",\n\t\t\"system.session.expired\": \"Session expired\",\n\t\t\"system.session.timeout\": \"Session timeout\",\n\t\t\"system.loading.default\": \"Loading...\",\n\t\t\"system.error.network\": \"Network error\",\n\t\t\"system.error.unknown\": \"An unknown error occurred\",\n\t\t\"system.error.notFound\": \"Not found\",\n\t\t\"system.error.forbidden\": \"Access denied\",\n\t\t\"system.error.unauthorized\": \"Unauthorized\",\n\t\t\"system.empty.noData\": \"No data available\",\n\t\t\"system.empty.noResults\": \"No results found\",\n\t\t\"system.pagination.rowsPerPage\": \"Rows per page\",\n\t\t\"system.pagination.of\": \"of\",\n\t\t\"system.table.noRows\": \"No rows\",\n\t\t\"system.table.filterPlaceholder\": \"Filter...\",\n\t\t\"system.dialog.confirm\": \"Confirm\",\n\t\t\"system.dialog.cancel\": \"Cancel\",\n\t\t\"system.dialog.ok\": \"OK\",\n\t\t\"system.dialog.yes\": \"Yes\",\n\t\t\"system.dialog.no\": \"No\",\n\t\t\"system.dialog.close\": \"Close\",\n\t\t\"system.auth.login\": \"Log in\",\n\t\t\"system.auth.logout\": \"Log out\",\n\t\t\"system.common.save\": \"Save\",\n\t\t\"system.common.cancel\": \"Cancel\",\n\t\t\"system.common.delete\": \"Delete\",\n\t\t\"system.common.create\": \"Create\",\n\t\t\"system.common.edit\": \"Edit\",\n\t\t\"system.common.view\": \"View\",\n\t\t\"system.common.search\": \"Search\",\n\t\t\"system.common.filter\": \"Filter\",\n\t\t\"system.common.refresh\": \"Refresh\",\n\t\t\"system.common.actions\": \"Actions\",\n\t};\n\n\t// Merge system messages\n\tObject.assign(entries, systemMessages);\n\n\t// Sort entries by key for stable, deterministic output\n\tconst sorted = Object.fromEntries(Object.entries(entries).toSorted(([a], [b]) => a.localeCompare(b)));\n\n\treturn `${JSON.stringify(sorted, null, 2)}\\n`;\n}\n\n/**\n * Generate a translation key map: sourceId → human-readable key path.\n *\n * This map is used at runtime by useModelLabel() to look up the correct\n * translation key for a model element. It mirrors the key format used in\n * the generated locale files.\n *\n * Format: `{ \"xmi_id_123\": \"PageIdentifier.path.to.element\" }`\n */\nfunction generateTranslationKeyMap(\n\tpages: ExtractedPage[],\n\tnavigationItems: ExtractedNavigationItem[],\n\tpageIdentifiers: Map<string, string>\n): string {\n\tconst lines: string[] = [\n\t\t\"// AUTO-GENERATED — DO NOT EDIT\",\n\t\t\"// Maps element sourceId (xmi:id) to human-readable translation key.\",\n\t\t\"// Used by useModelLabel() at runtime to resolve translation keys.\",\n\t\t\"\",\n\t\t\"/** @internal */\",\n\t\t\"export const TRANSLATION_KEY_MAP: Record<string, string> = {\",\n\t];\n\n\t// Track seen sourceIds to avoid duplicate keys (same element reused across pages)\n\tconst seen = new Set<string>();\n\n\tfor (const page of pages) {\n\t\tconst pageIdent = pageIdentifiers.get(page.sourceId);\n\t\tif (!pageIdent) continue;\n\n\t\t// Page-level entry (for page title translation)\n\t\tif (!seen.has(page.sourceId)) {\n\t\t\tseen.add(page.sourceId);\n\t\t\tlines.push(` ${JSON.stringify(page.sourceId)}: ${JSON.stringify(pageIdent)},`);\n\t\t}\n\n\t\tfor (const element of page.elements) {\n\t\t\tif (seen.has(element.sourceId)) continue;\n\t\t\tseen.add(element.sourceId);\n\t\t\tconst key = `${pageIdent}.${element.path}`;\n\t\t\tlines.push(` ${JSON.stringify(element.sourceId)}: ${JSON.stringify(key)},`);\n\t\t}\n\t}\n\n\t// Navigation items\n\tfor (const item of navigationItems) {\n\t\tif (seen.has(item.sourceId)) continue;\n\t\tseen.add(item.sourceId);\n\t\tconst navIdent = toNavItemIdentifier(item.name);\n\t\tlines.push(` ${JSON.stringify(item.sourceId)}: ${JSON.stringify(`nav.${navIdent}`)},`);\n\t}\n\n\tlines.push(\"};\");\n\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/(<!DOCTYPE[\\s\\w\\\"\\.\\/\\-\\:]+(\\[.*\\])*\\s*>)/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n\n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n\n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n //don't push into stack\n } else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n } else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\" +\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n \"' found.\", { line: 1, col: 1 });\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char) {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","export const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function (tagName, val) {\n return val;\n },\n attributeValueProcessor: function (attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n};\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false, // default true if not specified\n maxEntitySize: value.maxEntitySize ?? 10000,\n maxExpansionDepth: value.maxExpansionDepth ?? 10,\n maxTotalExpansions: value.maxTotalExpansions ?? 1000,\n maxExpandedLength: value.maxExpandedLength ?? 100000,\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n\n const entities = Object.create(null);\n if (xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E') {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === '[') {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n }\n readEntityExp(xmlData, i) {\n //External entities are not supported\n // <!ENTITY ext SYSTEM \"http://normal-website.com\" >\n\n //Parameter entities are not supported\n // <!ENTITY entityname \"&anotherElement;\">\n\n //Internal entities are supported\n // <!ENTITY entityname \"replacement text\">\n\n // Skip leading whitespace after <!ENTITY\n i = skipWhitespace(xmlData, i);\n\n // Read entity name\n let entityName = \"\";\n while (i < xmlData.length && !/\\s/.test(xmlData[i]) && xmlData[i] !== '\"' && xmlData[i] !== \"'\") {\n entityName += xmlData[i];\n i++;\n }\n validateEntityName(entityName);\n\n // Skip whitespace after entity name\n i = skipWhitespace(xmlData, i);\n\n // Check for unsupported constructs (external entities or parameter entities)\n if (!this.suppressValidationErr) {\n if (xmlData.substring(i, i + 6).toUpperCase() === \"SYSTEM\") {\n throw new Error(\"External entities are not supported\");\n } else if (xmlData[i] === \"%\") {\n throw new Error(\"Parameter entities are not supported\");\n }\n }\n\n // Read entity value (internal entity)\n let entityValue = \"\";\n [i, entityValue] = this.readIdentifierVal(xmlData, i, \"entity\");\n\n // Validate entity size\n if (this.options.enabled !== false &&\n this.options.maxEntitySize &&\n entityValue.length > this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after <!NOTATION\n i = skipWhitespace(xmlData, i);\n\n // Read notation name\n let notationName = \"\";\n while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n notationName += xmlData[i];\n i++;\n }\n !this.suppressValidationErr && validateEntityName(notationName);\n\n // Skip whitespace after notation name\n i = skipWhitespace(xmlData, i);\n\n // Check identifier type (SYSTEM or PUBLIC)\n const identifierType = xmlData.substring(i, i + 6).toUpperCase();\n if (!this.suppressValidationErr && identifierType !== \"SYSTEM\" && identifierType !== \"PUBLIC\") {\n throw new Error(`Expected SYSTEM or PUBLIC, found \"${identifierType}\"`);\n }\n i += identifierType.length;\n\n // Skip whitespace after identifier type\n i = skipWhitespace(xmlData, i);\n\n // Read public identifier (if PUBLIC)\n let publicIdentifier = null;\n let systemIdentifier = null;\n\n if (identifierType === \"PUBLIC\") {\n [i, publicIdentifier] = this.readIdentifierVal(xmlData, i, \"publicIdentifier\");\n\n // Skip whitespace after public identifier\n i = skipWhitespace(xmlData, i);\n\n // Optionally read system identifier\n if (xmlData[i] === '\"' || xmlData[i] === \"'\") {\n [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n }\n } else if (identifierType === \"SYSTEM\") {\n // Read system identifier (mandatory for SYSTEM)\n [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n\n if (!this.suppressValidationErr && !systemIdentifier) {\n throw new Error(\"Missing mandatory system identifier for SYSTEM notation\");\n }\n }\n\n return { notationName, publicIdentifier, systemIdentifier, index: --i };\n }\n\n readIdentifierVal(xmlData, i, type) {\n let identifierVal = \"\";\n const startChar = xmlData[i];\n if (startChar !== '\"' && startChar !== \"'\") {\n throw new Error(`Expected quoted string, found \"${startChar}\"`);\n }\n i++;\n\n while (i < xmlData.length && xmlData[i] !== startChar) {\n identifierVal += xmlData[i];\n i++;\n }\n\n if (xmlData[i] !== startChar) {\n throw new Error(`Unterminated ${type} value`);\n }\n i++;\n return [i, identifierVal];\n }\n\n readElementExp(xmlData, i) {\n // <!ELEMENT br EMPTY>\n // <!ELEMENT div ANY>\n // <!ELEMENT title (#PCDATA)>\n // <!ELEMENT book (title, author+)>\n // <!ELEMENT name (content-model)>\n\n // Skip leading whitespace after <!ELEMENT\n i = skipWhitespace(xmlData, i);\n\n // Read element name\n let elementName = \"\";\n while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n elementName += xmlData[i];\n i++;\n }\n\n // Validate element name\n if (!this.suppressValidationErr && !isName(elementName)) {\n throw new Error(`Invalid element name: \"${elementName}\"`);\n }\n\n // Skip whitespace after element name\n i = skipWhitespace(xmlData, i);\n let contentModel = \"\";\n // Expect '(' to start content model\n if (xmlData[i] === \"E\" && hasSeq(xmlData, \"MPTY\", i)) i += 4;\n else if (xmlData[i] === \"A\" && hasSeq(xmlData, \"NY\", i)) i += 2;\n else if (xmlData[i] === \"(\") {\n i++; // Move past '('\n\n // Read content model\n while (i < xmlData.length && xmlData[i] !== \")\") {\n contentModel += xmlData[i];\n i++;\n }\n if (xmlData[i] !== \")\") {\n throw new Error(\"Unterminated content model\");\n }\n\n } else if (!this.suppressValidationErr) {\n throw new Error(`Invalid Element Expression, found \"${xmlData[i]}\"`);\n }\n\n return {\n elementName,\n contentModel: contentModel.trim(),\n index: i\n };\n }\n\n readAttlistExp(xmlData, i) {\n // Skip leading whitespace after <!ATTLIST\n i = skipWhitespace(xmlData, i);\n\n // Read element name\n let elementName = \"\";\n while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n elementName += xmlData[i];\n i++;\n }\n\n // Validate element name\n validateEntityName(elementName)\n\n // Skip whitespace after element name\n i = skipWhitespace(xmlData, i);\n\n // Read attribute name\n let attributeName = \"\";\n while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n attributeName += xmlData[i];\n i++;\n }\n\n // Validate attribute name\n if (!validateEntityName(attributeName)) {\n throw new Error(`Invalid attribute name: \"${attributeName}\"`);\n }\n\n // Skip whitespace after attribute name\n i = skipWhitespace(xmlData, i);\n\n // Read attribute type\n let attributeType = \"\";\n if (xmlData.substring(i, i + 8).toUpperCase() === \"NOTATION\") {\n attributeType = \"NOTATION\";\n i += 8; // Move past \"NOTATION\"\n\n // Skip whitespace after \"NOTATION\"\n i = skipWhitespace(xmlData, i);\n\n // Expect '(' to start the list of notations\n if (xmlData[i] !== \"(\") {\n throw new Error(`Expected '(', found \"${xmlData[i]}\"`);\n }\n i++; // Move past '('\n\n // Read the list of allowed notations\n let allowedNotations = [];\n while (i < xmlData.length && xmlData[i] !== \")\") {\n let notation = \"\";\n while (i < xmlData.length && xmlData[i] !== \"|\" && xmlData[i] !== \")\") {\n notation += xmlData[i];\n i++;\n }\n\n // Validate notation name\n notation = notation.trim();\n if (!validateEntityName(notation)) {\n throw new Error(`Invalid notation name: \"${notation}\"`);\n }\n\n allowedNotations.push(notation);\n\n // Skip '|' separator or exit loop\n if (xmlData[i] === \"|\") {\n i++; // Move past '|'\n i = skipWhitespace(xmlData, i); // Skip optional whitespace after '|'\n }\n }\n\n if (xmlData[i] !== \")\") {\n throw new Error(\"Unterminated list of notations\");\n }\n i++; // Move past ')'\n\n // Store the allowed notations as part of the attribute type\n attributeType += \" (\" + allowedNotations.join(\"|\") + \")\";\n } else {\n // Handle simple types (e.g., CDATA, ID, IDREF, etc.)\n while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n attributeType += xmlData[i];\n i++;\n }\n\n // Validate simple attribute type\n const validTypes = [\"CDATA\", \"ID\", \"IDREF\", \"IDREFS\", \"ENTITY\", \"ENTITIES\", \"NMTOKEN\", \"NMTOKENS\"];\n if (!this.suppressValidationErr && !validTypes.includes(attributeType.toUpperCase())) {\n throw new Error(`Invalid attribute type: \"${attributeType}\"`);\n }\n }\n\n // Skip whitespace after attribute type\n i = skipWhitespace(xmlData, i);\n\n // Read default value\n let defaultValue = \"\";\n if (xmlData.substring(i, i + 8).toUpperCase() === \"#REQUIRED\") {\n defaultValue = \"#REQUIRED\";\n i += 8;\n } else if (xmlData.substring(i, i + 7).toUpperCase() === \"#IMPLIED\") {\n defaultValue = \"#IMPLIED\";\n i += 7;\n } else {\n [i, defaultValue] = this.readIdentifierVal(xmlData, i, \"ATTLIST\");\n }\n\n return {\n elementName,\n attributeName,\n attributeType,\n defaultValue,\n index: i\n }\n }\n}\n\n\n\nconst skipWhitespace = (data, index) => {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n hex: true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/,\n infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n\n let trimmedStr = str.trim();\n\n if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (str === \"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n } else if (!isFinite(trimmedStr)) { //Infinity\n return handleInfinity(str, Number(trimmedStr), options);\n } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str, trimmedStr, options);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n } else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n // +00.123 => [ , '+', '00', '.123', ..\n if (match) {\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length + 1] === \".\"\n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if (!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1\n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if (num === 0) return num;\n if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n if (parsedStr === \"0\") return num; //0.0\n else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n\n let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n if (leadingZeros) {\n // -009 => -9\n return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n } else {\n // +9\n return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n }\n }\n } else { //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n if (!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx);\n if (notation) {\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length + 1] === eChar\n : str[leadingZeros.length] === eChar;\n\n if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if (leadingZeros.length === 1\n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n return Number(trimmedStr);\n } else if (options.leadingZeros && !eAdjacentToLeadingZeros) { //accept with leading zeros\n //remove leading 0s\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n } else return str;\n } else {\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base) {\n //polyfill\n if (parseInt) return parseInt(numStr, base);\n else if (Number.parseInt) return Number.parseInt(numStr, base);\n else if (window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n const isPositive = num === Infinity;\n\n switch (options.infinity.toLowerCase()) {\n case \"null\":\n return null;\n case \"infinity\":\n return num; // Return Infinity or -Infinity\n case \"string\":\n return isPositive ? \"Infinity\" : \"-Infinity\";\n case \"original\":\n default:\n return str; // Return original string like \"1e1000\"\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\": { regex: /&(apos|#39|#x27);/g, val: \"'\" },\n \"gt\": { regex: /&(gt|#62|#x3E);/g, val: \">\" },\n \"lt\": { regex: /&(lt|#60|#x3C);/g, val: \"<\" },\n \"quot\": { regex: /&(quot|#34|#x22);/g, val: \"\\\"\" },\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val: \"&\" };\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\": { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\": { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\": { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\": { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\": { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\": { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\": { regex: /&(inr|#8377);/g, val: \"₹\" },\n \"num_dec\": { regex: /&#([0-9]{1,7});/g, val: (_, str) => fromCodePoint(str, 10, \"&#\") },\n \"num_hex\": { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_, str) => fromCodePoint(str, 16, \"&#x\") },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n if (this.options.stopNodes && this.options.stopNodes.length > 0) {\n this.stopNodesExact = new Set();\n this.stopNodesWildcard = new Set();\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const stopNodeExp = this.options.stopNodes[i];\n if (typeof stopNodeExp !== 'string') continue;\n if (stopNodeExp.startsWith(\"*.\")) {\n this.stopNodesWildcard.add(stopNodeExp.substring(2));\n } else {\n this.stopNodesExact.add(stopNodeExp);\n }\n }\n }\n }\n\n}\n\nfunction addExternalEntities(externalEntities) {\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n const escaped = ent.replace(/[.\\-+*:]/g, '\\\\.');\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\" + escaped + \";\", \"g\"),\n val: externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if (val.length > 0) {\n if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if (newval === null || newval === undefined) {\n //don't parse\n return val;\n } else if (typeof newval !== typeof val || newval !== val) {\n //overwrite\n return newval;\n } else if (this.options.trimValues) {\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n const trimmedVal = val.trim();\n if (trimmedVal === val) {\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n } else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (this.options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n if (this.ignoreAttributesFn(attrName, jPath)) {\n continue\n }\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if (aName === \"__proto__\") aName = \"#__proto__\";\n\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal, tagName, jPath);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if (newVal === null || newVal === undefined) {\n //don't parse\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n //overwrite\n attrs[aName] = newVal;\n } else {\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function (xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n const docTypeReader = new DocTypeReader(this.options.processEntities);\n for (let i = 0; i < xmlData.length; i++) {//for each char in XML data\n const ch = xmlData[i];\n if (ch === '<') {\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if (xmlData[i + 1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n if (this.options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\") + 1);\n if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) {\n throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n }\n let propIndex = 0\n if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) {\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.') - 1)\n this.tagsNodeStack.pop();\n } else {\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if ((this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags) {\n //do nothing\n } else {\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n if (this.options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [{ [this.options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (xmlData.substr(i + 1, 2) === '!D') {\n const result = docTypeReader.readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (this.options.cdataPropName) {\n currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(this.options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, this.options.removeNSPrefix);\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n //console.log(tagExp, tagName)\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n if (this.options.strictReservedNames &&\n (tagName === this.options.commentPropName\n || tagName === this.options.cdataPropName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n //save text as child node\n if (currentNode && textData) {\n if (currentNode.tagname !== '!xml') {\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if (lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1) {\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if (tagName !== xmlObj.tagname) {\n jPath += jPath ? \".\" + tagName : tagName;\n }\n const startIndex = i;\n if (this.isItStopNode(this.stopNodesExact, this.stopNodesWildcard, jPath, tagName)) {\n let tagContent = \"\";\n //self-closing tag\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") { //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n i = result.closeIndex;\n }\n //unpaired tag\n else if (this.options.unpairedTags.indexOf(tagName) !== -1) {\n\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if (tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n\n this.addChild(currentNode, childNode, jPath, startIndex);\n } else {\n //selfClosing tag\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n if (tagName[tagName.length - 1] === \"/\") { //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n jPath = jPath.substr(0, jPath.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n if (this.options.transformTagName) {\n const newTagName = this.options.transformTagName(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n\n const childNode = new xmlNode(tagName);\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){//unpaired tag\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (tagName !== tagExp && attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\nconst replaceEntitiesValue = function (val, tagName, jPath) {\n // Performance optimization: Early return if no entities to replace\n if (val.indexOf('&') === -1) {\n return val;\n }\n\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig.enabled) {\n return val;\n }\n\n // Check tag-specific filtering\n if (entityConfig.allowedTags) {\n if (!entityConfig.allowedTags.includes(tagName)) {\n return val; // Skip entity replacement for current tag as not set\n }\n }\n\n if (entityConfig.tagFilter) {\n if (!entityConfig.tagFilter(tagName, jPath)) {\n return val; // Skip based on custom filter\n }\n }\n\n // Replace DOCTYPE entities\n for (let entityName in this.docTypeEntities) {\n const entity = this.docTypeEntities[entityName];\n const matches = val.match(entity.regx);\n\n if (matches) {\n // Track expansions\n this.entityExpansionCount += matches.length;\n\n // Check expansion limit\n if (entityConfig.maxTotalExpansions &&\n this.entityExpansionCount > entityConfig.maxTotalExpansions) {\n throw new Error(\n `Entity expansion limit exceeded: ${this.entityExpansionCount} > ${entityConfig.maxTotalExpansions}`\n );\n }\n\n // Store length before replacement\n const lengthBefore = val.length;\n val = val.replace(entity.regx, entity.val);\n\n // Check expanded length immediately after replacement\n if (entityConfig.maxExpandedLength) {\n this.currentExpandedLength += (val.length - lengthBefore);\n\n if (this.currentExpandedLength > entityConfig.maxExpandedLength) {\n throw new Error(\n `Total expanded content size exceeded: ${this.currentExpandedLength} > ${entityConfig.maxExpandedLength}`\n );\n }\n }\n }\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace standard entities\n for (let entityName in this.lastEntities) {\n const entity = this.lastEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n if (val.indexOf('&') === -1) return val; // Early exit\n\n // Replace HTML entities if enabled\n if (this.options.htmlEntities) {\n for (let entityName in this.htmlEntities) {\n const entity = this.htmlEntities[entityName];\n val = val.replace(entity.regex, entity.val);\n }\n }\n\n // Replace ampersand entity last\n val = val.replace(this.ampEntity.regex, this.ampEntity.val);\n\n return val;\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n jPath,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * @param {Set} stopNodesExact\n * @param {Set} stopNodesWildcard\n * @param {string} jPath\n * @param {string} currentTagName\n */\nfunction isItStopNode(stopNodesExact, stopNodesWildcard, jPath, currentTagName) {\n if (stopNodesWildcard && stopNodesWildcard.has(currentTagName)) return true;\n if (stopNodesExact && stopNodesExact.has(jPath)) return true;\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if (closingChar[1]) {\n if (xmlData[index + 1] === closingChar[1]) {\n return {\n data: tagExp,\n index: index\n }\n }\n } else {\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg)\n } else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === \"<\") {\n if (xmlData[i + 1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (xmlData[i + 1] === '?') {\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 3) === '!--') {\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if (newval === 'true') return true;\n else if (newval === 'false') return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nexport default function prettify(node, options) {\n return compress(node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if (jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if (property === options.textNodeName) {\n if (text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === undefined) {\n continue;\n } else if (tagObj[property]) {\n\n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], newJpath, options);\n } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n val = val[options.textNodeName];\n } else if (Object.keys(val).length === 0) {\n if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val);\n } else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n }\n\n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n return compressedObj;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\n","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\")\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '
'\")\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}\n","/**\n * Model reader — extracts structured data from .model XML files\n * for use by the code generator.\n *\n * Uses fast-xml-parser for lightweight XML extraction.\n */\n\nimport { XMLParser } from \"fast-xml-parser\";\n\n// ============================================\n// EXTRACTED MODEL TYPES\n// ============================================\n\nexport interface ExtractedModel {\n\t/** All applications (actors) found in the model */\n\tapplications: ExtractedApplication[];\n\t/** All unique pages across all applications */\n\tpages: ExtractedPage[];\n\t/** All elements with customImplementation=\"true\" */\n\tcomponents: ExtractedComponent[];\n\t/** Navigation items extracted for translation key generation */\n\tnavigationItems: ExtractedNavigationItem[];\n\t/** All unique subTheme names found on visual elements */\n\tsubThemeNames: string[];\n\t/** All data types (primitives + enumerations) from the model */\n\tdataTypes: ExtractedDataType[];\n\t/** All transfer types (ClassType data elements) from the model */\n\ttransferTypes: ExtractedTransferType[];\n}\n\nexport interface ExtractedApplication {\n\tname: string;\n\tsourceId: string;\n}\n\nexport interface ExtractedPage {\n\t/** Human-readable page name from the model */\n\tname: string;\n\t/** The xmi:id (sourceId) of the PageDefinition */\n\tsourceId: string;\n\t/** Application this page belongs to */\n\tapplicationName: string;\n\t/** The label from the model (for translation baseline generation) */\n\tlabel?: string;\n\t/** Whether this page opens in a dialog */\n\topenInDialog: boolean;\n\t/** Whether this is a dashboard page */\n\tdashboard: boolean;\n\t/** Container type (TABLE, FORM, VIEW) */\n\tcontainerType?: string;\n\t/** Actions available on this page */\n\tactions: ExtractedAction[];\n\t/** Named elements on this page (for visual property overrides) */\n\telements: ExtractedElement[];\n}\n\nexport interface ExtractedAction {\n\t/** Human-readable action name from the model */\n\tname: string;\n\t/** The xmi:id (sourceId) of the Action */\n\tsourceId: string;\n\t/** The @type of the ActionDefinition (e.g., \"DeleteActionDefinition\") */\n\tactionDefinitionType: string;\n\t/** The xmi:id of the ActionDefinition */\n\tactionDefinitionSourceId: string;\n}\n\nexport interface ExtractedComponent {\n\t/** Human-readable element name from the model */\n\tname: string;\n\t/** The xmi:id (sourceId) of the VisualElement */\n\tsourceId: string;\n\t/** The @type of the VisualElement (e.g., \"Flex\") */\n\telementType: string;\n\t/** Page this component belongs to (for context) */\n\tpageName?: string;\n\t/** Resolved annotation names on this element (e.g. [\"useFancyText\"]) */\n\tannotations?: string[];\n}\n\nexport interface ExtractedNavigationItem {\n\t/** Human-readable name from the model */\n\tname: string;\n\t/** The xmi:id of the navigation item */\n\tsourceId: string;\n\t/** The display label */\n\tlabel?: string;\n}\n\nexport interface ExtractedElement {\n\t/** Human-readable element name */\n\tname: string;\n\t/** Hierarchical dot-separated path from container root (e.g. \"View.group.stars\") */\n\tpath: string;\n\t/** The xmi:id (sourceId) */\n\tsourceId: string;\n\t/** The @type of the VisualElement */\n\telementType: string;\n\t/** The label from the model (for translation baseline generation) */\n\tlabel?: string;\n\t/** Resolved annotation names on this element (e.g. [\"useFancyText\", \"dashboard\"]) */\n\tannotations?: string[];\n}\n\nexport interface ExtractedDataType {\n\t/** xmi:id of the data type */\n\txmiId: string;\n\t/** xsi:type (e.g., \"data:StringType\", \"data:NumericType\") */\n\txsiType: string;\n\t/** Name from the model (e.g., \"types::String\", \"Gender\") */\n\tname: string;\n\t/** For EnumerationType: member value names (e.g., [\"MALE\", \"FEMALE\"]) */\n\tmembers?: string[];\n}\n\nexport interface ExtractedTransferAttribute {\n\t/** Attribute name (e.g., \"city\", \"name\") */\n\tname: string;\n\t/** Reference to the data type xmi:id */\n\tdataTypeRef: string;\n\t/** Whether the attribute is read-only */\n\tisReadOnly: boolean;\n\t/** Whether the attribute is required */\n\tisRequired: boolean;\n}\n\nexport interface ExtractedTransferRelation {\n\t/** Relation name (e.g., \"country\", \"items\") */\n\tname: string;\n\t/** Reference to the target ClassType xmi:id */\n\ttargetRef: string;\n\t/** Whether this is a collection relation */\n\tisCollection: boolean;\n}\n\nexport interface ExtractedTransferType {\n\t/** The DTO name (e.g., \"AddressDTO\", \"OrderDTO\") */\n\tname: string;\n\t/** xmi:id of the ClassType */\n\txmiId: string;\n\t/** Whether this is an actor type */\n\tisActor: boolean;\n\t/** Attributes on this type */\n\tattributes: ExtractedTransferAttribute[];\n\t/** Relations to other ClassTypes */\n\trelations: ExtractedTransferRelation[];\n}\n\n// ============================================\n// XML PARSING\n// ============================================\n\ninterface XmlElement {\n\t\"@_xmi:id\"?: string;\n\t\"@_xsi:type\"?: string;\n\t\"@_name\"?: string;\n\t\"@_label\"?: string;\n\t\"@_customImplementation\"?: string;\n\t\"@_openInDialog\"?: string;\n\t\"@_dashboard\"?: string;\n\t\"@_type\"?: string;\n\t\"@_container\"?: string;\n\t\"@_actionDefinition\"?: string;\n\t\"@_actor\"?: string;\n\t\"@_principal\"?: string;\n\t\"@_modelName\"?: string;\n\t\"@_annotations\"?: string;\n\t\"@_subTheme\"?: string;\n\t\"@_isActor\"?: string;\n\t\"@_dataType\"?: string;\n\t\"@_isReadOnly\"?: string;\n\t\"@_isRequired\"?: string;\n\t\"@_target\"?: string;\n\t\"@_isCollection\"?: string;\n\t\"@_ordinal\"?: string;\n\tactions?: XmlElement | XmlElement[];\n\tavailableAnnotations?: XmlElement | XmlElement[];\n\tpages?: XmlElement | XmlElement[];\n\tpageContainers?: XmlElement | XmlElement[];\n\tdataElements?: XmlElement | XmlElement[];\n\tdataTypes?: XmlElement | XmlElement[];\n\tattributes?: XmlElement | XmlElement[];\n\trelations?: XmlElement | XmlElement[];\n\tmembers?: XmlElement | XmlElement[];\n\tchildren?: XmlElement | XmlElement[];\n\tnavigationController?: XmlElement;\n\t[key: string]: unknown;\n}\n\n/**\n * Extract model information from XML content.\n * This does a lightweight parse focused on what the codegen needs:\n * pages, actions, and customImplementation elements.\n */\nexport function extractModel(xmlContent: string): ExtractedModel {\n\tconst parser = new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"@_\",\n\t\tisArray: (name: string) => {\n\t\t\treturn [\n\t\t\t\t\"pages\",\n\t\t\t\t\"actions\",\n\t\t\t\t\"pageContainers\",\n\t\t\t\t\"children\",\n\t\t\t\t\"items\",\n\t\t\t\t\"columns\",\n\t\t\t\t\"buttons\",\n\t\t\t\t\"filters\",\n\t\t\t\t\"actionButtonGroups\",\n\t\t\t\t\"availableAnnotations\",\n\t\t\t\t\"dataElements\",\n\t\t\t\t\"dataTypes\",\n\t\t\t\t\"attributes\",\n\t\t\t\t\"relations\",\n\t\t\t\t\"members\",\n\t\t\t].includes(name);\n\t\t},\n\t});\n\n\tconst parsed = parser.parse(xmlContent);\n\n\t// Handle both single-app and multi-app (xmi:XMI wrapper) formats\n\tconst root = parsed[\"xmi:XMI\"] ?? parsed;\n\tconst appElements: XmlElement[] = [];\n\n\tif (root[\"ui:Application\"]) {\n\t\tconst apps = Array.isArray(root[\"ui:Application\"]) ? root[\"ui:Application\"] : [root[\"ui:Application\"]];\n\t\tappElements.push(...apps);\n\t}\n\n\tconst model: ExtractedModel = {\n\t\tapplications: [],\n\t\tpages: [],\n\t\tcomponents: [],\n\t\tnavigationItems: [],\n\t\tsubThemeNames: [],\n\t\tdataTypes: [],\n\t\ttransferTypes: [],\n\t};\n\n\t// Collect unique subTheme names across all elements\n\tconst subThemeSet = new Set<string>();\n\n\t// Index all pageContainers by xmi:id for lookup\n\tconst containerIndex = new Map<string, XmlElement>();\n\n\t// Build annotation resolution map: xmi:id → annotation name (across all applications)\n\tconst annotationMap = new Map<string, string>();\n\n\tfor (const app of appElements) {\n\t\t// Index page containers\n\t\tconst containers = ensureArray(app.pageContainers);\n\t\tfor (const container of containers) {\n\t\t\tconst id = container[\"@_xmi:id\"];\n\t\t\tif (id) {\n\t\t\t\tcontainerIndex.set(id, container);\n\t\t\t}\n\t\t}\n\n\t\t// Index available annotations\n\t\tconst annotations = ensureArray(app.availableAnnotations);\n\t\tfor (const ann of annotations) {\n\t\t\tconst annId = ann[\"@_xmi:id\"];\n\t\t\tconst annName = ann[\"@_name\"];\n\t\t\tif (annId && annName) {\n\t\t\t\tannotationMap.set(annId, annName);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const app of appElements) {\n\t\tconst appName = app[\"@_name\"] ?? \"UnknownApp\";\n\t\tconst appSourceId = app[\"@_xmi:id\"] ?? \"\";\n\n\t\tmodel.applications.push({\n\t\t\tname: appName,\n\t\t\tsourceId: appSourceId,\n\t\t});\n\n\t\t// Extract pages\n\t\tconst pages = ensureArray(app.pages);\n\t\tfor (const page of pages) {\n\t\t\tconst pageName = page[\"@_name\"];\n\t\t\tconst pageSourceId = page[\"@_xmi:id\"];\n\t\t\tif (!pageName || !pageSourceId) continue;\n\n\t\t\t// Resolve container to get type and elements\n\t\t\tconst containerRef = page[\"@_container\"];\n\t\t\tconst container = containerRef ? containerIndex.get(containerRef) : undefined;\n\t\t\tconst containerType = container?.[\"@_type\"];\n\n\t\t\t// Extract actions\n\t\t\tconst actions: ExtractedAction[] = [];\n\t\t\tconst pageActions = ensureArray(page.actions);\n\t\t\tfor (const action of pageActions) {\n\t\t\t\tconst actionName = action[\"@_name\"];\n\t\t\t\tconst actionSourceId = action[\"@_xmi:id\"];\n\t\t\t\tconst actionDefRef = action[\"@_actionDefinition\"];\n\t\t\t\tif (!actionName || !actionSourceId) continue;\n\n\t\t\t\t// Resolve action definition type from the reference\n\t\t\t\tconst actionDefType = resolveActionDefinitionType(actionDefRef ?? \"\");\n\n\t\t\t\tactions.push({\n\t\t\t\t\tname: actionName,\n\t\t\t\t\tsourceId: actionSourceId,\n\t\t\t\t\tactionDefinitionType: actionDefType,\n\t\t\t\t\tactionDefinitionSourceId: actionDefRef ?? \"\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Extract named elements from the container\n\t\t\tconst elements: ExtractedElement[] = [];\n\t\t\tconst components: ExtractedComponent[] = [];\n\t\t\tif (container) {\n\t\t\t\tcollectElements(container, elements, components, pageName, \"\", subThemeSet, annotationMap);\n\t\t\t}\n\n\t\t\t// Add components found in this page's container\n\t\t\tfor (const comp of components) {\n\t\t\t\tmodel.components.push(comp);\n\t\t\t}\n\n\t\t\tmodel.pages.push({\n\t\t\t\tname: pageName,\n\t\t\t\tsourceId: pageSourceId,\n\t\t\t\tapplicationName: appName,\n\t\t\t\tlabel: page[\"@_label\"] as string | undefined,\n\t\t\t\topenInDialog: page[\"@_openInDialog\"] === \"true\",\n\t\t\t\tdashboard: page[\"@_dashboard\"] === \"true\",\n\t\t\t\tcontainerType,\n\t\t\t\tactions,\n\t\t\t\telements,\n\t\t\t});\n\t\t}\n\n\t\t// Extract navigation items\n\t\tconst navController = app.navigationController;\n\t\tif (navController) {\n\t\t\tconst items = ensureArray((navController as Record<string, unknown>).items as XmlElement | XmlElement[]);\n\t\t\tfor (const item of items) {\n\t\t\t\tconst itemName = item[\"@_name\"];\n\t\t\t\tconst itemSourceId = item[\"@_xmi:id\"];\n\t\t\t\tconst itemLabel = item[\"@_label\"];\n\t\t\t\tif (itemName && itemSourceId) {\n\t\t\t\t\tmodel.navigationItems.push({\n\t\t\t\t\t\tname: itemName,\n\t\t\t\t\t\tsourceId: itemSourceId,\n\t\t\t\t\t\tlabel: itemLabel,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Extract data types (StringType, NumericType, BooleanType, DateType, EnumerationType, etc.)\n\t\tconst xmlDataTypes = ensureArray(app.dataTypes);\n\t\tfor (const dt of xmlDataTypes) {\n\t\t\tconst dtId = dt[\"@_xmi:id\"];\n\t\t\tconst dtType = dt[\"@_xsi:type\"];\n\t\t\tconst dtName = dt[\"@_name\"];\n\t\t\tif (!dtId || !dtType || !dtName) continue;\n\n\t\t\tconst extracted: ExtractedDataType = {\n\t\t\t\txmiId: dtId,\n\t\t\t\txsiType: dtType,\n\t\t\t\tname: dtName,\n\t\t\t};\n\n\t\t\t// For EnumerationType, extract member names\n\t\t\tif (dtType === \"data:EnumerationType\") {\n\t\t\t\tconst xmlMembers = ensureArray(dt.members);\n\t\t\t\tif (xmlMembers.length > 0) {\n\t\t\t\t\textracted.members = xmlMembers.map((m) => m[\"@_name\"]).filter((n): n is string => typeof n === \"string\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmodel.dataTypes.push(extracted);\n\t\t}\n\n\t\t// Extract transfer types (ClassType data elements)\n\t\tconst xmlDataElements = ensureArray(app.dataElements);\n\t\tfor (const de of xmlDataElements) {\n\t\t\tconst deType = de[\"@_xsi:type\"];\n\t\t\tif (deType !== \"data:ClassType\") continue;\n\n\t\t\tconst deId = de[\"@_xmi:id\"];\n\t\t\tconst deName = de[\"@_name\"];\n\t\t\tif (!deId || !deName) continue;\n\n\t\t\tconst attributes: ExtractedTransferAttribute[] = [];\n\t\t\tconst xmlAttrs = ensureArray(de.attributes);\n\t\t\tfor (const attr of xmlAttrs) {\n\t\t\t\tconst attrName = attr[\"@_name\"];\n\t\t\t\tconst attrDataType = attr[\"@_dataType\"];\n\t\t\t\tif (!attrName || !attrDataType) continue;\n\n\t\t\t\tattributes.push({\n\t\t\t\t\tname: attrName,\n\t\t\t\t\tdataTypeRef: attrDataType,\n\t\t\t\t\tisReadOnly: attr[\"@_isReadOnly\"] === \"true\",\n\t\t\t\t\tisRequired: attr[\"@_isRequired\"] === \"true\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst relations: ExtractedTransferRelation[] = [];\n\t\t\tconst xmlRelations = ensureArray(de.relations);\n\t\t\tfor (const rel of xmlRelations) {\n\t\t\t\tconst relName = rel[\"@_name\"];\n\t\t\t\tconst relTarget = rel[\"@_target\"];\n\t\t\t\tif (!relName || !relTarget) continue;\n\n\t\t\t\trelations.push({\n\t\t\t\t\tname: relName,\n\t\t\t\t\ttargetRef: relTarget,\n\t\t\t\t\tisCollection: rel[\"@_isCollection\"] !== \"false\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tmodel.transferTypes.push({\n\t\t\t\tname: deName,\n\t\t\t\txmiId: deId,\n\t\t\t\tisActor: de[\"@_isActor\"] === \"true\",\n\t\t\t\tattributes,\n\t\t\t\trelations,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Assign collected subTheme names (sorted for deterministic output)\n\tmodel.subThemeNames = [...subThemeSet].toSorted();\n\n\treturn model;\n}\n\n/**\n * Recursively collect named elements and customImplementation elements from a container.\n * Builds hierarchical dot-separated paths (e.g. \"View.group.stars\") to guarantee uniqueness.\n *\n * Traverses:\n * - `<children>` — standard visual element children (recursive)\n * - `<columns>` — table column headers\n * - `<buttons>` — buttons directly on an element (e.g., Link buttons)\n * - `<tableActionButtonGroup>` → `<buttons>` — table toolbar buttons\n * - `<rowActionButtonGroup>` → `<buttons>` — table row action buttons\n * - `<actionButtonGroups>` → `<buttons>` — container-level page action buttons\n * - `<filters>` — table column filter labels\n */\nfunction collectElements(\n\telement: XmlElement,\n\telements: ExtractedElement[],\n\tcomponents: ExtractedComponent[],\n\tpageName: string,\n\tparentPath: string,\n\tsubThemeSet?: Set<string>,\n\tannotationMap?: Map<string, string>\n): void {\n\t// --- Standard <children> (recursive) ---\n\tconst children = ensureArray(element.children);\n\tfor (const child of children) {\n\t\tconst name = child[\"@_name\"];\n\t\tconst sourceId = child[\"@_xmi:id\"];\n\t\tconst type = child[\"@_xsi:type\"]?.replace(\"ui:\", \"\") ?? inferType(child);\n\n\t\tconst childPath = name ? (parentPath ? `${parentPath}.${name}` : name) : parentPath;\n\n\t\t// Resolve annotations from xmi:id references\n\t\tconst resolvedAnnotations = resolveAnnotations(child[\"@_annotations\"], annotationMap);\n\n\t\tif (name && sourceId) {\n\t\t\telements.push({\n\t\t\t\tname,\n\t\t\t\tpath: childPath,\n\t\t\t\tsourceId,\n\t\t\t\telementType: type,\n\t\t\t\tlabel: child[\"@_label\"],\n\t\t\t\t...(resolvedAnnotations.length > 0 ? { annotations: resolvedAnnotations } : {}),\n\t\t\t});\n\n\t\t\tif (child[\"@_customImplementation\"] === \"true\") {\n\t\t\t\tcomponents.push({\n\t\t\t\t\tname,\n\t\t\t\t\tsourceId,\n\t\t\t\t\telementType: type,\n\t\t\t\t\tpageName,\n\t\t\t\t\t...(resolvedAnnotations.length > 0 ? { annotations: resolvedAnnotations } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Collect subTheme values\n\t\tconst subTheme = child[\"@_subTheme\"] as string | undefined;\n\t\tif (subTheme && subThemeSet) {\n\t\t\tsubThemeSet.add(subTheme);\n\t\t}\n\n\t\t// Recurse into children\n\t\tcollectElements(child, elements, components, pageName, childPath, subThemeSet, annotationMap);\n\t}\n\n\t// --- Table <columns> ---\n\tconst columns = ensureArray(element.columns as XmlElement | XmlElement[]);\n\tfor (const col of columns) {\n\t\tconst name = col[\"@_name\"];\n\t\tconst sourceId = col[\"@_xmi:id\"];\n\t\tif (name && sourceId) {\n\t\t\tconst path = parentPath ? `${parentPath}.${name}` : name;\n\t\t\telements.push({\n\t\t\t\tname,\n\t\t\t\tpath,\n\t\t\t\tsourceId,\n\t\t\t\telementType: \"Column\",\n\t\t\t\tlabel: col[\"@_label\"],\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Table <filters> ---\n\tconst filters = ensureArray(element.filters as XmlElement | XmlElement[]);\n\tfor (const filter of filters) {\n\t\tconst name = filter[\"@_name\"];\n\t\tconst sourceId = filter[\"@_xmi:id\"];\n\t\tif (name && sourceId) {\n\t\t\t// Filter names are like \"firstName::Filter\" — extract the column name prefix\n\t\t\tconst filterName = getFilterName(name);\n\t\t\tconst path = parentPath ? `${parentPath}.filters.${filterName}` : `filters.${filterName}`;\n\t\t\telements.push({\n\t\t\t\tname: filterName,\n\t\t\t\tpath,\n\t\t\t\tsourceId,\n\t\t\t\telementType: \"Filter\",\n\t\t\t\tlabel: filter[\"@_label\"],\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Direct <buttons> on the element (e.g., Link buttons) ---\n\tconst directButtons = ensureArray(element.buttons as XmlElement | XmlElement[]);\n\tfor (const btn of directButtons) {\n\t\tconst rawName = btn[\"@_name\"];\n\t\tconst sourceId = btn[\"@_xmi:id\"];\n\t\tif (rawName && sourceId) {\n\t\t\tconst shortName = getShortName(rawName);\n\t\t\tconst path = parentPath ? `${parentPath}.${shortName}` : shortName;\n\t\t\telements.push({\n\t\t\t\tname: shortName,\n\t\t\t\tpath,\n\t\t\t\tsourceId,\n\t\t\t\telementType: \"Button\",\n\t\t\t\tlabel: btn[\"@_label\"],\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- <tableActionButtonGroup> → <buttons> (table toolbar) ---\n\tconst tableActionBtnGroup = element.tableActionButtonGroup as XmlElement | undefined;\n\tif (tableActionBtnGroup) {\n\t\tconst groupPath = parentPath ? `${parentPath}.tableActions` : \"tableActions\";\n\t\tconst groupButtons = ensureArray(tableActionBtnGroup.buttons as XmlElement | XmlElement[]);\n\t\tfor (const btn of groupButtons) {\n\t\t\tconst rawName = btn[\"@_name\"];\n\t\t\tconst sourceId = btn[\"@_xmi:id\"];\n\t\t\tif (rawName && sourceId) {\n\t\t\t\tconst shortName = getShortName(rawName);\n\t\t\t\tconst path = `${groupPath}.${shortName}`;\n\t\t\t\telements.push({\n\t\t\t\t\tname: shortName,\n\t\t\t\t\tpath,\n\t\t\t\t\tsourceId,\n\t\t\t\t\telementType: \"Button\",\n\t\t\t\t\tlabel: btn[\"@_label\"],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- <rowActionButtonGroup> → <buttons> (table row actions) ---\n\tconst rowActionBtnGroup = element.rowActionButtonGroup as XmlElement | undefined;\n\tif (rowActionBtnGroup) {\n\t\tconst groupPath = parentPath ? `${parentPath}.rowActions` : \"rowActions\";\n\t\tconst groupButtons = ensureArray(rowActionBtnGroup.buttons as XmlElement | XmlElement[]);\n\t\tfor (const btn of groupButtons) {\n\t\t\tconst rawName = btn[\"@_name\"];\n\t\t\tconst sourceId = btn[\"@_xmi:id\"];\n\t\t\tif (rawName && sourceId) {\n\t\t\t\tconst shortName = getShortName(rawName);\n\t\t\t\tconst path = `${groupPath}.${shortName}`;\n\t\t\t\telements.push({\n\t\t\t\t\tname: shortName,\n\t\t\t\t\tpath,\n\t\t\t\t\tsourceId,\n\t\t\t\t\telementType: \"Button\",\n\t\t\t\t\tlabel: btn[\"@_label\"],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- <actionButtonGroups> → <buttons> (container-level page action buttons) ---\n\tconst actionButtonGroups = ensureArray(element.actionButtonGroups as XmlElement | XmlElement[]);\n\tfor (const group of actionButtonGroups) {\n\t\tconst groupButtons = ensureArray(group.buttons as XmlElement | XmlElement[]);\n\t\tfor (const btn of groupButtons) {\n\t\t\tconst rawName = btn[\"@_name\"];\n\t\t\tconst sourceId = btn[\"@_xmi:id\"];\n\t\t\tif (rawName && sourceId) {\n\t\t\t\tconst shortName = getShortName(rawName);\n\t\t\t\tconst path = parentPath ? `${parentPath}.${shortName}` : shortName;\n\t\t\t\telements.push({\n\t\t\t\t\tname: shortName,\n\t\t\t\t\tpath,\n\t\t\t\t\tsourceId,\n\t\t\t\t\telementType: \"Button\",\n\t\t\t\t\tlabel: btn[\"@_label\"],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Extract the short (last) segment from a `::` qualified name.\n * e.g., `\"AddressDTO::Table::Table::Filter\"` → `\"Filter\"`\n */\nfunction getShortName(qualifiedName: string): string {\n\tconst parts = qualifiedName.split(\"::\");\n\treturn parts[parts.length - 1];\n}\n\n/**\n * Extract the column name from a filter qualified name.\n * Filter names follow the pattern `\"columnName::Filter\"` — we want `\"columnName\"`.\n * Falls back to the full name if `::Filter` suffix is not present.\n */\nfunction getFilterName(qualifiedName: string): string {\n\tif (qualifiedName.endsWith(\"::Filter\")) {\n\t\treturn qualifiedName.slice(0, -\"::Filter\".length);\n\t}\n\treturn getShortName(qualifiedName);\n}\n\n/**\n * Attempt to infer element type from known child element keys.\n */\nfunction inferType(el: XmlElement): string {\n\tif (el.children) return \"Flex\";\n\treturn \"VisualElement\";\n}\n\n/**\n * Resolve the action definition type from the xmi:id reference.\n * The xmi:id typically contains the type name, e.g.:\n * \"Customer/(esm/_xxx)/TransferObjectTableBackActionDefinition\"\n */\nfunction resolveActionDefinitionType(ref: string): string {\n\t// Extract the last segment after the last \"/\"\n\tconst segments = ref.split(\"/\");\n\tconst lastSegment = segments[segments.length - 1];\n\n\t// Map common container-level action def names to our canonical types\n\tconst typeMap: Record<string, string> = {\n\t\tTransferObjectTableBackActionDefinition: \"BackActionDefinition\",\n\t\tTransferObjectViewBackActionDefinition: \"BackActionDefinition\",\n\t\tTransferObjectFormBackActionDefinition: \"BackActionDefinition\",\n\t\tTransferObjectTableTableRefreshActionDefinition: \"RefreshActionDefinition\",\n\t\tTransferObjectViewRefreshActionDefinition: \"RefreshActionDefinition\",\n\t\tTransferObjectFormRefreshActionDefinition: \"RefreshActionDefinition\",\n\t\tTransferObjectTableTableFilterActionDefinition: \"FilterActionDefinition\",\n\t\tTransferObjectViewDeleteActionDefinition: \"DeleteActionDefinition\",\n\t\tTransferObjectTableDeleteActionDefinition: \"DeleteActionDefinition\",\n\t\tTransferObjectViewCancelActionDefinition: \"CancelActionDefinition\",\n\t\tTransferObjectViewUpdateActionDefinition: \"UpdateActionDefinition\",\n\t\tTransferObjectFormCreateActionDefinition: \"CreateActionDefinition\",\n\t\tTransferObjectFormGetTemplateActionDefinition: \"GetTemplateActionDefinition\",\n\t\tTransferObjectTableRowViewActionDefinition: \"OpenPageActionDefinition\",\n\t\tTransferObjectTableSetSelectorSetActionDefinition: \"SetActionDefinition\",\n\t\tTransferObjectTableAddSelectorAddActionDefinition: \"AddActionDefinition\",\n\t\tTabularReferenceTableBulkDeleteActionDefinition: \"BulkDeleteActionDefinition\",\n\t\tTabularReferenceTableClearActionDefinition: \"ClearActionDefinition\",\n\t\tTabularReferenceTableCreateOpenActionDefinition: \"OpenCreateFormActionDefinition\",\n\t\tTabularReferenceTableFilterActionDefinition: \"FilterActionDefinition\",\n\t\tTabularReferenceTableRowDeleteActionDefinition: \"RowDeleteActionDefinition\",\n\t\tTabularReferenceTableRowViewActionDefinition: \"OpenPageActionDefinition\",\n\t\tTabularReferenceFieldLinkViewActionDefinition: \"OpenPageActionDefinition\",\n\t\tTabularReferenceFieldLinkSetSelectorOpenPageActionDefinition: \"OpenSelectorActionDefinition\",\n\t\tTabularReferenceFieldLinkAutocompleteRangeActionDefinition: \"AutocompleteRangeActionDefinition\",\n\t\tTabularReferenceFieldLinkAutocompleteSetActionDefinition: \"AutocompleteSetActionDefinition\",\n\t\tTabularReferenceFieldLinkUnsetActionDefinition: \"UnsetActionDefinition\",\n\t};\n\n\t// Try to match the last segment (may have extra suffixes)\n\tfor (const [pattern, type] of Object.entries(typeMap)) {\n\t\tif (lastSegment.includes(pattern)) return type;\n\t}\n\n\t// Check for operation-related patterns\n\tif (lastSegment.includes(\"OperationFormCallActionDefinition\")) return \"InputFormCallOperationActionDefinition\";\n\tif (lastSegment.includes(\"OperationFormOpenPageUnmappedInputActionDefinition\"))\n\t\treturn \"OpenOperationInputFormActionDefinition\";\n\tif (lastSegment.includes(\"CallOperationActionDefinition\")) return \"CallOperationActionDefinition\";\n\n\t// Fallback: try to extract type from the last meaningful segment\n\tif (lastSegment.endsWith(\"ActionDefinition\")) return lastSegment;\n\n\treturn \"ActionDefinition\";\n}\n\nfunction ensureArray<T>(val: T | T[] | undefined | null): T[] {\n\tif (!val) return [];\n\treturn Array.isArray(val) ? val : [val];\n}\n\n/**\n * Resolve annotation xmi:id references to annotation names.\n *\n * In the model XML, the `annotations` attribute is a space-separated list of xmi:id references.\n * This function resolves each reference to the annotation's human-readable name using the\n * `availableAnnotations` index built from the application.\n *\n * @param annotationsAttr - The raw `annotations` XML attribute (space-separated xmi:ids)\n * @param annotationMap - Map of xmi:id → annotation name built from `availableAnnotations`\n * @returns Array of resolved annotation names (empty if none)\n */\nfunction resolveAnnotations(annotationsAttr: string | undefined, annotationMap?: Map<string, string>): string[] {\n\tif (!annotationsAttr || !annotationMap) return [];\n\n\tconst refs = annotationsAttr.split(/\\s+/).filter(Boolean);\n\tconst names: string[] = [];\n\tfor (const ref of refs) {\n\t\tconst name = annotationMap.get(ref);\n\t\tif (name) {\n\t\t\tnames.push(name);\n\t\t}\n\t}\n\treturn names;\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11],"mappings":"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"}
|