bsdata-parser 0.1.3 → 0.1.4
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/README.md +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ BSData (.gst/.cat) ──parse──▶ IR (faithful tree) ──project─
|
|
|
17
17
|
reference output ◀───diff───────┘
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
- **`src/parse`** - XML to IR. Mechanical transcription only: no interpretation, no flattening, no domain knowledge. Every modifier, condition, constraint, and repeat node is preserved verbatim.
|
|
20
|
+
- **`src/parse`** - XML to IR. Mechanical transcription only: no interpretation, no flattening, no domain knowledge. Every modifier, condition, constraint, and repeat node is preserved verbatim, as are node attributes - including the `flatten` attribute on entry links, so consumers can honor BSData's "inline this group into its parent" semantics instead of emitting a duplicate sub-group.
|
|
21
21
|
- **`src/project`** - IR to output. All domain interpretation lives here. This layer is intentionally not included in the package - you supply it, shaped to your own output schema.
|
|
22
22
|
- **`harness/`** - golden-diff utilities. Load a reference output (oracle) and diff a candidate against it to find gaps. Auto-skips when no local data is present, so the test suite runs cleanly everywhere.
|
|
23
23
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -181,6 +181,7 @@ function parseSelectionEntryGroup(n) {
|
|
|
181
181
|
hidden: bool(n["@_hidden"]),
|
|
182
182
|
collective: bool(n["@_collective"]),
|
|
183
183
|
import: bool(n["@_import"]),
|
|
184
|
+
flatten: bool(n["@_flatten"]),
|
|
184
185
|
...n["@_defaultSelectionEntryId"] != null ? { defaultSelectionEntryId: String(n["@_defaultSelectionEntryId"]) } : {},
|
|
185
186
|
constraints: arr(n.constraints?.constraint).map(parseConstraint),
|
|
186
187
|
modifiers: arr(n.modifiers?.modifier).map(parseModifier),
|
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 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":[]}
|
|
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 flatten: bool(n['@_flatten']),\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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bsdata-parser",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
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.",
|