bsdata-parser 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -138,6 +138,7 @@ interface IrEntryLink {
138
138
  hidden: boolean;
139
139
  collective: boolean;
140
140
  import: boolean;
141
+ flatten: boolean;
141
142
  targetId: string;
142
143
  type: string;
143
144
  defaultAmount?: number;
package/dist/index.js CHANGED
@@ -198,6 +198,7 @@ function parseEntryLink(n) {
198
198
  hidden: bool(n["@_hidden"]),
199
199
  collective: bool(n["@_collective"]),
200
200
  import: bool(n["@_import"]),
201
+ flatten: bool(n["@_flatten"]),
201
202
  targetId: String(n["@_targetId"] ?? ""),
202
203
  type: String(n["@_type"] ?? ""),
203
204
  ...n["@_defaultAmount"] != null ? { defaultAmount: Number(n["@_defaultAmount"]) } : {},
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parse/xml.ts","../src/parse/index.ts","../src/project/catalogue.ts","../src/index.ts"],"sourcesContent":["import { XMLParser } from 'fast-xml-parser'\nimport type {\n IrCatalogueFile, IrCatalogueRoot,\n IrConstraint, IrCost, IrProfile, IrCharacteristic,\n IrRule, IrInfoLink, IrCategoryLink,\n IrModifier, IrModifierGroup, IrCondition, IrConditionGroup, IrRepeat,\n IrSelectionEntry, IrSelectionEntryGroup, IrEntryLink,\n IrCostType, IrProfileType, IrCategoryEntry,\n IrEntryType,\n IrForceCategoryLink, IrForceEntry,\n IrCatalogueLink,\n} from '../ir/types.ts'\n\nconst ALWAYS_ARRAY = new Set([\n 'selectionEntry', 'selectionEntryGroup', 'entryLink',\n 'constraint', 'profile', 'characteristic', 'characteristicType',\n 'cost', 'costType', 'profileType',\n 'rule', 'categoryLink', 'categoryEntry',\n 'infoLink', 'modifier', 'condition', 'conditionGroup', 'repeat',\n 'forceEntry', 'catalogueLink', 'modifierGroup',\n])\n\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n isArray: (name) => ALWAYS_ARRAY.has(name),\n parseAttributeValue: true,\n})\n\n// ---- helpers ----\n\nfunction arr<T>(v: unknown): T[] {\n if (!v) return []\n if (Array.isArray(v)) return v as T[]\n return [v as T]\n}\n\nfunction bool(v: unknown): boolean {\n return v === true || v === 'true'\n}\n\n// ---- primitive node parsers ----\n\nfunction parseConstraint(n: any): IrConstraint {\n return {\n id: String(n['@_id'] ?? ''),\n type: n['@_type'] === 'min' ? 'min' : 'max',\n value: Number(n['@_value'] ?? 0),\n scope: String(n['@_scope'] ?? ''),\n field: String(n['@_field'] ?? 'selections'),\n shared: bool(n['@_shared']),\n includeChildSelections: bool(n['@_includeChildSelections']),\n }\n}\n\nfunction parseCost(n: any): IrCost {\n return {\n name: String(n['@_name'] ?? ''),\n typeId: String(n['@_typeId'] ?? ''),\n value: Number(n['@_value'] ?? 0),\n }\n}\n\nfunction parseCharacteristic(n: any): IrCharacteristic {\n const raw = n['#text']\n return {\n name: String(n['@_name'] ?? ''),\n typeId: String(n['@_typeId'] ?? ''),\n value: raw != null ? String(raw) : '',\n }\n}\n\nfunction parseProfile(n: any): IrProfile {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n typeId: String(n['@_typeId'] ?? ''),\n typeName: String(n['@_typeName'] ?? ''),\n characteristics: arr<any>(n.characteristics?.characteristic).map(parseCharacteristic),\n }\n}\n\nfunction parseRule(n: any): IrRule {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n description: n.description != null ? String(n.description) : '',\n }\n}\n\nfunction parseInfoLink(n: any): IrInfoLink {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n }\n}\n\nfunction parseCategoryLink(n: any): IrCategoryLink {\n return {\n id: String(n['@_id'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n primary: bool(n['@_primary']),\n }\n}\n\nfunction parseCondition(n: any): IrCondition {\n const out: IrCondition = {\n type: String(n['@_type'] ?? ''),\n value: Number(n['@_value'] ?? 0),\n field: String(n['@_field'] ?? ''),\n scope: String(n['@_scope'] ?? ''),\n }\n if (n['@_childId'] != null) out.childId = String(n['@_childId'])\n if (n['@_shared'] != null) out.shared = bool(n['@_shared'])\n if (n['@_includeChildSelections'] != null) out.includeChildSelections = bool(n['@_includeChildSelections'])\n if (n['@_percentValue'] != null) out.percentValue = bool(n['@_percentValue'])\n return out\n}\n\nfunction parseConditionGroup(n: any): IrConditionGroup {\n return {\n type: String(n['@_type'] ?? ''),\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n }\n}\n\nfunction parseRepeat(n: any): IrRepeat {\n const out: IrRepeat = {\n value: Number(n['@_value'] ?? 0),\n repeats: Number(n['@_repeats'] ?? 0),\n field: String(n['@_field'] ?? ''),\n scope: String(n['@_scope'] ?? ''),\n }\n if (n['@_childId'] != null) out.childId = String(n['@_childId'])\n if (n['@_shared'] != null) out.shared = bool(n['@_shared'])\n if (n['@_includeChildSelections'] != null) out.includeChildSelections = bool(n['@_includeChildSelections'])\n if (n['@_roundUp'] != null) out.roundUp = bool(n['@_roundUp'])\n return out\n}\n\nfunction parseModifier(n: any): IrModifier {\n return {\n type: String(n['@_type'] ?? ''),\n field: String(n['@_field'] ?? ''),\n value: n['@_value'] ?? '',\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n repeats: arr<any>(n.repeats?.repeat).map(parseRepeat),\n }\n}\n\nfunction parseModifierGroup(n: any): IrModifierGroup {\n return {\n type: String(n['@_type'] ?? 'and'),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n modifierGroups: arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup),\n }\n}\n\n// ---- structural node parsers (mutually recursive) ----\n\nfunction parseSelectionEntry(n: any): IrSelectionEntry {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n type: (n['@_type'] ?? 'upgrade') as IrEntryType,\n ...(n['@_defaultAmount'] != null ? { defaultAmount: Number(n['@_defaultAmount']) } : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n profiles: arr<any>(n.profiles?.profile).map(parseProfile),\n rules: arr<any>(n.rules?.rule).map(parseRule),\n infoLinks: arr<any>(n.infoLinks?.infoLink).map(parseInfoLink),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseCategoryLink),\n costs: arr<any>(n.costs?.cost).map(parseCost),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\nfunction parseSelectionEntryGroup(n: any): IrSelectionEntryGroup {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n ...(n['@_defaultSelectionEntryId'] != null\n ? { defaultSelectionEntryId: String(n['@_defaultSelectionEntryId']) }\n : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\nfunction parseEntryLink(n: any): IrEntryLink {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n ...(n['@_defaultAmount'] != null ? { defaultAmount: Number(n['@_defaultAmount']) } : {}),\n ...(n.comment != null ? { comment: String(n.comment).trim() } : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n costs: arr<any>(n.costs?.cost).map(parseCost),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n profiles: arr<any>(n.profiles?.profile).map(parseProfile),\n infoLinks: arr<any>(n.infoLinks?.infoLink).map(parseInfoLink),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseCategoryLink),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\n// ---- force entry parsers ----\n\nfunction parseForceCategoryLink(n: any): IrForceCategoryLink {\n return {\n id: String(n['@_id'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n primary: bool(n['@_primary']),\n hidden: bool(n['@_hidden']),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n }\n}\n\nfunction parseForceEntry(n: any): IrForceEntry {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseForceCategoryLink),\n rules: arr<any>(n.rules?.rule).map(parseRule),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n forceEntries: arr<any>(n.forceEntries?.forceEntry).map(parseForceEntry),\n }\n}\n\n// ---- catalogue link parser ----\n\nfunction parseCatalogueLink(n: any): IrCatalogueLink {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n importRootEntries: bool(n['@_importRootEntries']),\n }\n}\n\n// ---- catalogue root ----\n\nfunction parseCatalogueRoot(r: any): IrCatalogueRoot {\n return {\n costTypes: arr<any>(r.costTypes?.costType).map((n: any): IrCostType => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n defaultCostLimit: Number(n['@_defaultCostLimit'] ?? -1),\n })),\n profileTypes: arr<any>(r.profileTypes?.profileType).map((n: any): IrProfileType => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n characteristicTypes: arr<any>(n.characteristicTypes?.characteristicType).map((c: any) => ({\n id: String(c['@_id'] ?? ''),\n name: String(c['@_name'] ?? ''),\n })),\n })),\n categoryEntries: arr<any>(r.categoryEntries?.categoryEntry).map((n: any): IrCategoryEntry => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n })),\n rules: arr<any>(r.rules?.rule).map(parseRule),\n sharedRules: arr<any>(r.sharedRules?.rule).map(parseRule),\n sharedProfiles: arr<any>(r.sharedProfiles?.profile).map(parseProfile),\n selectionEntries: arr<any>(r.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n sharedSelectionEntries: arr<any>(r.sharedSelectionEntries?.selectionEntry).map(parseSelectionEntry),\n sharedSelectionEntryGroups: arr<any>(r.sharedSelectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(r.entryLinks?.entryLink).map(parseEntryLink),\n forceEntries: arr<any>(r.forceEntries?.forceEntry).map(parseForceEntry),\n }\n}\n\n// ---- public entry ----\n\nexport function parseFile(filename: string, xml: string): IrCatalogueFile {\n const doc = xmlParser.parse(xml)\n const isGst = 'gameSystem' in doc\n const root = isGst ? doc.gameSystem : doc.catalogue\n const kind: 'gameSystem' | 'catalogue' = isGst ? 'gameSystem' : 'catalogue'\n return {\n filename,\n kind,\n id: String(root['@_id'] ?? ''),\n name: String(root['@_name'] ?? ''),\n ...(root['@_gameSystemId'] != null ? { gameSystemId: String(root['@_gameSystemId']) } : {}),\n catalogueLinks: arr<any>(root.catalogueLinks?.catalogueLink).map(parseCatalogueLink),\n root: parseCatalogueRoot(root),\n }\n}\n","import type { Ir } from '../ir/types.ts'\nimport { parseFile } from './xml.ts'\n\nexport function parseToIr(files: Record<string, string>): Ir {\n const parsed = Object.entries(files).map(([filename, xml]) => parseFile(filename, xml))\n const gameSystem = parsed.find(f => f.kind === 'gameSystem')\n if (!gameSystem) throw new Error('parseToIr: no .gst file in source set')\n return {\n gameSystem,\n catalogues: parsed.filter(f => f.kind === 'catalogue'),\n }\n}\n","import type { Ir } from '../ir/types.ts'\n\n/**\n * IR -> downstream projection.\n *\n * Projects the faithful IR into the flattened, ready-to-consume shape the downstream application\n * needs. ALL domain interpretation lives here; the IR and parser stay domain-agnostic. The concrete\n * projector and its reference data are supplied locally and are never committed to this repo (see\n * README) -- this repo ships the framework, not any specific data model.\n *\n * \"Superset\" is the contract: the projection MUST reproduce every field the reference output carries\n * (so the existing consumer keeps working unchanged), and MAY add fields the current consumer lacks.\n * The golden-diff harness asserts the reproduction half; new fields are additive and ignored.\n *\n * STUB. Supply a local implementation that imports your projector modules. The local file is\n * gitignored so it never reaches this public repo. See CLAUDE.md for the hygiene rule.\n */\nexport function projectCatalogue(_ir: Ir): Record<string, unknown> {\n return {}\n}\n","import { parseToIr } from './parse/index.ts'\nimport { projectCatalogue } from './project/catalogue.ts'\n\n/**\n * Public entry point. `filename -> XML` map in, projected output object out. The signature matches\n * the downstream consumer's existing build step so this can be wired in incrementally (swap the\n * import, keep the golden diff green) without touching the consumer.\n */\nexport function buildCatalogue(files: Record<string, string>): Record<string, unknown> {\n const ir = parseToIr(files)\n return projectCatalogue(ir)\n}\n\nexport { parseToIr } from './parse/index.ts'\nexport { projectCatalogue } from './project/catalogue.ts'\nexport type { Ir, IrCatalogueFile, IrModifierGroup } from './ir/types.ts'\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/parse/xml.ts","../src/parse/index.ts","../src/project/catalogue.ts","../src/index.ts"],"sourcesContent":["import { XMLParser } from 'fast-xml-parser'\nimport type {\n IrCatalogueFile, IrCatalogueRoot,\n IrConstraint, IrCost, IrProfile, IrCharacteristic,\n IrRule, IrInfoLink, IrCategoryLink,\n IrModifier, IrModifierGroup, IrCondition, IrConditionGroup, IrRepeat,\n IrSelectionEntry, IrSelectionEntryGroup, IrEntryLink,\n IrCostType, IrProfileType, IrCategoryEntry,\n IrEntryType,\n IrForceCategoryLink, IrForceEntry,\n IrCatalogueLink,\n} from '../ir/types.ts'\n\nconst ALWAYS_ARRAY = new Set([\n 'selectionEntry', 'selectionEntryGroup', 'entryLink',\n 'constraint', 'profile', 'characteristic', 'characteristicType',\n 'cost', 'costType', 'profileType',\n 'rule', 'categoryLink', 'categoryEntry',\n 'infoLink', 'modifier', 'condition', 'conditionGroup', 'repeat',\n 'forceEntry', 'catalogueLink', 'modifierGroup',\n])\n\nconst xmlParser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n isArray: (name) => ALWAYS_ARRAY.has(name),\n parseAttributeValue: true,\n})\n\n// ---- helpers ----\n\nfunction arr<T>(v: unknown): T[] {\n if (!v) return []\n if (Array.isArray(v)) return v as T[]\n return [v as T]\n}\n\nfunction bool(v: unknown): boolean {\n return v === true || v === 'true'\n}\n\n// ---- primitive node parsers ----\n\nfunction parseConstraint(n: any): IrConstraint {\n return {\n id: String(n['@_id'] ?? ''),\n type: n['@_type'] === 'min' ? 'min' : 'max',\n value: Number(n['@_value'] ?? 0),\n scope: String(n['@_scope'] ?? ''),\n field: String(n['@_field'] ?? 'selections'),\n shared: bool(n['@_shared']),\n includeChildSelections: bool(n['@_includeChildSelections']),\n }\n}\n\nfunction parseCost(n: any): IrCost {\n return {\n name: String(n['@_name'] ?? ''),\n typeId: String(n['@_typeId'] ?? ''),\n value: Number(n['@_value'] ?? 0),\n }\n}\n\nfunction parseCharacteristic(n: any): IrCharacteristic {\n const raw = n['#text']\n return {\n name: String(n['@_name'] ?? ''),\n typeId: String(n['@_typeId'] ?? ''),\n value: raw != null ? String(raw) : '',\n }\n}\n\nfunction parseProfile(n: any): IrProfile {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n typeId: String(n['@_typeId'] ?? ''),\n typeName: String(n['@_typeName'] ?? ''),\n characteristics: arr<any>(n.characteristics?.characteristic).map(parseCharacteristic),\n }\n}\n\nfunction parseRule(n: any): IrRule {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n description: n.description != null ? String(n.description) : '',\n }\n}\n\nfunction parseInfoLink(n: any): IrInfoLink {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n }\n}\n\nfunction parseCategoryLink(n: any): IrCategoryLink {\n return {\n id: String(n['@_id'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n primary: bool(n['@_primary']),\n }\n}\n\nfunction parseCondition(n: any): IrCondition {\n const out: IrCondition = {\n type: String(n['@_type'] ?? ''),\n value: Number(n['@_value'] ?? 0),\n field: String(n['@_field'] ?? ''),\n scope: String(n['@_scope'] ?? ''),\n }\n if (n['@_childId'] != null) out.childId = String(n['@_childId'])\n if (n['@_shared'] != null) out.shared = bool(n['@_shared'])\n if (n['@_includeChildSelections'] != null) out.includeChildSelections = bool(n['@_includeChildSelections'])\n if (n['@_percentValue'] != null) out.percentValue = bool(n['@_percentValue'])\n return out\n}\n\nfunction parseConditionGroup(n: any): IrConditionGroup {\n return {\n type: String(n['@_type'] ?? ''),\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n }\n}\n\nfunction parseRepeat(n: any): IrRepeat {\n const out: IrRepeat = {\n value: Number(n['@_value'] ?? 0),\n repeats: Number(n['@_repeats'] ?? 0),\n field: String(n['@_field'] ?? ''),\n scope: String(n['@_scope'] ?? ''),\n }\n if (n['@_childId'] != null) out.childId = String(n['@_childId'])\n if (n['@_shared'] != null) out.shared = bool(n['@_shared'])\n if (n['@_includeChildSelections'] != null) out.includeChildSelections = bool(n['@_includeChildSelections'])\n if (n['@_roundUp'] != null) out.roundUp = bool(n['@_roundUp'])\n return out\n}\n\nfunction parseModifier(n: any): IrModifier {\n return {\n type: String(n['@_type'] ?? ''),\n field: String(n['@_field'] ?? ''),\n value: n['@_value'] ?? '',\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n repeats: arr<any>(n.repeats?.repeat).map(parseRepeat),\n }\n}\n\nfunction parseModifierGroup(n: any): IrModifierGroup {\n return {\n type: String(n['@_type'] ?? 'and'),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n conditions: arr<any>(n.conditions?.condition).map(parseCondition),\n conditionGroups: arr<any>(n.conditionGroups?.conditionGroup).map(parseConditionGroup),\n modifierGroups: arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup),\n }\n}\n\n// ---- structural node parsers (mutually recursive) ----\n\nfunction parseSelectionEntry(n: any): IrSelectionEntry {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n type: (n['@_type'] ?? 'upgrade') as IrEntryType,\n ...(n['@_defaultAmount'] != null ? { defaultAmount: Number(n['@_defaultAmount']) } : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n profiles: arr<any>(n.profiles?.profile).map(parseProfile),\n rules: arr<any>(n.rules?.rule).map(parseRule),\n infoLinks: arr<any>(n.infoLinks?.infoLink).map(parseInfoLink),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseCategoryLink),\n costs: arr<any>(n.costs?.cost).map(parseCost),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\nfunction parseSelectionEntryGroup(n: any): IrSelectionEntryGroup {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n ...(n['@_defaultSelectionEntryId'] != null\n ? { defaultSelectionEntryId: String(n['@_defaultSelectionEntryId']) }\n : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\nfunction parseEntryLink(n: any): IrEntryLink {\n const mg = arr<any>(n.modifierGroups?.modifierGroup).map(parseModifierGroup)\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n collective: bool(n['@_collective']),\n import: bool(n['@_import']),\n flatten: bool(n['@_flatten']),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n ...(n['@_defaultAmount'] != null ? { defaultAmount: Number(n['@_defaultAmount']) } : {}),\n ...(n.comment != null ? { comment: String(n.comment).trim() } : {}),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n costs: arr<any>(n.costs?.cost).map(parseCost),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n ...(mg.length > 0 ? { modifierGroups: mg } : {}),\n profiles: arr<any>(n.profiles?.profile).map(parseProfile),\n infoLinks: arr<any>(n.infoLinks?.infoLink).map(parseInfoLink),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseCategoryLink),\n selectionEntries: arr<any>(n.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n selectionEntryGroups: arr<any>(n.selectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(n.entryLinks?.entryLink).map(parseEntryLink),\n }\n}\n\n// ---- force entry parsers ----\n\nfunction parseForceCategoryLink(n: any): IrForceCategoryLink {\n return {\n id: String(n['@_id'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n primary: bool(n['@_primary']),\n hidden: bool(n['@_hidden']),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n }\n}\n\nfunction parseForceEntry(n: any): IrForceEntry {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n constraints: arr<any>(n.constraints?.constraint).map(parseConstraint),\n categoryLinks: arr<any>(n.categoryLinks?.categoryLink).map(parseForceCategoryLink),\n rules: arr<any>(n.rules?.rule).map(parseRule),\n modifiers: arr<any>(n.modifiers?.modifier).map(parseModifier),\n forceEntries: arr<any>(n.forceEntries?.forceEntry).map(parseForceEntry),\n }\n}\n\n// ---- catalogue link parser ----\n\nfunction parseCatalogueLink(n: any): IrCatalogueLink {\n return {\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n targetId: String(n['@_targetId'] ?? ''),\n type: String(n['@_type'] ?? ''),\n importRootEntries: bool(n['@_importRootEntries']),\n }\n}\n\n// ---- catalogue root ----\n\nfunction parseCatalogueRoot(r: any): IrCatalogueRoot {\n return {\n costTypes: arr<any>(r.costTypes?.costType).map((n: any): IrCostType => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n defaultCostLimit: Number(n['@_defaultCostLimit'] ?? -1),\n })),\n profileTypes: arr<any>(r.profileTypes?.profileType).map((n: any): IrProfileType => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n characteristicTypes: arr<any>(n.characteristicTypes?.characteristicType).map((c: any) => ({\n id: String(c['@_id'] ?? ''),\n name: String(c['@_name'] ?? ''),\n })),\n })),\n categoryEntries: arr<any>(r.categoryEntries?.categoryEntry).map((n: any): IrCategoryEntry => ({\n id: String(n['@_id'] ?? ''),\n name: String(n['@_name'] ?? ''),\n hidden: bool(n['@_hidden']),\n })),\n rules: arr<any>(r.rules?.rule).map(parseRule),\n sharedRules: arr<any>(r.sharedRules?.rule).map(parseRule),\n sharedProfiles: arr<any>(r.sharedProfiles?.profile).map(parseProfile),\n selectionEntries: arr<any>(r.selectionEntries?.selectionEntry).map(parseSelectionEntry),\n sharedSelectionEntries: arr<any>(r.sharedSelectionEntries?.selectionEntry).map(parseSelectionEntry),\n sharedSelectionEntryGroups: arr<any>(r.sharedSelectionEntryGroups?.selectionEntryGroup).map(parseSelectionEntryGroup),\n entryLinks: arr<any>(r.entryLinks?.entryLink).map(parseEntryLink),\n forceEntries: arr<any>(r.forceEntries?.forceEntry).map(parseForceEntry),\n }\n}\n\n// ---- public entry ----\n\nexport function parseFile(filename: string, xml: string): IrCatalogueFile {\n const doc = xmlParser.parse(xml)\n const isGst = 'gameSystem' in doc\n const root = isGst ? doc.gameSystem : doc.catalogue\n const kind: 'gameSystem' | 'catalogue' = isGst ? 'gameSystem' : 'catalogue'\n return {\n filename,\n kind,\n id: String(root['@_id'] ?? ''),\n name: String(root['@_name'] ?? ''),\n ...(root['@_gameSystemId'] != null ? { gameSystemId: String(root['@_gameSystemId']) } : {}),\n catalogueLinks: arr<any>(root.catalogueLinks?.catalogueLink).map(parseCatalogueLink),\n root: parseCatalogueRoot(root),\n }\n}\n","import type { Ir } from '../ir/types.ts'\nimport { parseFile } from './xml.ts'\n\nexport function parseToIr(files: Record<string, string>): Ir {\n const parsed = Object.entries(files).map(([filename, xml]) => parseFile(filename, xml))\n const gameSystem = parsed.find(f => f.kind === 'gameSystem')\n if (!gameSystem) throw new Error('parseToIr: no .gst file in source set')\n return {\n gameSystem,\n catalogues: parsed.filter(f => f.kind === 'catalogue'),\n }\n}\n","import type { Ir } from '../ir/types.ts'\n\n/**\n * IR -> downstream projection.\n *\n * Projects the faithful IR into the flattened, ready-to-consume shape the downstream application\n * needs. ALL domain interpretation lives here; the IR and parser stay domain-agnostic. The concrete\n * projector and its reference data are supplied locally and are never committed to this repo (see\n * README) -- this repo ships the framework, not any specific data model.\n *\n * \"Superset\" is the contract: the projection MUST reproduce every field the reference output carries\n * (so the existing consumer keeps working unchanged), and MAY add fields the current consumer lacks.\n * The golden-diff harness asserts the reproduction half; new fields are additive and ignored.\n *\n * STUB. Supply a local implementation that imports your projector modules. The local file is\n * gitignored so it never reaches this public repo. See CLAUDE.md for the hygiene rule.\n */\nexport function projectCatalogue(_ir: Ir): Record<string, unknown> {\n return {}\n}\n","import { parseToIr } from './parse/index.ts'\nimport { projectCatalogue } from './project/catalogue.ts'\n\n/**\n * Public entry point. `filename -> XML` map in, projected output object out. The signature matches\n * the downstream consumer's existing build step so this can be wired in incrementally (swap the\n * import, keep the golden diff green) without touching the consumer.\n */\nexport function buildCatalogue(files: Record<string, string>): Record<string, unknown> {\n const ir = parseToIr(files)\n return projectCatalogue(ir)\n}\n\nexport { parseToIr } from './parse/index.ts'\nexport { projectCatalogue } from './project/catalogue.ts'\nexport type { Ir, IrCatalogueFile, IrModifierGroup } from './ir/types.ts'\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "name": "bsdata-parser",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Faithful BSData .gst/.cat XML parser: parses game-data source files into a typed IR and exposes a golden-diff harness for validating a downstream projection.",
7
- "keywords": ["bsdata", "battlescribe", "parser", "xml", "game-data"],
7
+ "keywords": [
8
+ "bsdata",
9
+ "battlescribe",
10
+ "parser",
11
+ "xml",
12
+ "game-data"
13
+ ],
8
14
  "repository": {
9
15
  "type": "git",
10
16
  "url": "https://github.com/aodhan-dev/bsdata-parser.git"