jspurefix 5.9.1 → 5.9.2
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/BACKPORT_PLAN.md +20 -7
- package/WORKLOG.md +119 -0
- package/dist/benchmark/bench-report.d.ts +5 -0
- package/dist/benchmark/bench-report.js +91 -0
- package/dist/benchmark/bench-report.js.map +1 -0
- package/dist/benchmark/bench-runner.d.ts +12 -0
- package/dist/benchmark/bench-runner.js +193 -0
- package/dist/benchmark/bench-runner.js.map +1 -0
- package/dist/benchmark/bench-stats.d.ts +10 -0
- package/dist/benchmark/bench-stats.js +56 -0
- package/dist/benchmark/bench-stats.js.map +1 -0
- package/dist/benchmark/bench-types.d.ts +74 -0
- package/dist/benchmark/bench-types.js +3 -0
- package/dist/benchmark/bench-types.js.map +1 -0
- package/dist/benchmark/gc-probe.d.ts +18 -0
- package/dist/benchmark/gc-probe.js +103 -0
- package/dist/benchmark/gc-probe.js.map +1 -0
- package/dist/benchmark/index.d.ts +6 -0
- package/dist/benchmark/index.js +23 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/parse-bench.d.ts +28 -0
- package/dist/benchmark/parse-bench.js +85 -0
- package/dist/benchmark/parse-bench.js.map +1 -0
- package/dist/buffer/ascii/ascii-parser.d.ts +1 -0
- package/dist/buffer/ascii/ascii-parser.js +4 -1
- package/dist/buffer/ascii/ascii-parser.js.map +1 -1
- package/dist/buffer/ascii/ascii-segment-parser.js +3 -2
- package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
- package/dist/buffer/ascii/tag-index.js.map +1 -1
- package/dist/buffer/msg-view.d.ts +1 -0
- package/dist/buffer/msg-view.js +25 -19
- package/dist/buffer/msg-view.js.map +1 -1
- package/dist/dictionary/parser/quickfix/dictionary-validator.d.ts +1 -1
- package/dist/dictionary/parser/quickfix/dictionary-validator.js.map +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.d.ts +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js +1 -2
- package/dist/dictionary/parser/quickfix/quick-fix-graph-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/validation-error.d.ts +2 -2
- package/dist/dictionary/parser/quickfix/validation-error.js.map +1 -1
- package/dist/jsfix-bench.d.ts +1 -0
- package/dist/jsfix-bench.js +213 -0
- package/dist/jsfix-bench.js.map +1 -0
- package/dist/store/file-session-store.js +1 -1
- package/dist/store/file-session-store.js.map +1 -1
- package/dist/store/file-session-stream-provider.d.ts +1 -0
- package/dist/store/file-session-stream-provider.js +13 -13
- package/dist/store/file-session-stream-provider.js.map +1 -1
- package/dist/store/fix-session-store-factory.d.ts +1 -1
- package/dist/store/fix-session-store-factory.js.map +1 -1
- package/dist/store/fix-session-store.d.ts +11 -11
- package/dist/store/fix-session-store.js.map +1 -1
- package/dist/store/memory-session-store.js.map +1 -1
- package/dist/store/session-stream-provider.d.ts +13 -13
- package/dist/store/session-stream-provider.js.map +1 -1
- package/dist/transport/session/fix-clock.d.ts +1 -1
- package/dist/transport/session/fix-clock.js.map +1 -1
- package/dist/transport/session/resend-request-manager.d.ts +2 -2
- package/dist/transport/session/resend-request-manager.js.map +1 -1
- package/dist/transport/session/session-sequence-coordinator.d.ts +1 -1
- package/dist/transport/session/session-sequence-coordinator.js.map +1 -1
- package/dist/transport/session/session-sequence-store.d.ts +3 -3
- package/dist/transport/session/session-sequence-store.js.map +1 -1
- package/dist/transport/tcp/tcp-initiator.js.map +1 -1
- package/docs/benchmarking.md +117 -0
- package/eslint.config.mjs +15 -1
- package/jsfix.test_client.txt +62 -62
- package/jsfix.test_server.txt +72 -72
- package/package.json +9 -1
- package/src/benchmark/bench-report.ts +101 -0
- package/src/benchmark/bench-runner.ts +196 -0
- package/src/benchmark/bench-stats.ts +86 -0
- package/src/benchmark/bench-types.ts +110 -0
- package/src/benchmark/gc-probe.ts +145 -0
- package/src/benchmark/index.ts +6 -0
- package/src/benchmark/parse-bench.ts +144 -0
- package/src/buffer/ascii/ascii-parser.ts +16 -1
- package/src/buffer/ascii/ascii-segment-parser.ts +9 -6
- package/src/buffer/ascii/tag-index.ts +3 -3
- package/src/buffer/msg-view.ts +35 -18
- package/src/dictionary/parser/quickfix/dictionary-validator.ts +1 -1
- package/src/dictionary/parser/quickfix/quick-fix-graph-parser.ts +2 -3
- package/src/dictionary/parser/quickfix/validation-error.ts +1 -1
- package/src/jsfix-bench.ts +204 -0
- package/src/store/file-session-store.ts +2 -2
- package/src/store/file-session-stream-provider.ts +17 -11
- package/src/store/fix-session-store-factory.ts +1 -1
- package/src/store/fix-session-store.ts +11 -11
- package/src/store/memory-session-store.ts +1 -1
- package/src/store/session-stream-provider.ts +13 -13
- package/src/transport/session/fix-clock.ts +1 -1
- package/src/transport/session/resend-request-manager.ts +4 -4
- package/src/transport/session/session-sequence-coordinator.ts +1 -1
- package/src/transport/session/session-sequence-store.ts +3 -3
- package/src/transport/tcp/tcp-initiator.ts +1 -1
|
@@ -30,6 +30,7 @@ export declare abstract class MsgView {
|
|
|
30
30
|
toVerbose(): string;
|
|
31
31
|
toJson(): string;
|
|
32
32
|
getView(name: string): MsgView | null;
|
|
33
|
+
private resolveChild;
|
|
33
34
|
abstract checksum(): number;
|
|
34
35
|
abstract clone(): MsgView;
|
|
35
36
|
protected abstract create(singleton: SegmentDescription): MsgView;
|
package/dist/buffer/msg-view.js
CHANGED
|
@@ -150,27 +150,33 @@ class MsgView {
|
|
|
150
150
|
return JSON.stringify(this.toObject(), null, 4);
|
|
151
151
|
}
|
|
152
152
|
getView(name) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
if (!name.includes('.')) {
|
|
154
|
+
return this.resolveChild(name);
|
|
155
|
+
}
|
|
156
|
+
let view = this;
|
|
157
|
+
for (const part of name.split('.')) {
|
|
158
|
+
view = view.resolveChild(part);
|
|
159
|
+
if (!view) {
|
|
160
|
+
return null;
|
|
158
161
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
162
|
+
}
|
|
163
|
+
return view;
|
|
164
|
+
}
|
|
165
|
+
resolveChild(name) {
|
|
166
|
+
var _a, _b, _c, _d;
|
|
167
|
+
const structure = this.structure;
|
|
168
|
+
const singleton = (_a = structure === null || structure === void 0 ? void 0 : structure.firstContainedWithin(name, this.segment)) !== null && _a !== void 0 ? _a : null;
|
|
169
|
+
if (singleton) {
|
|
170
|
+
return this.create(singleton);
|
|
171
|
+
}
|
|
172
|
+
const component = (_c = (_b = this.segment.set) === null || _b === void 0 ? void 0 : _b.localNameToField.get(name)) !== null && _c !== void 0 ? _c : null;
|
|
173
|
+
if (component) {
|
|
174
|
+
const abbreviated = (_d = structure === null || structure === void 0 ? void 0 : structure.firstContainedWithin(component.name, this.segment)) !== null && _d !== void 0 ? _d : null;
|
|
175
|
+
if (abbreviated) {
|
|
176
|
+
return this.create(abbreviated);
|
|
170
177
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
return parts.reduce(reducer, this);
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
174
180
|
}
|
|
175
181
|
resolveTag(tagOrName) {
|
|
176
182
|
var _a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msg-view.js","sourceRoot":"","sources":["../../src/buffer/msg-view.ts"],"names":[],"mappings":"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","sourcesContent":["import { TagPos } from './tag/tag-pos'\nimport { SegmentDescription } from './segment/segment-description'\nimport { Structure } from './structure'\nimport { Tags } from './tag/tags'\nimport {\n ContainedComponentField,\n ContainedField,\n IContainedSet,\n ContainedGroupField,\n ContainedSimpleField\n} from '../dictionary/contained'\nimport { SetReduce } from '../dictionary'\nimport { ILooseObject } from '../collections/collection'\nimport { ElasticBuffer } from './elastic-buffer'\nimport { FixDefinitions, GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'\nimport { ITypeDispatcher } from '../dictionary/type-dispatcher'\nimport { ContainedSetType } from '../dictionary/contained-set-type'\n\nexport abstract class MsgView {\n protected sortedTagPosForwards: TagPos[]\n protected sortedTagPosBackwards: TagPos[]\n private readonly reducer: SetReduce<ILooseObject> = new SetReduce<ILooseObject>()\n\n protected constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription, public readonly structure: Structure | null) {\n }\n\n protected static asVerbose = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const newLine = require('os').EOL\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]${newLine}\\t${field.description ?? ''}${newLine}${newLine}`\n } else {\n desc = `${val}${newLine}t${field.description ?? ''}${newLine}${newLine}`\n }\n } else {\n name = 'unknown'\n desc = 'na'\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}`\n }\n\n protected static asToken = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const perLine: number = 2\n const newLine = require('os').EOL\n // [280] 814 (ApplQueueResolution) = 2[OverlayLast][281] 10 (CheckSum) = 80\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]`\n } else {\n desc = `${val}`\n }\n } else {\n desc = `${val}`\n name = 'unknown'\n }\n let delimiter: string\n if (i === 1 || (i < count && i % perLine - 1 === 0)) {\n delimiter = newLine\n } else {\n delimiter = i < count ? ', ' : ''\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}${delimiter}`\n }\n\n // return list of any tags parsed that are not valid\n public invalid (): number[] {\n const invalidTags: number[] = []\n const set = this.segment.set\n if (set == null) return []\n const tags = this.structure?.tags ?? null\n if (tags == null) return []\n for (let i = 0; i < tags.nextTagPos; ++i) {\n const tag = tags.tagPos[i].tag\n if (tag <= 0 || !set.containedTag[tag]) {\n invalidTags[invalidTags.length] = tag\n }\n }\n return invalidTags\n }\n\n // list of tags that must be present\n public missing (): number[] {\n if (this.segment == null) return []\n if (this.segment.set == null) return []\n return this.missingRequired(this.segment.set, [])\n }\n\n /**\n * does this view contain this tag\n * @param tagOrName the name or tag of field to check 8 or BeginString\n */\n public contains (tagOrName: number | string): boolean {\n const tag: number = this.resolveTag(tagOrName)\n const position: number = this.getPosition(tag)\n return position >= 0\n }\n\n /**\n * if this view represents a repeated group then return a sub view representing\n * this instance of repeated group.\n * @param i the index to return i.e. 0 is first within repeated group\n */\n public getGroupInstance (i: number): MsgView | null {\n const instance: SegmentDescription | null = this.segment?.getInstance(i)\n if (!instance) {\n return null\n }\n return this.create(instance)\n }\n\n public getUndefined (): SegmentDescription | SegmentDescription[] | null {\n return this.structure?.layout['.undefined']\n }\n\n public undefinedForMsg (): string | null {\n let msg: string | null = null\n const undefinedTags = this.getUndefined()\n if (undefinedTags) {\n if (Array.isArray(undefinedTags)) {\n msg = 'undefined tags = ' + undefinedTags.map((e: SegmentDescription) => e.startTag.toString()).join(', ')\n } else {\n msg = `undefined tag = ${undefinedTags.startTag}`\n }\n }\n return msg\n }\n\n /**\n * if this view represents a repeated group then return number\n * of repeated instances within this view\n */\n public groupCount (): number {\n const positions = this.segment.delimiterPositions\n return positions ? positions.length : 0\n }\n\n /**\n * regardless of how this type is represented in data dictionary,\n * return its value as a string.\n * @param tagOrName name or tag to return 8 or BeginString\n */\n public getString (tagOrName: number | string): string | null {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const position: number = this.getPosition(tag)\n if (position < 0) {\n return null\n }\n return this.stringAtPosition(position)\n }\n\n /**\n * for a repeated group, one field may be repeted across each instance of a component\n * return all values for a specified field as array of strings\n * @param tagOrName the name of the repeated field to fetch\n */\n public getStrings (tagOrName: number | string | null = null): Array<(string | null)> | null {\n if (!tagOrName) {\n return this.allStrings()\n }\n tagOrName = tagOrName || -1\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const positions: number[] = this.getPositions(tag)\n if (positions == null) {\n return null\n }\n return positions.map((position: number) => {\n return this.stringAtPosition(position)\n })\n }\n\n /**\n * returns typed value of a sinple field within this view\n * @param tagOrName the name or tag of required field e.g. 8, BeginString\n */\n public getTyped (tagOrName: number | string): (boolean | string | number | Date | Buffer | null) {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const field: SimpleFieldDefinition | null = this.definitions.tagToSimple[tag] ?? null\n if (field == null) {\n return null\n }\n return this.toTyped(field)\n }\n\n /**\n * use a varargs list of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrNames list of tags e.g. 'BeginString', 'BodyLength', ...\n */\n public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrNames.map((s) => this.getTyped(s))\n }\n\n /**\n * use an array of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrName the list of params as array ['BeginString','BodyLength', 'MsgType']\n */\n public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrName.map((s) => this.getTyped(s))\n }\n\n /**\n * produce an object representation of the view which when coupled with its\n * interface (generated against the same dictionary source) will allow easy\n * navigation of the object where a group is resolved to an array and simple\n * fields are properties. This is relatively expensive operation as every\n * field is fully resolved regardless of depth i.e. all groups and compoennts\n * are fully resolved.\n */\n public toObject (): ILooseObject | ILooseObject[] | null {\n const segment: SegmentDescription = this.segment\n if (segment.set == null) return null\n if (segment.delimiterTag) {\n switch (segment.set.type) {\n case ContainedSetType.Group: {\n return this.asInstances((segment.set as GroupFieldDefinition).name)\n }\n case ContainedSetType.Msg: {\n // this is a batch of messages\n const hdrView = this.getView('Hdr')\n const batch: ILooseObject = {}\n if (hdrView) {\n const name = hdrView.segment.set?.name ?? 'na'\n batch[name] = hdrView.toObject()\n }\n batch[segment.name] = this.asInstances(segment.name)\n return batch\n }\n }\n }\n return this.asLoose(segment.set)\n }\n\n /**\n * easy human-readable format showing each field, its position, value and resolved\n * enum.\n */\n public toString (): string {\n return this.stringify(MsgView.asToken)\n }\n\n public toVerbose (): string {\n return this.stringify(MsgView.asVerbose)\n }\n\n /**\n * a string in JSON format representing this view as an object\n */\n public toJson (): string {\n return JSON.stringify(this.toObject(), null, 4)\n }\n\n public getView (name: string): MsgView | null {\n const parts: string[] = name.split('.')\n const reducer = (a: MsgView | null, current: string): MsgView | null => {\n if (!a) {\n return a\n }\n const structure = a.structure\n const singleton: SegmentDescription | null = structure?.firstContainedWithin(current, a.segment) ?? null\n if (singleton) {\n return a.create(singleton)\n }\n // is this a full name where abbreviation exists\n const component: ContainedField | null = a.segment.set?.localNameToField.get(current) ?? null\n\n if (component) {\n const abbreviated: SegmentDescription | null = structure?.firstContainedWithin(component.name, a.segment) ?? null\n if (abbreviated) {\n return a.create(abbreviated)\n }\n }\n return null\n }\n return parts.reduce<MsgView | null>(reducer, this)\n }\n\n public abstract checksum (): number\n\n public abstract clone (): MsgView\n\n protected abstract create (singleton: SegmentDescription): MsgView\n\n protected abstract stringAtPosition (position: number): string | null\n\n protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date | Buffer | null\n\n protected resolveTag (tagOrName: number | string): number {\n let tag: number\n const set = this.segment.set\n if (typeof (tagOrName) === 'string') {\n if (set == null) return 0\n const cf = set.simple.get(tagOrName)\n const f: SimpleFieldDefinition | null = cf ? cf.definition : this.definitions.simple.get(tagOrName) ?? null\n if (f == null) {\n return -1\n }\n tag = f.tag\n } else {\n tag = tagOrName\n }\n return tag\n }\n\n // fetch all positions of a particular tag.\n protected getPositions (tag: number): number[] {\n const forwards: TagPos[] = this.sortedTagPosForwards\n const backwards: TagPos[] = this.sortedTagPosBackwards\n const position: number = this.binarySearch(tag)\n if (position < 0) {\n return []\n }\n\n const count: number = forwards.length\n const last: number = count - 1\n let end: number = position\n while (end <= last) {\n if (tag !== forwards[end].tag) {\n break\n }\n ++end\n }\n // avoid backtracking over an array by scan forwards on a reversed copy\n let start: number = last - position\n while (start <= last) {\n if (tag !== backwards[start].tag) {\n break\n }\n ++start\n }\n const begin: number = last - (start - 1)\n const len: number = end - begin\n const positions: number[] = new Array(len)\n for (let i: number = begin; i < end; ++i) {\n positions[i - begin] = forwards[i].position\n }\n return positions\n }\n\n protected getPosition (tag: number): number {\n const pos: number = this.binarySearch(tag)\n if (pos >= 0) {\n return this.sortedTagPosForwards[pos].position\n } else {\n return -1\n }\n }\n\n private allStrings (): Array<(string | null)> {\n const segment: SegmentDescription = this.segment\n const range: number[] = []\n if (segment.segmentView) {\n for (const tp of segment.segmentView.tags) {\n range[range.length] = tp.position\n }\n } else {\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n range[range.length] = i\n }\n }\n return range.map((i: number) => this.stringAtPosition(i))\n }\n\n private asInstances (name: string): Array<ILooseObject | null> | null {\n const groupView: MsgView | null = this.getView(name)\n if (groupView == null) {\n return null\n }\n const groupArray = new Array<ILooseObject | null>(groupView.groupCount())\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n groupArray[j] = instance?.toObject() ?? null\n }\n return groupArray\n }\n\n private asLoose (def: IContainedSet): ILooseObject {\n\n return this.reducer.reduce(def, {\n group: (a: ILooseObject, field: ContainedGroupField) => { this.asLooseGroup(a, field) },\n simple: (a: ILooseObject, field: ContainedSimpleField) => { this.asLooseSimple(a, field) },\n component: (a: ILooseObject, field: ContainedComponentField) => { this.asLooseComponent(a, field) }\n } as ITypeDispatcher<ILooseObject>, def.localAttribute.reduce<ILooseObject>((a: ILooseObject, sf: ContainedSimpleField) => {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n a[def.name] = this.toTyped(def)\n }\n return a\n }, {}))\n }\n\n private missingRequired (def: IContainedSet, tags: number []): number[] {\n const reducer = new SetReduce<number[]>()\n const dispatcher: ITypeDispatcher<number[]> = {\n group: (a: number[], field: ContainedGroupField) => { this.missingGroup(def, field, a) },\n simple: (a: number[], field: ContainedSimpleField) => { this.missingSimple(field, a) },\n component: (a: number[], field: ContainedComponentField) => { this.missingComponent(field, a) }\n }\n return reducer.reduce(def, dispatcher, tags)\n }\n\n private missingSimple (sf: ContainedSimpleField, a: number[]): void {\n if (sf.required && this.getPosition(sf.definition.tag) < 0) {\n a.push(sf.definition.tag)\n }\n }\n\n private missingComponent (cf: ContainedComponentField, a: number[]): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n view.missingRequired(cf.definition, a)\n }\n }\n\n private missingGroup (def: IContainedSet, gf: ContainedGroupField, tags: number []): void {\n const name = gf.definition.noOfField ? gf.definition.noOfField.name : def.name\n const groupView: MsgView | null = this.getView(name) ?? this.getView(gf.definition.name)\n if (groupView == null) {\n return\n }\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n instance?.missingRequired(gf.definition, tags)\n }\n }\n\n private asLooseComponent (a: ILooseObject, cf: ContainedComponentField): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n const component = view.toObject()\n if (component) {\n a[cf.definition.name] = component\n }\n }\n }\n\n private asLooseSimple (a: ILooseObject, sf: ContainedSimpleField): void {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n const asSimple: boolean | string | number | Date | Buffer | null = this.toTyped(def)\n if (asSimple != null) { // beware, may be false value\n a[sf.name] = asSimple\n }\n }\n }\n\n private asLooseGroup (a: ILooseObject, gf: ContainedGroupField): void {\n const def = gf.definition\n const name = def.noOfField ? def.noOfField.name : def.name\n const instances: ILooseObject | null = this.asInstances(name) ?? this.asInstances(def.name)\n if (instances) {\n a[def.name] = instances\n }\n }\n\n private binarySearch (tag: number): number {\n if (this.structure == null) return -1\n let forwards = this.sortedTagPosForwards\n if (!forwards) {\n const segment = this.segment\n if (segment.segmentView) {\n // fragmented component: use the collected tags from SegmentView\n forwards = this.sortedTagPosForwards = segment.segmentView.tags.slice()\n forwards.sort(TagPos.compare)\n } else {\n forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1)\n forwards.sort(TagPos.compare)\n }\n this.sortedTagPosBackwards = forwards.slice().reverse()\n }\n return TagPos.binarySearch(forwards, tag)\n }\n\n private stringify (getToken: (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos) => string): string {\n const structure = this.structure\n const buffer: ElasticBuffer = new ElasticBuffer()\n const segment: SegmentDescription = this.segment\n if (structure == null) return ''\n const tags: Tags = structure.tags\n const count: number = segment.endPosition - segment.startPosition\n const simple: Map<string, SimpleFieldDefinition> = this.definitions.simple\n\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n const tagPos: TagPos = tags.tagPos[i]\n const field: SimpleFieldDefinition | undefined = simple.get(tagPos.tag.toString())\n const val: string | null = this.stringAtPosition(i) ?? ''\n // [0] 8 (BeginString) = FIX4.4\n const token = field ? getToken(field, val, i - segment.startPosition, count, tagPos) : `[${i}] ${tagPos.tag} (unknown) = ${val}, `\n buffer.writeString(token)\n }\n\n return buffer.toString()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"msg-view.js","sourceRoot":"","sources":["../../src/buffer/msg-view.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AAWtC,8CAAyC;AAEzC,qDAAgD;AAGhD,yEAAmE;AAEnE,MAAsB,OAAO;IAK3B,YAAuC,WAA2B,EAAkB,OAA2B,EAAkB,SAA2B;QAArH,gBAAW,GAAX,WAAW,CAAgB;QAAkB,YAAO,GAAP,OAAO,CAAoB;QAAkB,cAAS,GAAT,SAAS,CAAkB;QAF3I,YAAO,GAA4B,IAAI,sBAAS,EAAgB,CAAA;IAGjF,CAAC;IA+CM,OAAO;;QACZ,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;QAC5B,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAA;QACzC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAC9B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;YACvC,CAAC;QACH,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAGM,OAAO;QACZ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QACvC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC;IAMM,QAAQ,CAAE,SAA0B;QACzC,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,OAAO,QAAQ,IAAI,CAAC,CAAA;IACtB,CAAC;IAOM,gBAAgB,CAAE,CAAS;;QAChC,MAAM,QAAQ,GAA8B,MAAA,IAAI,CAAC,OAAO,0CAAE,WAAW,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAEM,YAAY;;QACjB,OAAO,MAAA,IAAI,CAAC,SAAS,0CAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC7C,CAAC;IAEM,eAAe;QACpB,IAAI,GAAG,GAAkB,IAAI,CAAA;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,GAAG,GAAG,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5G,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,mBAAmB,aAAa,CAAC,QAAQ,EAAE,CAAA;YACnD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAMM,UAAU;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAA;QACjD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC;IAOM,SAAS,CAAE,SAA0B;QAC1C,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAOM,UAAU,CAAE,YAAoC,IAAI;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;QAC1B,CAAC;QACD,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,CAAA;QAC3B,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,SAAS,GAAa,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAE,EAAE;YACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC;IAMM,QAAQ,CAAE,SAA0B;;QACzC,MAAM,GAAG,GAAW,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAiC,MAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAA;QACrF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAMM,YAAY,CAAE,GAAG,UAAkC;QACxD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAMM,YAAY,CAAE,SAAiC;QACpD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IAUM,QAAQ;;QACb,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,qCAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC5B,OAAO,IAAI,CAAC,WAAW,CAAE,OAAO,CAAC,GAA4B,CAAC,IAAI,CAAC,CAAA;gBACrE,CAAC;gBACD,KAAK,qCAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;oBAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;oBACnC,MAAM,KAAK,GAAiB,EAAE,CAAA;oBAC9B,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,IAAI,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,GAAG,0CAAE,IAAI,mCAAI,IAAI,CAAA;wBAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;oBAClC,CAAC;oBACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;oBACpD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;IAMM,QAAQ;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAKM,MAAM;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACjD,CAAC;IAMM,OAAO,CAAE,IAAY;QAI1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,IAAI,GAAmB,IAAI,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAKO,YAAY,CAAE,IAAY;;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,SAAS,GAA8B,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAA;QACxG,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC/B,CAAC;QAED,MAAM,SAAS,GAA0B,MAAA,MAAA,IAAI,CAAC,OAAO,CAAC,GAAG,0CAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAA;QAE7F,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,GAA8B,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,mCAAI,IAAI,CAAA;YACpH,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAYS,UAAU,CAAE,SAA0B;;QAC9C,IAAI,GAAW,CAAA;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;QAC5B,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAA;YACzB,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpC,MAAM,CAAC,GAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAI,IAAI,CAAA;YAC3G,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,CAAA;YACX,CAAC;YACD,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACb,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,SAAS,CAAA;QACjB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAGS,YAAY,CAAE,GAAW;QACjC,MAAM,QAAQ,GAAa,IAAI,CAAC,oBAAoB,CAAA;QACpD,MAAM,SAAS,GAAa,IAAI,CAAC,qBAAqB,CAAA;QACtD,MAAM,QAAQ,GAAW,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC/C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,KAAK,GAAW,QAAQ,CAAC,MAAM,CAAA;QACrC,MAAM,IAAI,GAAW,KAAK,GAAG,CAAC,CAAA;QAC9B,IAAI,GAAG,GAAW,QAAQ,CAAA;QAC1B,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YACnB,IAAI,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC9B,MAAK;YACP,CAAC;YACD,EAAE,GAAG,CAAA;QACP,CAAC;QAED,IAAI,KAAK,GAAW,IAAI,GAAG,QAAQ,CAAA;QACnC,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBACjC,MAAK;YACP,CAAC;YACD,EAAE,KAAK,CAAA;QACT,CAAC;QACD,MAAM,KAAK,GAAW,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QACxC,MAAM,GAAG,GAAW,GAAG,GAAG,KAAK,CAAA;QAC/B,MAAM,SAAS,GAAa,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAW,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YACzC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC7C,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAES,WAAW,CAAE,GAAW;QAChC,MAAM,GAAG,GAAW,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAA;YACnC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAW,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1E,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IAEO,WAAW,CAAE,IAAY;;QAC/B,MAAM,SAAS,GAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAsB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;QACzE,MAAM,KAAK,GAAW,SAAS,CAAC,UAAU,EAAE,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAmB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YAC9D,UAAU,CAAC,CAAC,CAAC,GAAG,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,EAAE,mCAAI,IAAI,CAAA;QAC9C,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,OAAO,CAAE,GAAkB;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;YAC9B,KAAK,EAAE,CAAC,CAAe,EAAE,KAA0B,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;YACvF,MAAM,EAAE,CAAC,CAAe,EAAE,KAA2B,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;YAC1F,SAAS,EAAE,CAAC,CAAe,EAAE,KAA8B,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;SACnE,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,CAAe,CAAC,CAAe,EAAE,EAAwB,EAAE,EAAE;YACxH,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;YACzB,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAClD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACT,CAAC;IAEO,eAAe,CAAE,GAAkB,EAAE,IAAe;QAC1D,MAAM,OAAO,GAAG,IAAI,sBAAS,EAAY,CAAA;QACzC,MAAM,UAAU,GAA8B;YAC5C,KAAK,EAAE,CAAC,CAAW,EAAE,KAA0B,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;YACxF,MAAM,EAAE,CAAC,CAAW,EAAE,KAA2B,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;YACtF,SAAS,EAAE,CAAC,CAAW,EAAE,KAA8B,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;SAChG,CAAA;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAEO,aAAa,CAAE,EAAwB,EAAE,CAAW;QAC1D,IAAI,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAE,EAA2B,EAAE,CAAW;QAChE,MAAM,IAAI,GAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,GAAkB,EAAE,EAAuB,EAAE,IAAe;;QAChF,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QAC9E,MAAM,SAAS,GAAmB,MAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxF,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAW,SAAS,CAAC,UAAU,EAAE,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAmB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YAC9D,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAE,CAAe,EAAE,EAA2B;QACpE,MAAM,IAAI,GAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YACjC,IAAI,SAAS,EAAE,CAAC;gBACd,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa,CAAE,CAAe,EAAE,EAAwB;QAC9D,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;QACzB,MAAM,QAAQ,GAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAqD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACpF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,CAAe,EAAE,EAAuB;;QAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAA;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QAC1D,MAAM,SAAS,GAAwB,MAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAI,SAAS,EAAE,CAAC;YACd,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;QACzB,CAAC;IACH,CAAC;IAEO,YAAY,CAAE,GAAW;QAC/B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC,CAAA;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAA;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;YAC5B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAExB,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;gBACvE,QAAQ,CAAC,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC,CAAA;YAC/B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;gBACvH,QAAQ,CAAC,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC,CAAA;YAC/B,CAAC;YACD,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAA;QACzD,CAAC;QACD,OAAO,gBAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAEO,SAAS,CAAE,QAAqG;;QACtH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAChC,MAAM,MAAM,GAAkB,IAAI,8BAAa,EAAE,CAAA;QACjD,MAAM,OAAO,GAAuB,IAAI,CAAC,OAAO,CAAA;QAChD,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,EAAE,CAAA;QAChC,MAAM,IAAI,GAAS,SAAS,CAAC,IAAI,CAAA;QACjC,MAAM,KAAK,GAAW,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,aAAa,CAAA;QACjE,MAAM,MAAM,GAAuC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAE1E,KAAK,IAAI,CAAC,GAAW,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,KAAK,GAAsC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClF,MAAM,GAAG,GAAkB,MAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAA;YAEzD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAA;YAClI,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;IAC1B,CAAC;;AA5fH,0BA6fC;AArfkB,iBAAS,GAAG,CAAC,KAA4B,EAAE,GAAW,EAAE,CAAS,EAAE,KAAa,EAAE,EAAU,EAAU,EAAE;;IACvH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IACjC,IAAI,IAAY,CAAA;IAChB,IAAI,IAAY,CAAA;IAChB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;QACtG,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,IAAI,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;QAC1E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,SAAS,CAAA;QAChB,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,EAAE,CAAA;AAC/C,CAAC,AAhByB,CAgBzB;AAEgB,eAAO,GAAG,CAAC,KAA4B,EAAE,GAAW,EAAE,CAAS,EAAE,KAAa,EAAE,EAAU,EAAU,EAAE;IACrH,MAAM,OAAO,GAAW,CAAC,CAAA;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IAEjC,IAAI,IAAY,CAAA;IAChB,IAAI,IAAY,CAAA;IAChB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;QACf,IAAI,GAAG,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACpD,SAAS,GAAG,OAAO,CAAA;IACrB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,GAAG,SAAS,EAAE,CAAA;AAC3D,CAAC,AAxBuB,CAwBvB","sourcesContent":["import { TagPos } from './tag/tag-pos'\nimport { SegmentDescription } from './segment/segment-description'\nimport { Structure } from './structure'\nimport { Tags } from './tag/tags'\nimport {\n ContainedComponentField,\n ContainedField,\n IContainedSet,\n ContainedGroupField,\n ContainedSimpleField\n} from '../dictionary/contained'\nimport { SetReduce } from '../dictionary'\nimport { ILooseObject } from '../collections/collection'\nimport { ElasticBuffer } from './elastic-buffer'\nimport { FixDefinitions, GroupFieldDefinition, SimpleFieldDefinition } from '../dictionary/definition'\nimport { ITypeDispatcher } from '../dictionary/type-dispatcher'\nimport { ContainedSetType } from '../dictionary/contained-set-type'\n\nexport abstract class MsgView {\n protected sortedTagPosForwards: TagPos[]\n protected sortedTagPosBackwards: TagPos[]\n private readonly reducer: SetReduce<ILooseObject> = new SetReduce<ILooseObject>()\n\n protected constructor (public readonly definitions: FixDefinitions, public readonly segment: SegmentDescription, public readonly structure: Structure | null) {\n }\n\n protected static asVerbose = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const newLine = require('os').EOL\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]${newLine}\\t${field.description ?? ''}${newLine}${newLine}`\n } else {\n desc = `${val}${newLine}t${field.description ?? ''}${newLine}${newLine}`\n }\n } else {\n name = 'unknown'\n desc = 'na'\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}`\n }\n\n protected static asToken = (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos): string => {\n const perLine: number = 2\n const newLine = require('os').EOL\n // [280] 814 (ApplQueueResolution) = 2[OverlayLast][281] 10 (CheckSum) = 80\n let desc: string\n let name: string\n if (field) {\n name = field.name || 'unknown'\n if (field.isEnum()) {\n desc = `${val}[${field.resolveEnum(val)}]`\n } else {\n desc = `${val}`\n }\n } else {\n desc = `${val}`\n name = 'unknown'\n }\n let delimiter: string\n if (i === 1 || (i < count && i % perLine - 1 === 0)) {\n delimiter = newLine\n } else {\n delimiter = i < count ? ', ' : ''\n }\n return `[${i}] ${tp.tag} (${name}) = ${desc}${delimiter}`\n }\n\n // return list of any tags parsed that are not valid\n public invalid (): number[] {\n const invalidTags: number[] = []\n const set = this.segment.set\n if (set == null) return []\n const tags = this.structure?.tags ?? null\n if (tags == null) return []\n for (let i = 0; i < tags.nextTagPos; ++i) {\n const tag = tags.tagPos[i].tag\n if (tag <= 0 || !set.containedTag[tag]) {\n invalidTags[invalidTags.length] = tag\n }\n }\n return invalidTags\n }\n\n // list of tags that must be present\n public missing (): number[] {\n if (this.segment == null) return []\n if (this.segment.set == null) return []\n return this.missingRequired(this.segment.set, [])\n }\n\n /**\n * does this view contain this tag\n * @param tagOrName the name or tag of field to check 8 or BeginString\n */\n public contains (tagOrName: number | string): boolean {\n const tag: number = this.resolveTag(tagOrName)\n const position: number = this.getPosition(tag)\n return position >= 0\n }\n\n /**\n * if this view represents a repeated group then return a sub view representing\n * this instance of repeated group.\n * @param i the index to return i.e. 0 is first within repeated group\n */\n public getGroupInstance (i: number): MsgView | null {\n const instance: SegmentDescription | null = this.segment?.getInstance(i)\n if (!instance) {\n return null\n }\n return this.create(instance)\n }\n\n public getUndefined (): SegmentDescription | SegmentDescription[] | null {\n return this.structure?.layout['.undefined']\n }\n\n public undefinedForMsg (): string | null {\n let msg: string | null = null\n const undefinedTags = this.getUndefined()\n if (undefinedTags) {\n if (Array.isArray(undefinedTags)) {\n msg = 'undefined tags = ' + undefinedTags.map((e: SegmentDescription) => e.startTag.toString()).join(', ')\n } else {\n msg = `undefined tag = ${undefinedTags.startTag}`\n }\n }\n return msg\n }\n\n /**\n * if this view represents a repeated group then return number\n * of repeated instances within this view\n */\n public groupCount (): number {\n const positions = this.segment.delimiterPositions\n return positions ? positions.length : 0\n }\n\n /**\n * regardless of how this type is represented in data dictionary,\n * return its value as a string.\n * @param tagOrName name or tag to return 8 or BeginString\n */\n public getString (tagOrName: number | string): string | null {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const position: number = this.getPosition(tag)\n if (position < 0) {\n return null\n }\n return this.stringAtPosition(position)\n }\n\n /**\n * for a repeated group, one field may be repeted across each instance of a component\n * return all values for a specified field as array of strings\n * @param tagOrName the name of the repeated field to fetch\n */\n public getStrings (tagOrName: number | string | null = null): Array<(string | null)> | null {\n if (!tagOrName) {\n return this.allStrings()\n }\n tagOrName = tagOrName || -1\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const positions: number[] = this.getPositions(tag)\n if (positions == null) {\n return null\n }\n return positions.map((position: number) => {\n return this.stringAtPosition(position)\n })\n }\n\n /**\n * returns typed value of a sinple field within this view\n * @param tagOrName the name or tag of required field e.g. 8, BeginString\n */\n public getTyped (tagOrName: number | string): (boolean | string | number | Date | Buffer | null) {\n const tag: number = this.resolveTag(tagOrName)\n if (tag == null) {\n return null\n }\n const field: SimpleFieldDefinition | null = this.definitions.tagToSimple[tag] ?? null\n if (field == null) {\n return null\n }\n return this.toTyped(field)\n }\n\n /**\n * use a varargs list of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrNames list of tags e.g. 'BeginString', 'BodyLength', ...\n */\n public getTypedList (...tagOrNames: Array<number | string>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrNames.map((s) => this.getTyped(s))\n }\n\n /**\n * use an array of tags or tag names to fetch typed values for those fields within this view.\n * @param tagOrName the list of params as array ['BeginString','BodyLength', 'MsgType']\n */\n public getTypedTags (tagOrName: Array<string | number>): Array<boolean | string | number | Date | Buffer | null> {\n return tagOrName.map((s) => this.getTyped(s))\n }\n\n /**\n * produce an object representation of the view which when coupled with its\n * interface (generated against the same dictionary source) will allow easy\n * navigation of the object where a group is resolved to an array and simple\n * fields are properties. This is relatively expensive operation as every\n * field is fully resolved regardless of depth i.e. all groups and compoennts\n * are fully resolved.\n */\n public toObject (): ILooseObject | ILooseObject[] | null {\n const segment: SegmentDescription = this.segment\n if (segment.set == null) return null\n if (segment.delimiterTag) {\n switch (segment.set.type) {\n case ContainedSetType.Group: {\n return this.asInstances((segment.set as GroupFieldDefinition).name)\n }\n case ContainedSetType.Msg: {\n // this is a batch of messages\n const hdrView = this.getView('Hdr')\n const batch: ILooseObject = {}\n if (hdrView) {\n const name = hdrView.segment.set?.name ?? 'na'\n batch[name] = hdrView.toObject()\n }\n batch[segment.name] = this.asInstances(segment.name)\n return batch\n }\n }\n }\n return this.asLoose(segment.set)\n }\n\n /**\n * easy human-readable format showing each field, its position, value and resolved\n * enum.\n */\n public toString (): string {\n return this.stringify(MsgView.asToken)\n }\n\n public toVerbose (): string {\n return this.stringify(MsgView.asVerbose)\n }\n\n /**\n * a string in JSON format representing this view as an object\n */\n public toJson (): string {\n return JSON.stringify(this.toObject(), null, 4)\n }\n\n /**\n * fetch a nested view, either by a single name - getView('Instrument') - or by a\n * dotted path walked a step at a time - getView('Parties.PtysSubGrp')\n */\n public getView (name: string): MsgView | null {\n // the dotted form is the exception. resolve a plain name without paying for\n // the parts array and the closure a split and reduce would allocate - the\n // component walk in toObject and validate comes through here per component.\n if (!name.includes('.')) {\n return this.resolveChild(name)\n }\n let view: MsgView | null = this\n for (const part of name.split('.')) {\n view = view.resolveChild(part)\n if (!view) {\n return null\n }\n }\n return view\n }\n\n /**\n * resolve one step of a view path against this view\n */\n private resolveChild (name: string): MsgView | null {\n const structure = this.structure\n const singleton: SegmentDescription | null = structure?.firstContainedWithin(name, this.segment) ?? null\n if (singleton) {\n return this.create(singleton)\n }\n // is this a full name where abbreviation exists\n const component: ContainedField | null = this.segment.set?.localNameToField.get(name) ?? null\n\n if (component) {\n const abbreviated: SegmentDescription | null = structure?.firstContainedWithin(component.name, this.segment) ?? null\n if (abbreviated) {\n return this.create(abbreviated)\n }\n }\n return null\n }\n\n public abstract checksum (): number\n\n public abstract clone (): MsgView\n\n protected abstract create (singleton: SegmentDescription): MsgView\n\n protected abstract stringAtPosition (position: number): string | null\n\n protected abstract toTyped (field: SimpleFieldDefinition): boolean | string | number | Date | Buffer | null\n\n protected resolveTag (tagOrName: number | string): number {\n let tag: number\n const set = this.segment.set\n if (typeof (tagOrName) === 'string') {\n if (set == null) return 0\n const cf = set.simple.get(tagOrName)\n const f: SimpleFieldDefinition | null = cf ? cf.definition : this.definitions.simple.get(tagOrName) ?? null\n if (f == null) {\n return -1\n }\n tag = f.tag\n } else {\n tag = tagOrName\n }\n return tag\n }\n\n // fetch all positions of a particular tag.\n protected getPositions (tag: number): number[] {\n const forwards: TagPos[] = this.sortedTagPosForwards\n const backwards: TagPos[] = this.sortedTagPosBackwards\n const position: number = this.binarySearch(tag)\n if (position < 0) {\n return []\n }\n\n const count: number = forwards.length\n const last: number = count - 1\n let end: number = position\n while (end <= last) {\n if (tag !== forwards[end].tag) {\n break\n }\n ++end\n }\n // avoid backtracking over an array by scan forwards on a reversed copy\n let start: number = last - position\n while (start <= last) {\n if (tag !== backwards[start].tag) {\n break\n }\n ++start\n }\n const begin: number = last - (start - 1)\n const len: number = end - begin\n const positions: number[] = new Array(len)\n for (let i: number = begin; i < end; ++i) {\n positions[i - begin] = forwards[i].position\n }\n return positions\n }\n\n protected getPosition (tag: number): number {\n const pos: number = this.binarySearch(tag)\n if (pos >= 0) {\n return this.sortedTagPosForwards[pos].position\n } else {\n return -1\n }\n }\n\n private allStrings (): Array<(string | null)> {\n const segment: SegmentDescription = this.segment\n const range: number[] = []\n if (segment.segmentView) {\n for (const tp of segment.segmentView.tags) {\n range[range.length] = tp.position\n }\n } else {\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n range[range.length] = i\n }\n }\n return range.map((i: number) => this.stringAtPosition(i))\n }\n\n private asInstances (name: string): Array<ILooseObject | null> | null {\n const groupView: MsgView | null = this.getView(name)\n if (groupView == null) {\n return null\n }\n const groupArray = new Array<ILooseObject | null>(groupView.groupCount())\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n groupArray[j] = instance?.toObject() ?? null\n }\n return groupArray\n }\n\n private asLoose (def: IContainedSet): ILooseObject {\n\n return this.reducer.reduce(def, {\n group: (a: ILooseObject, field: ContainedGroupField) => { this.asLooseGroup(a, field) },\n simple: (a: ILooseObject, field: ContainedSimpleField) => { this.asLooseSimple(a, field) },\n component: (a: ILooseObject, field: ContainedComponentField) => { this.asLooseComponent(a, field) }\n } as ITypeDispatcher<ILooseObject>, def.localAttribute.reduce<ILooseObject>((a: ILooseObject, sf: ContainedSimpleField) => {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n a[def.name] = this.toTyped(def)\n }\n return a\n }, {}))\n }\n\n private missingRequired (def: IContainedSet, tags: number []): number[] {\n const reducer = new SetReduce<number[]>()\n const dispatcher: ITypeDispatcher<number[]> = {\n group: (a: number[], field: ContainedGroupField) => { this.missingGroup(def, field, a) },\n simple: (a: number[], field: ContainedSimpleField) => { this.missingSimple(field, a) },\n component: (a: number[], field: ContainedComponentField) => { this.missingComponent(field, a) }\n }\n return reducer.reduce(def, dispatcher, tags)\n }\n\n private missingSimple (sf: ContainedSimpleField, a: number[]): void {\n if (sf.required && this.getPosition(sf.definition.tag) < 0) {\n a.push(sf.definition.tag)\n }\n }\n\n private missingComponent (cf: ContainedComponentField, a: number[]): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n view.missingRequired(cf.definition, a)\n }\n }\n\n private missingGroup (def: IContainedSet, gf: ContainedGroupField, tags: number []): void {\n const name = gf.definition.noOfField ? gf.definition.noOfField.name : def.name\n const groupView: MsgView | null = this.getView(name) ?? this.getView(gf.definition.name)\n if (groupView == null) {\n return\n }\n const count: number = groupView.groupCount()\n for (let j: number = 0; j < count; ++j) {\n const instance: MsgView | null = groupView.getGroupInstance(j)\n instance?.missingRequired(gf.definition, tags)\n }\n }\n\n private asLooseComponent (a: ILooseObject, cf: ContainedComponentField): void {\n const view: MsgView | null = this.getView(cf.name)\n if (view) {\n const component = view.toObject()\n if (component) {\n a[cf.definition.name] = component\n }\n }\n }\n\n private asLooseSimple (a: ILooseObject, sf: ContainedSimpleField): void {\n const def = sf.definition\n const position: number = this.getPosition(def.tag)\n if (position >= 0) {\n const asSimple: boolean | string | number | Date | Buffer | null = this.toTyped(def)\n if (asSimple != null) { // beware, may be false value\n a[sf.name] = asSimple\n }\n }\n }\n\n private asLooseGroup (a: ILooseObject, gf: ContainedGroupField): void {\n const def = gf.definition\n const name = def.noOfField ? def.noOfField.name : def.name\n const instances: ILooseObject | null = this.asInstances(name) ?? this.asInstances(def.name)\n if (instances) {\n a[def.name] = instances\n }\n }\n\n private binarySearch (tag: number): number {\n if (this.structure == null) return -1\n let forwards = this.sortedTagPosForwards\n if (!forwards) {\n const segment = this.segment\n if (segment.segmentView) {\n // fragmented component: use the collected tags from SegmentView\n forwards = this.sortedTagPosForwards = segment.segmentView.tags.slice()\n forwards.sort(TagPos.compare)\n } else {\n forwards = this.sortedTagPosForwards = this.structure.tags.tagPos.slice(segment.startPosition, segment.endPosition + 1)\n forwards.sort(TagPos.compare)\n }\n this.sortedTagPosBackwards = forwards.slice().reverse()\n }\n return TagPos.binarySearch(forwards, tag)\n }\n\n private stringify (getToken: (field: SimpleFieldDefinition, val: string, i: number, count: number, tp: TagPos) => string): string {\n const structure = this.structure\n const buffer: ElasticBuffer = new ElasticBuffer()\n const segment: SegmentDescription = this.segment\n if (structure == null) return ''\n const tags: Tags = structure.tags\n const count: number = segment.endPosition - segment.startPosition\n const simple: Map<string, SimpleFieldDefinition> = this.definitions.simple\n\n for (let i: number = segment.startPosition; i <= segment.endPosition; ++i) {\n const tagPos: TagPos = tags.tagPos[i]\n const field: SimpleFieldDefinition | undefined = simple.get(tagPos.tag.toString())\n const val: string | null = this.stringAtPosition(i) ?? ''\n // [0] 8 (BeginString) = FIX4.4\n const token = field ? getToken(field, val, i - segment.startPosition, count, tagPos) : `[${i}] ${tagPos.tag} (unknown) = ${val}, `\n buffer.writeString(token)\n }\n\n return buffer.toString()\n }\n}\n"]}
|
|
@@ -13,7 +13,7 @@ export declare class DictionaryValidator {
|
|
|
13
13
|
private readonly referencedComponents;
|
|
14
14
|
private readonly allFieldNames;
|
|
15
15
|
private readonly allComponentNames;
|
|
16
|
-
get errors():
|
|
16
|
+
get errors(): readonly ValidationError[];
|
|
17
17
|
get hasErrors(): boolean;
|
|
18
18
|
get hasWarnings(): boolean;
|
|
19
19
|
validate(doc: XDocument): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictionary-validator.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/dictionary-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { XDocument, XNode } from './x-element'\nimport {\n DictionaryValidationException,\n ValidationError,\n ValidationSeverity\n} from './validation-error'\n\ninterface FieldDefinitionInfo {\n readonly name: string\n readonly tag: number\n readonly type: string\n readonly lineNumber?: number\n}\n\ninterface ComponentDefinitionInfo {\n readonly name: string\n readonly lineNumber?: number\n}\n\ninterface MessageDefinitionInfo {\n readonly name: string\n readonly msgType: string\n readonly lineNumber?: number\n}\n\n/**\n * Validates FIX dictionary XML for common errors like duplicates, missing references, etc.\n * Port of C# DictionaryValidator — operates on an XDocument tree built by SaxTreeBuilder.\n */\nexport class DictionaryValidator {\n private readonly _errors: ValidationError[] = []\n\n // Track definitions — case-sensitive for exact matching\n private readonly fieldsByName = new Map<string, FieldDefinitionInfo>()\n private readonly fieldsByTag = new Map<number, FieldDefinitionInfo>()\n private readonly componentsByName = new Map<string, ComponentDefinitionInfo>()\n private readonly messagesByName = new Map<string, MessageDefinitionInfo>()\n private readonly messagesByMsgType = new Map<string, MessageDefinitionInfo>()\n\n // Case-insensitive lookup for \"did you mean\" suggestions\n private readonly fieldNamesCaseInsensitive = new Map<string, string>()\n private readonly componentNamesCaseInsensitive = new Map<string, string>()\n\n // Track what's referenced (to find unused definitions)\n private readonly referencedFields = new Set<string>()\n private readonly referencedComponents = new Set<string>()\n\n // All known names for \"did you mean\" suggestions\n private readonly allFieldNames: string[] = []\n private readonly allComponentNames: string[] = []\n\n get errors (): ReadonlyArray<ValidationError> {\n return this._errors\n }\n\n get hasErrors (): boolean {\n return this._errors.some(e => e.severity === ValidationSeverity.Error)\n }\n\n get hasWarnings (): boolean {\n return this._errors.some(e => e.severity === ValidationSeverity.Warning)\n }\n\n validate (doc: XDocument): void {\n // First pass: collect all definitions\n this.collectFieldDefinitions(doc)\n this.collectComponentDefinitions(doc)\n this.collectMessageDefinitions(doc)\n\n // Second pass: validate references\n this.validateHeader(doc)\n this.validateTrailer(doc)\n this.validateComponentReferences(doc)\n this.validateMessageReferences(doc)\n\n // Third pass: check for unused definitions (warnings only)\n this.checkUnusedDefinitions()\n }\n\n throwIfErrors (): void {\n if (this.hasErrors) {\n throw new DictionaryValidationException(this._errors)\n }\n }\n\n // ── Field Validation ──\n\n private collectFieldDefinitions (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) {\n this.addError('MISSING_FIELDS', 'No <fields> section found in dictionary')\n return\n }\n\n for (const field of fieldsNode.elements('field')) {\n this.validateFieldDefinition(field)\n }\n }\n\n private validateFieldDefinition (field: XNode): void {\n const name = field.attribute('name')\n const numberStr = field.attribute('number')\n const type = field.attribute('type')\n const lineNumber = field.line\n\n if (!name) {\n this.addError('FIELD_NO_NAME', 'Field definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n const tag = numberStr != null ? parseInt(numberStr, 10) : NaN\n if (!numberStr || isNaN(tag)) {\n this.addError('FIELD_NO_TAG', `Field '${name}' missing or invalid 'number' attribute`, name, 'field', lineNumber)\n return\n }\n\n if (!type) {\n this.addWarning('FIELD_NO_TYPE', `Field '${name}' missing 'type' attribute, defaulting to STRING`, name, 'field', lineNumber)\n }\n\n this.allFieldNames.push(name)\n\n // Check for duplicate by name\n const existingByName = this.fieldsByName.get(name)\n if (existingByName) {\n this.addError('DUPLICATE_FIELD_NAME',\n `Duplicate field name '${name}' (tag ${tag}). Previously defined with tag ${existingByName.tag}`,\n name, 'field', lineNumber,\n existingByName.tag === tag ? 'Remove the duplicate definition' : 'Use unique field names')\n return\n }\n\n // Check for duplicate by tag\n const existingByTag = this.fieldsByTag.get(tag)\n if (existingByTag) {\n this.addError('DUPLICATE_FIELD_TAG',\n `Duplicate field tag ${tag} for '${name}'. Tag already used by field '${existingByTag.name}'`,\n name, 'field', lineNumber,\n 'Each tag number must be unique')\n return\n }\n\n const info: FieldDefinitionInfo = { name, tag, type: type ?? 'STRING', lineNumber }\n this.fieldsByName.set(name, info)\n this.fieldsByTag.set(tag, info)\n this.fieldNamesCaseInsensitive.set(name.toLowerCase(), name)\n\n this.validateFieldEnums(field, name, lineNumber)\n }\n\n private validateFieldEnums (field: XNode, fieldName: string, lineNumber?: number): void {\n const values = field.elements('value')\n if (values.length === 0) return\n\n const seenEnumKeys = new Set<string>()\n const seenEnumDescriptions = new Set<string>()\n\n for (const value of values) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description')\n const valueLine = value.line ?? lineNumber\n\n if (!enumKey) {\n this.addError('ENUM_NO_KEY', `Field '${fieldName}' has enum value without 'enum' attribute`,\n fieldName, 'field', valueLine)\n continue\n }\n\n if (!description) {\n this.addWarning('ENUM_NO_DESC', `Field '${fieldName}' enum '${enumKey}' has no description`,\n fieldName, 'field', valueLine)\n }\n\n if (seenEnumKeys.has(enumKey)) {\n this.addError('DUPLICATE_ENUM_KEY',\n `Field '${fieldName}' has duplicate enum key '${enumKey}'`,\n fieldName, 'field', valueLine)\n }\n seenEnumKeys.add(enumKey)\n\n if (description != null) {\n const descLower = description.toLowerCase()\n if (seenEnumDescriptions.has(descLower)) {\n this.addWarning('DUPLICATE_ENUM_DESC',\n `Field '${fieldName}' has duplicate enum description '${description}' which may cause naming conflicts`,\n fieldName, 'field', valueLine)\n }\n seenEnumDescriptions.add(descLower)\n }\n }\n }\n\n // ── Component Validation ──\n\n private collectComponentDefinitions (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) {\n // Components are optional\n return\n }\n\n for (const component of componentsNode.elements('component')) {\n this.validateComponentDefinition(component)\n }\n }\n\n private validateComponentDefinition (component: XNode): void {\n const name = component.attribute('name')\n const lineNumber = component.line\n\n if (!name) {\n this.addError('COMPONENT_NO_NAME', 'Component definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n this.allComponentNames.push(name)\n\n const existing = this.componentsByName.get(name)\n if (existing) {\n this.addError('DUPLICATE_COMPONENT',\n `Duplicate component name '${name}'`,\n name, 'component', lineNumber,\n `Previously defined at line ${existing.lineNumber ?? '?'}`)\n return\n }\n\n this.componentsByName.set(name, { name, lineNumber })\n this.componentNamesCaseInsensitive.set(name.toLowerCase(), name)\n\n this.validateFieldReferences(component, name, 'component')\n }\n\n // ── Message Validation ──\n\n private collectMessageDefinitions (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) {\n this.addError('MISSING_MESSAGES', 'No <messages> section found in dictionary')\n return\n }\n\n for (const message of messagesNode.elements('message')) {\n this.validateMessageDefinition(message)\n }\n }\n\n private validateMessageDefinition (message: XNode): void {\n const name = message.attribute('name')\n const msgType = message.attribute('msgtype')\n const lineNumber = message.line\n\n if (!name) {\n this.addError('MESSAGE_NO_NAME', 'Message definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n if (!msgType) {\n this.addError('MESSAGE_NO_MSGTYPE', `Message '${name}' missing 'msgtype' attribute`,\n name, 'message', lineNumber)\n return\n }\n\n const existingByName = this.messagesByName.get(name)\n if (existingByName) {\n this.addError('DUPLICATE_MESSAGE_NAME',\n `Duplicate message name '${name}'`,\n name, 'message', lineNumber,\n `Previously defined at line ${existingByName.lineNumber ?? '?'}`)\n return\n }\n\n const existingByType = this.messagesByMsgType.get(msgType)\n if (existingByType) {\n this.addError('DUPLICATE_MESSAGE_TYPE',\n `Duplicate message type '${msgType}' for message '${name}'. Type already used by '${existingByType.name}'`,\n name, 'message', lineNumber)\n return\n }\n\n const info: MessageDefinitionInfo = { name, msgType, lineNumber }\n this.messagesByName.set(name, info)\n this.messagesByMsgType.set(msgType, info)\n\n this.validateFieldReferences(message, name, 'message')\n }\n\n // ── Reference Validation ──\n\n private validateHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) {\n this.addError('MISSING_HEADER', 'No <header> section found in dictionary')\n return\n }\n this.validateFieldReferences(header, 'StandardHeader', 'header')\n }\n\n private validateTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) {\n this.addError('MISSING_TRAILER', 'No <trailer> section found in dictionary')\n return\n }\n this.validateFieldReferences(trailer, 'StandardTrailer', 'trailer')\n }\n\n private validateComponentReferences (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n\n for (const component of componentsNode.elements('component')) {\n const name = component.attribute('name')\n if (!name) continue\n\n for (const compRef of component.descendants('component')) {\n this.validateComponentReference(compRef, name, 'component')\n }\n }\n }\n\n private validateMessageReferences (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n\n for (const message of messagesNode.elements('message')) {\n const name = message.attribute('name')\n if (!name) continue\n\n for (const compRef of message.descendants('component')) {\n this.validateComponentReference(compRef, name, 'message')\n }\n }\n }\n\n private validateFieldReferences (container: XNode, containerName: string, containerType: string): void {\n for (const fieldRef of container.elements('field')) {\n const fieldName = fieldRef.attribute('name')\n const lineNumber = fieldRef.line\n\n if (!fieldName) {\n this.addError('FIELD_REF_NO_NAME',\n `Field reference in ${containerType} '${containerName}' missing 'name' attribute`,\n containerName, containerType, lineNumber)\n continue\n }\n\n this.referencedFields.add(fieldName)\n\n if (!this.fieldsByName.has(fieldName)) {\n // Check for case mismatch first\n const correctCase = this.fieldNamesCaseInsensitive.get(fieldName.toLowerCase())\n const suggestion = correctCase ?? DictionaryValidator.findSimilar(fieldName, this.allFieldNames)\n\n this.addError('UNDEFINED_FIELD',\n `Field '${fieldName}' referenced in ${containerType} '${containerName}' is not defined`,\n fieldName, 'field reference', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add the field to the <fields> section')\n }\n }\n\n // Recursively check groups\n for (const group of container.elements('group')) {\n const groupName = group.attribute('name') ?? 'unknown'\n this.referencedFields.add(groupName)\n\n if (groupName !== 'unknown' && !this.fieldsByName.has(groupName)) {\n const lineNumber = group.line\n const suggestion = DictionaryValidator.findSimilar(groupName, this.allFieldNames)\n\n this.addError('UNDEFINED_GROUP_FIELD',\n `Group '${groupName}' in ${containerType} '${containerName}' has no corresponding field definition (for the repeating count)`,\n groupName, 'group', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add a NUMINGROUP field for this group')\n }\n\n this.validateFieldReferences(group, `${containerName}.${groupName}`, 'group')\n }\n }\n\n private validateComponentReference (compRef: XNode, containerName: string, containerType: string): void {\n const compName = compRef.attribute('name')\n const lineNumber = compRef.line\n\n if (!compName) {\n this.addError('COMPONENT_REF_NO_NAME',\n `Component reference in ${containerType} '${containerName}' missing 'name' attribute`,\n containerName, containerType, lineNumber)\n return\n }\n\n this.referencedComponents.add(compName)\n\n if (!this.componentsByName.has(compName) &&\n compName !== 'StandardHeader' && compName !== 'StandardTrailer') {\n const suggestion = DictionaryValidator.findSimilar(compName, this.allComponentNames)\n this.addError('UNDEFINED_COMPONENT',\n `Component '${compName}' referenced in ${containerType} '${containerName}' is not defined`,\n compName, 'component reference', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add the component to the <components> section')\n }\n }\n\n private checkUnusedDefinitions (): void {\n for (const field of this.fieldsByName.values()) {\n if (!this.referencedFields.has(field.name)) {\n this.addWarning('UNUSED_FIELD',\n `Field '${field.name}' (tag ${field.tag}) is defined but never referenced`,\n field.name, 'field', field.lineNumber)\n }\n }\n\n for (const comp of this.componentsByName.values()) {\n if (!this.referencedComponents.has(comp.name)) {\n this.addWarning('UNUSED_COMPONENT',\n `Component '${comp.name}' is defined but never referenced`,\n comp.name, 'component', comp.lineNumber)\n }\n }\n }\n\n // ── Helpers ──\n\n private addError (code: string, message: string, elementName?: string,\n elementType?: string, lineNumber?: number, suggestion?: string): void {\n this._errors.push({ severity: ValidationSeverity.Error, code, message, elementName, elementType, lineNumber, suggestion })\n }\n\n private addWarning (code: string, message: string, elementName?: string,\n elementType?: string, lineNumber?: number, suggestion?: string): void {\n this._errors.push({ severity: ValidationSeverity.Warning, code, message, elementName, elementType, lineNumber, suggestion })\n }\n\n static findSimilar (input: string, candidates: string[]): string | null {\n let bestMatch: string | null = null\n let bestDistance = Infinity\n const maxDistance = Math.max(3, Math.floor(input.length / 2))\n const inputLower = input.toLowerCase()\n\n for (const candidate of candidates) {\n const distance = DictionaryValidator.levenshteinDistance(inputLower, candidate.toLowerCase())\n if (distance < bestDistance && distance <= maxDistance) {\n bestDistance = distance\n bestMatch = candidate\n }\n }\n\n return bestMatch\n }\n\n static levenshteinDistance (s1: string, s2: string): number {\n const n = s1.length\n const m = s2.length\n if (n === 0) return m\n if (m === 0) return n\n\n const d: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0))\n\n for (let i = 0; i <= n; i++) d[i][0] = i\n for (let j = 0; j <= m; j++) d[0][j] = j\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1\n d[i][j] = Math.min(\n d[i - 1][j] + 1,\n d[i][j - 1] + 1,\n d[i - 1][j - 1] + cost)\n }\n }\n\n return d[n][m]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dictionary-validator.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/dictionary-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { XDocument, XNode } from './x-element'\nimport {\n DictionaryValidationException,\n ValidationError,\n ValidationSeverity\n} from './validation-error'\n\ninterface FieldDefinitionInfo {\n readonly name: string\n readonly tag: number\n readonly type: string\n readonly lineNumber?: number\n}\n\ninterface ComponentDefinitionInfo {\n readonly name: string\n readonly lineNumber?: number\n}\n\ninterface MessageDefinitionInfo {\n readonly name: string\n readonly msgType: string\n readonly lineNumber?: number\n}\n\n/**\n * Validates FIX dictionary XML for common errors like duplicates, missing references, etc.\n * Port of C# DictionaryValidator — operates on an XDocument tree built by SaxTreeBuilder.\n */\nexport class DictionaryValidator {\n private readonly _errors: ValidationError[] = []\n\n // Track definitions — case-sensitive for exact matching\n private readonly fieldsByName = new Map<string, FieldDefinitionInfo>()\n private readonly fieldsByTag = new Map<number, FieldDefinitionInfo>()\n private readonly componentsByName = new Map<string, ComponentDefinitionInfo>()\n private readonly messagesByName = new Map<string, MessageDefinitionInfo>()\n private readonly messagesByMsgType = new Map<string, MessageDefinitionInfo>()\n\n // Case-insensitive lookup for \"did you mean\" suggestions\n private readonly fieldNamesCaseInsensitive = new Map<string, string>()\n private readonly componentNamesCaseInsensitive = new Map<string, string>()\n\n // Track what's referenced (to find unused definitions)\n private readonly referencedFields = new Set<string>()\n private readonly referencedComponents = new Set<string>()\n\n // All known names for \"did you mean\" suggestions\n private readonly allFieldNames: string[] = []\n private readonly allComponentNames: string[] = []\n\n get errors (): readonly ValidationError[] {\n return this._errors\n }\n\n get hasErrors (): boolean {\n return this._errors.some(e => e.severity === ValidationSeverity.Error)\n }\n\n get hasWarnings (): boolean {\n return this._errors.some(e => e.severity === ValidationSeverity.Warning)\n }\n\n validate (doc: XDocument): void {\n // First pass: collect all definitions\n this.collectFieldDefinitions(doc)\n this.collectComponentDefinitions(doc)\n this.collectMessageDefinitions(doc)\n\n // Second pass: validate references\n this.validateHeader(doc)\n this.validateTrailer(doc)\n this.validateComponentReferences(doc)\n this.validateMessageReferences(doc)\n\n // Third pass: check for unused definitions (warnings only)\n this.checkUnusedDefinitions()\n }\n\n throwIfErrors (): void {\n if (this.hasErrors) {\n throw new DictionaryValidationException(this._errors)\n }\n }\n\n // ── Field Validation ──\n\n private collectFieldDefinitions (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) {\n this.addError('MISSING_FIELDS', 'No <fields> section found in dictionary')\n return\n }\n\n for (const field of fieldsNode.elements('field')) {\n this.validateFieldDefinition(field)\n }\n }\n\n private validateFieldDefinition (field: XNode): void {\n const name = field.attribute('name')\n const numberStr = field.attribute('number')\n const type = field.attribute('type')\n const lineNumber = field.line\n\n if (!name) {\n this.addError('FIELD_NO_NAME', 'Field definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n const tag = numberStr != null ? parseInt(numberStr, 10) : NaN\n if (!numberStr || isNaN(tag)) {\n this.addError('FIELD_NO_TAG', `Field '${name}' missing or invalid 'number' attribute`, name, 'field', lineNumber)\n return\n }\n\n if (!type) {\n this.addWarning('FIELD_NO_TYPE', `Field '${name}' missing 'type' attribute, defaulting to STRING`, name, 'field', lineNumber)\n }\n\n this.allFieldNames.push(name)\n\n // Check for duplicate by name\n const existingByName = this.fieldsByName.get(name)\n if (existingByName) {\n this.addError('DUPLICATE_FIELD_NAME',\n `Duplicate field name '${name}' (tag ${tag}). Previously defined with tag ${existingByName.tag}`,\n name, 'field', lineNumber,\n existingByName.tag === tag ? 'Remove the duplicate definition' : 'Use unique field names')\n return\n }\n\n // Check for duplicate by tag\n const existingByTag = this.fieldsByTag.get(tag)\n if (existingByTag) {\n this.addError('DUPLICATE_FIELD_TAG',\n `Duplicate field tag ${tag} for '${name}'. Tag already used by field '${existingByTag.name}'`,\n name, 'field', lineNumber,\n 'Each tag number must be unique')\n return\n }\n\n const info: FieldDefinitionInfo = { name, tag, type: type ?? 'STRING', lineNumber }\n this.fieldsByName.set(name, info)\n this.fieldsByTag.set(tag, info)\n this.fieldNamesCaseInsensitive.set(name.toLowerCase(), name)\n\n this.validateFieldEnums(field, name, lineNumber)\n }\n\n private validateFieldEnums (field: XNode, fieldName: string, lineNumber?: number): void {\n const values = field.elements('value')\n if (values.length === 0) return\n\n const seenEnumKeys = new Set<string>()\n const seenEnumDescriptions = new Set<string>()\n\n for (const value of values) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description')\n const valueLine = value.line ?? lineNumber\n\n if (!enumKey) {\n this.addError('ENUM_NO_KEY', `Field '${fieldName}' has enum value without 'enum' attribute`,\n fieldName, 'field', valueLine)\n continue\n }\n\n if (!description) {\n this.addWarning('ENUM_NO_DESC', `Field '${fieldName}' enum '${enumKey}' has no description`,\n fieldName, 'field', valueLine)\n }\n\n if (seenEnumKeys.has(enumKey)) {\n this.addError('DUPLICATE_ENUM_KEY',\n `Field '${fieldName}' has duplicate enum key '${enumKey}'`,\n fieldName, 'field', valueLine)\n }\n seenEnumKeys.add(enumKey)\n\n if (description != null) {\n const descLower = description.toLowerCase()\n if (seenEnumDescriptions.has(descLower)) {\n this.addWarning('DUPLICATE_ENUM_DESC',\n `Field '${fieldName}' has duplicate enum description '${description}' which may cause naming conflicts`,\n fieldName, 'field', valueLine)\n }\n seenEnumDescriptions.add(descLower)\n }\n }\n }\n\n // ── Component Validation ──\n\n private collectComponentDefinitions (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) {\n // Components are optional\n return\n }\n\n for (const component of componentsNode.elements('component')) {\n this.validateComponentDefinition(component)\n }\n }\n\n private validateComponentDefinition (component: XNode): void {\n const name = component.attribute('name')\n const lineNumber = component.line\n\n if (!name) {\n this.addError('COMPONENT_NO_NAME', 'Component definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n this.allComponentNames.push(name)\n\n const existing = this.componentsByName.get(name)\n if (existing) {\n this.addError('DUPLICATE_COMPONENT',\n `Duplicate component name '${name}'`,\n name, 'component', lineNumber,\n `Previously defined at line ${existing.lineNumber ?? '?'}`)\n return\n }\n\n this.componentsByName.set(name, { name, lineNumber })\n this.componentNamesCaseInsensitive.set(name.toLowerCase(), name)\n\n this.validateFieldReferences(component, name, 'component')\n }\n\n // ── Message Validation ──\n\n private collectMessageDefinitions (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) {\n this.addError('MISSING_MESSAGES', 'No <messages> section found in dictionary')\n return\n }\n\n for (const message of messagesNode.elements('message')) {\n this.validateMessageDefinition(message)\n }\n }\n\n private validateMessageDefinition (message: XNode): void {\n const name = message.attribute('name')\n const msgType = message.attribute('msgtype')\n const lineNumber = message.line\n\n if (!name) {\n this.addError('MESSAGE_NO_NAME', 'Message definition missing \\'name\\' attribute', undefined, undefined, lineNumber)\n return\n }\n\n if (!msgType) {\n this.addError('MESSAGE_NO_MSGTYPE', `Message '${name}' missing 'msgtype' attribute`,\n name, 'message', lineNumber)\n return\n }\n\n const existingByName = this.messagesByName.get(name)\n if (existingByName) {\n this.addError('DUPLICATE_MESSAGE_NAME',\n `Duplicate message name '${name}'`,\n name, 'message', lineNumber,\n `Previously defined at line ${existingByName.lineNumber ?? '?'}`)\n return\n }\n\n const existingByType = this.messagesByMsgType.get(msgType)\n if (existingByType) {\n this.addError('DUPLICATE_MESSAGE_TYPE',\n `Duplicate message type '${msgType}' for message '${name}'. Type already used by '${existingByType.name}'`,\n name, 'message', lineNumber)\n return\n }\n\n const info: MessageDefinitionInfo = { name, msgType, lineNumber }\n this.messagesByName.set(name, info)\n this.messagesByMsgType.set(msgType, info)\n\n this.validateFieldReferences(message, name, 'message')\n }\n\n // ── Reference Validation ──\n\n private validateHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) {\n this.addError('MISSING_HEADER', 'No <header> section found in dictionary')\n return\n }\n this.validateFieldReferences(header, 'StandardHeader', 'header')\n }\n\n private validateTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) {\n this.addError('MISSING_TRAILER', 'No <trailer> section found in dictionary')\n return\n }\n this.validateFieldReferences(trailer, 'StandardTrailer', 'trailer')\n }\n\n private validateComponentReferences (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n\n for (const component of componentsNode.elements('component')) {\n const name = component.attribute('name')\n if (!name) continue\n\n for (const compRef of component.descendants('component')) {\n this.validateComponentReference(compRef, name, 'component')\n }\n }\n }\n\n private validateMessageReferences (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n\n for (const message of messagesNode.elements('message')) {\n const name = message.attribute('name')\n if (!name) continue\n\n for (const compRef of message.descendants('component')) {\n this.validateComponentReference(compRef, name, 'message')\n }\n }\n }\n\n private validateFieldReferences (container: XNode, containerName: string, containerType: string): void {\n for (const fieldRef of container.elements('field')) {\n const fieldName = fieldRef.attribute('name')\n const lineNumber = fieldRef.line\n\n if (!fieldName) {\n this.addError('FIELD_REF_NO_NAME',\n `Field reference in ${containerType} '${containerName}' missing 'name' attribute`,\n containerName, containerType, lineNumber)\n continue\n }\n\n this.referencedFields.add(fieldName)\n\n if (!this.fieldsByName.has(fieldName)) {\n // Check for case mismatch first\n const correctCase = this.fieldNamesCaseInsensitive.get(fieldName.toLowerCase())\n const suggestion = correctCase ?? DictionaryValidator.findSimilar(fieldName, this.allFieldNames)\n\n this.addError('UNDEFINED_FIELD',\n `Field '${fieldName}' referenced in ${containerType} '${containerName}' is not defined`,\n fieldName, 'field reference', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add the field to the <fields> section')\n }\n }\n\n // Recursively check groups\n for (const group of container.elements('group')) {\n const groupName = group.attribute('name') ?? 'unknown'\n this.referencedFields.add(groupName)\n\n if (groupName !== 'unknown' && !this.fieldsByName.has(groupName)) {\n const lineNumber = group.line\n const suggestion = DictionaryValidator.findSimilar(groupName, this.allFieldNames)\n\n this.addError('UNDEFINED_GROUP_FIELD',\n `Group '${groupName}' in ${containerType} '${containerName}' has no corresponding field definition (for the repeating count)`,\n groupName, 'group', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add a NUMINGROUP field for this group')\n }\n\n this.validateFieldReferences(group, `${containerName}.${groupName}`, 'group')\n }\n }\n\n private validateComponentReference (compRef: XNode, containerName: string, containerType: string): void {\n const compName = compRef.attribute('name')\n const lineNumber = compRef.line\n\n if (!compName) {\n this.addError('COMPONENT_REF_NO_NAME',\n `Component reference in ${containerType} '${containerName}' missing 'name' attribute`,\n containerName, containerType, lineNumber)\n return\n }\n\n this.referencedComponents.add(compName)\n\n if (!this.componentsByName.has(compName) &&\n compName !== 'StandardHeader' && compName !== 'StandardTrailer') {\n const suggestion = DictionaryValidator.findSimilar(compName, this.allComponentNames)\n this.addError('UNDEFINED_COMPONENT',\n `Component '${compName}' referenced in ${containerType} '${containerName}' is not defined`,\n compName, 'component reference', lineNumber,\n suggestion != null ? `Did you mean '${suggestion}'?` : 'Add the component to the <components> section')\n }\n }\n\n private checkUnusedDefinitions (): void {\n for (const field of this.fieldsByName.values()) {\n if (!this.referencedFields.has(field.name)) {\n this.addWarning('UNUSED_FIELD',\n `Field '${field.name}' (tag ${field.tag}) is defined but never referenced`,\n field.name, 'field', field.lineNumber)\n }\n }\n\n for (const comp of this.componentsByName.values()) {\n if (!this.referencedComponents.has(comp.name)) {\n this.addWarning('UNUSED_COMPONENT',\n `Component '${comp.name}' is defined but never referenced`,\n comp.name, 'component', comp.lineNumber)\n }\n }\n }\n\n // ── Helpers ──\n\n private addError (code: string, message: string, elementName?: string,\n elementType?: string, lineNumber?: number, suggestion?: string): void {\n this._errors.push({ severity: ValidationSeverity.Error, code, message, elementName, elementType, lineNumber, suggestion })\n }\n\n private addWarning (code: string, message: string, elementName?: string,\n elementType?: string, lineNumber?: number, suggestion?: string): void {\n this._errors.push({ severity: ValidationSeverity.Warning, code, message, elementName, elementType, lineNumber, suggestion })\n }\n\n static findSimilar (input: string, candidates: string[]): string | null {\n let bestMatch: string | null = null\n let bestDistance = Infinity\n const maxDistance = Math.max(3, Math.floor(input.length / 2))\n const inputLower = input.toLowerCase()\n\n for (const candidate of candidates) {\n const distance = DictionaryValidator.levenshteinDistance(inputLower, candidate.toLowerCase())\n if (distance < bestDistance && distance <= maxDistance) {\n bestDistance = distance\n bestMatch = candidate\n }\n }\n\n return bestMatch\n }\n\n static levenshteinDistance (s1: string, s2: string): number {\n const n = s1.length\n const m = s2.length\n if (n === 0) return m\n if (m === 0) return n\n\n const d: number[][] = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0))\n\n for (let i = 0; i <= n; i++) d[i][0] = i\n for (let j = 0; j <= m; j++) d[0][j] = j\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1\n d[i][j] = Math.min(\n d[i - 1][j] + 1,\n d[i][j - 1] + 1,\n d[i - 1][j - 1] + cost)\n }\n }\n\n return d[n][m]\n }\n}\n"]}
|
|
@@ -24,7 +24,7 @@ export declare class GraphNode {
|
|
|
24
24
|
readonly element: XNode;
|
|
25
25
|
private readonly _edges;
|
|
26
26
|
constructor(id: number, name: string, type: NodeElementType, element: XNode);
|
|
27
|
-
get edges():
|
|
27
|
+
get edges(): readonly Edge[];
|
|
28
28
|
makeEdge(tail: number): Edge;
|
|
29
29
|
isRequired(): boolean;
|
|
30
30
|
toString(): string;
|
|
@@ -81,8 +81,7 @@ class QuickFixGraphParser {
|
|
|
81
81
|
this.parseHeader(doc);
|
|
82
82
|
this.parseTrailer(doc);
|
|
83
83
|
this.parseMessages(doc);
|
|
84
|
-
|
|
85
|
-
const node = this.queue.shift();
|
|
84
|
+
for (let node = this.queue.shift(); node !== undefined; node = this.queue.shift()) {
|
|
86
85
|
this.work(node);
|
|
87
86
|
}
|
|
88
87
|
new index_visitor_1.IndexVisitor().compute(this.definitions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quick-fix-graph-parser.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/quick-fix-graph-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Graph-based QuickFix XML dictionary parser.\n *\n * Verbatim port of C# QuickFixXmlFileParser. Uses XDocument tree (from SaxTreeBuilder)\n * for random-access XML traversal and a Node/Edge/work-queue pattern for forward\n * reference resolution. Replaces the iterative N-pass SAX-streaming approach.\n *\n * Pre-parse validation via DictionaryValidator catches missing fields, duplicates,\n * and undefined references with \"did you mean\" suggestions before parsing begins.\n */\nimport { XDocument, XNode } from './x-element'\nimport { SaxTreeBuilder } from './sax-tree-builder'\nimport { DictionaryValidator } from './dictionary-validator'\nimport { FixDefinitions } from '../../definition/fix-definitions'\nimport { SimpleFieldDefinition } from '../../definition/simple-field-definition'\nimport { ComponentFieldDefinition } from '../../definition/component-field-definition'\nimport { GroupFieldDefinition } from '../../definition/group-field-definition'\nimport { MessageDefinition } from '../../definition/message-definition'\nimport { ContainedFieldSet } from '../../contained/contained-field-set'\nimport { ContainedSimpleField } from '../../contained/contained-simple-field'\nimport { ContainedComponentField } from '../../contained/contained-component-field'\nimport { ContainedGroupField } from '../../contained/contained-group-field'\nimport { ContainedSetBuilder } from '../../contained/contained-set-builder'\nimport { FixDefinitionSource } from '../../fix-definition-source'\nimport { VersionUtil } from '../../version-util'\nimport { IndexVisitor } from './index-visitor'\n\nexport enum NodeElementType {\n MessageDefinition = 'MessageDefinition',\n SimpleFieldDefinition = 'SimpleFieldDefinition',\n SimpleFieldDeclaration = 'SimpleFieldDeclaration',\n InlineGroupDefinition = 'InlineGroupDefinition',\n GroupDefinition = 'GroupDefinition',\n GroupDeclaration = 'GroupDeclaration',\n ComponentDefinition = 'ComponentDefinition',\n ComponentDeclaration = 'ComponentDeclaration'\n}\n\nexport interface Edge {\n readonly head: number\n readonly tail: number\n}\n\nexport class GraphNode {\n private readonly _edges: Edge[] = []\n\n constructor (\n public readonly id: number,\n public readonly name: string,\n public readonly type: NodeElementType,\n public readonly element: XNode\n ) {}\n\n get edges (): ReadonlyArray<Edge> {\n return this._edges\n }\n\n makeEdge (tail: number): Edge {\n const edge: Edge = { head: this.id, tail }\n this._edges.push(edge)\n return edge\n }\n\n isRequired (): boolean {\n if (this.name === 'StandardHeader' || this.name === 'StandardTrailer') return true\n return this.element.attribute('required') === 'Y'\n }\n\n toString (): string {\n return `Node: id=${this.id}, name=${this.name}, type=${this.type}`\n }\n}\n\nexport interface QuickFixGraphParserOptions {\n validateBeforeParsing?: boolean\n}\n\nexport class QuickFixGraphParser {\n private readonly definitions: FixDefinitions\n private readonly nodes = new Map<number, GraphNode>()\n private readonly containedSets = new Map<number, ContainedFieldSet>()\n private readonly queue: GraphNode[] = []\n private nextId = 0\n private header: GraphNode | null = null\n private trailer: GraphNode | null = null\n\n public validator: DictionaryValidator | null = null\n public readonly validateBeforeParsing: boolean\n\n constructor (definitions: FixDefinitions, options: QuickFixGraphParserOptions = {}) {\n this.definitions = definitions\n this.validateBeforeParsing = options.validateBeforeParsing ?? true\n }\n\n /**\n * Parse XML text into the FixDefinitions provided at construction.\n * Throws DictionaryValidationException if validation is enabled and errors are found.\n */\n parseText (xml: string): FixDefinitions {\n const doc = SaxTreeBuilder.parse(xml)\n return this.parseDocument(doc)\n }\n\n /**\n * Parse a pre-built XDocument tree.\n */\n parseDocument (doc: XDocument): FixDefinitions {\n if (this.validateBeforeParsing) {\n this.validator = new DictionaryValidator()\n this.validator.validate(doc)\n this.validator.throwIfErrors()\n }\n\n this.parseVersion(doc)\n this.parseFields(doc)\n this.parseComponents(doc)\n this.parseHeader(doc)\n this.parseTrailer(doc)\n this.parseMessages(doc)\n\n while (this.queue.length > 0) {\n const node = this.queue.shift()!\n this.work(node)\n }\n\n /*\n * At this point all fields on all sets are placed, however the parent (e.g. an\n * Instrument component) is not aware of the tags contained in nested groups/components\n * that were resolved AFTER it. The IndexVisitor walks every message and re-indexes\n * its tree post-order so each set knows all tags below it — essential for the segment\n * parser to work.\n */\n new IndexVisitor().compute(this.definitions)\n\n return this.definitions\n }\n\n // ── Graph construction ──\n\n private makeNode (name: string, element: XNode, type: NodeElementType): GraphNode {\n const node = new GraphNode(this.nextId++, name, type, element)\n this.nodes.set(node.id, node)\n this.queue.push(node)\n return node\n }\n\n private constructTailNode (name: string, headNode: GraphNode, element: XNode, type: NodeElementType): void {\n const tailNode = this.makeNode(name, element, type)\n headNode.makeEdge(tailNode.id)\n tailNode.makeEdge(headNode.id)\n }\n\n // ── Parsing entry points ──\n\n private parseVersion (doc: XDocument): void {\n const version = doc.firstDescendant('fix')\n if (!version) throw new Error('no <fix> root element')\n const major = parseInt(version.attribute('major') ?? '0', 10)\n const minor = parseInt(version.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(version.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const resolved = VersionUtil.resolve(description)\n // FixDefinitions doesn't have a setVersion — version is set at construction\n if (resolved !== this.definitions.version) {\n throw new Error(`version mismatch: dictionary declares ${description} but FixDefinitions was constructed with ${this.definitions.version}`)\n }\n }\n\n private parseFields (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) return\n for (const fieldElement of fieldsNode.elements('field')) {\n this.makeNode(QuickFixGraphParser.nameFrom(fieldElement), fieldElement, NodeElementType.SimpleFieldDefinition)\n }\n }\n\n private parseComponents (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n for (const componentElement of componentsNode.elements('component')) {\n this.makeNode(QuickFixGraphParser.nameFrom(componentElement), componentElement, NodeElementType.ComponentDefinition)\n }\n }\n\n private parseHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) throw new Error('no header declared in fix definitions')\n this.header = this.makeNode('StandardHeader', header, NodeElementType.ComponentDefinition)\n }\n\n private parseTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) throw new Error('no trailer declared in fix definitions')\n this.trailer = this.makeNode('StandardTrailer', trailer, NodeElementType.ComponentDefinition)\n }\n\n private parseMessages (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n for (const messageElement of messagesNode.elements('message')) {\n const msgType = messageElement.attribute('msgtype')\n if (!msgType) continue\n this.makeNode(msgType, messageElement, NodeElementType.MessageDefinition)\n }\n }\n\n // ── Work queue dispatch ──\n\n private work (node: GraphNode): void {\n switch (node.type) {\n case NodeElementType.SimpleFieldDefinition: {\n const sd = QuickFixGraphParser.getField(node.element)\n this.definitions.addSimpleFieldDef(sd)\n break\n }\n case NodeElementType.MessageDefinition: {\n this.messageDefinition(node)\n break\n }\n case NodeElementType.ComponentDefinition: {\n this.componentDefinition(node)\n break\n }\n case NodeElementType.SimpleFieldDeclaration: {\n this.simpleFieldDeclaration(node)\n break\n }\n case NodeElementType.InlineGroupDefinition: {\n this.inlineGroupDefinition(node)\n break\n }\n case NodeElementType.GroupDefinition: {\n this.groupDefinition(node)\n break\n }\n case NodeElementType.ComponentDeclaration: {\n this.componentDeclaration(node)\n break\n }\n case NodeElementType.GroupDeclaration: {\n // QuickFix XML never has standalone group declarations — groups are always inline\n break\n }\n }\n }\n\n // ── Definition handlers ──\n\n private getComponentDefinition (node: GraphNode): ComponentFieldDefinition {\n let definition = this.definitions.component.get(node.name)\n if (definition) return definition\n definition = new ComponentFieldDefinition(node.name, node.name, null, node.name)\n this.definitions.addComponentFieldDef(definition)\n return definition\n }\n\n private componentDeclaration (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n const edge = node.edges[0]\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set on which to place declared component '${node.name}'`)\n }\n const containedComponent = new ContainedComponentField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedComponent)\n this.containedSets.set(edge.head, definition)\n }\n\n private messageDefinition (node: GraphNode): void {\n if (!this.header) throw new Error('header not set')\n if (!this.trailer) throw new Error('trailer not set')\n\n const md = QuickFixGraphParser.getMessage(node.element)\n this.definitions.addMessage(md)\n this.containedSets.set(node.id, md)\n\n // wrap the message body in StandardHeader + content + StandardTrailer\n this.constructTailNode('StandardHeader', node, this.header.element, NodeElementType.ComponentDeclaration)\n this.expandSet(node)\n this.constructTailNode('StandardTrailer', node, this.trailer.element, NodeElementType.ComponentDeclaration)\n }\n\n private componentDefinition (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n this.containedSets.set(node.id, definition)\n this.expandSet(node)\n }\n\n private groupDefinition (node: GraphNode): void {\n const tail = node.edges[0]?.tail\n if (tail == null) {\n throw new Error(`node ${node} has no edges to find tail for group definition`)\n }\n const definition = this.containedSets.get(tail)\n if (!definition) {\n throw new Error(`node ${node} has no contained set for group definition`)\n }\n this.containedSets.set(node.edges[0].head, definition)\n this.expandSet(node)\n }\n\n private inlineGroupDefinition (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for inline group definition`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for inline group '${node.name}'`)\n }\n const noOFieldDefinition = this.definitions.simple.get(node.name)\n if (!noOFieldDefinition) {\n throw new Error(`${node.name} does not exist in simple field definitions to construct inline group`)\n }\n const name = node.name\n const definition = new GroupFieldDefinition(name, name, null, noOFieldDefinition, name)\n const containedGroup = new ContainedGroupField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedGroup)\n this.containedSets.set(edge.head, definition)\n this.constructTailNode(name, node, node.element, NodeElementType.GroupDefinition)\n }\n\n private simpleFieldDeclaration (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for simple field declaration`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for declared field '${node.name}'`)\n }\n const sd = this.definitions.simple.get(node.name)\n if (!sd) {\n throw new Error(`element ${node} cannot be located as a simple field`)\n }\n const containedSimpleField = new ContainedSimpleField(sd, parentSet.fields.length, node.isRequired(), false)\n new ContainedSetBuilder(parentSet).add(containedSimpleField)\n }\n\n // ── Set expansion ──\n\n /**\n * Walks the children of a definition node and constructs tail nodes for each\n * field/group/component reference, queuing them for resolution.\n */\n private expandSet (node: GraphNode): void {\n for (const child of node.element.elements()) {\n switch (child.name) {\n case 'field': {\n this.expandField(node, child)\n break\n }\n case 'group': {\n this.expandGroup(node, child)\n break\n }\n case 'component': {\n this.expandComponent(node, child)\n break\n }\n }\n }\n }\n\n private expandField (node: GraphNode, element: XNode): void {\n this.constructTailNode(QuickFixGraphParser.nameFrom(element), node, element, NodeElementType.SimpleFieldDeclaration)\n }\n\n private expandGroup (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.InlineGroupDefinition, NodeElementType.GroupDeclaration)\n }\n\n private expandComponent (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.ComponentDefinition, NodeElementType.ComponentDeclaration)\n }\n\n private expandSetChild (\n node: GraphNode,\n element: XNode,\n defineElement: NodeElementType,\n declareElement: NodeElementType\n ): void {\n const name = QuickFixGraphParser.nameFrom(element)\n const hasInlinedFields = element.elements().length > 0\n const elementType = hasInlinedFields ? defineElement : declareElement\n this.constructTailNode(name, node, element, elementType)\n }\n\n // ── Static helpers ──\n\n /**\n * Extract a name from an element's attributes, with the same conventions as the C# parser:\n * strip spaces, prefix with 'F' if the name starts with a digit.\n */\n static nameFrom (element: XNode): string {\n let name = element.attribute('name') ?? ''\n name = name.replace(/ /g, '')\n if (name.length > 0 && name[0] >= '0' && name[0] <= '9') {\n name = `F${name}`\n }\n return name\n }\n\n static getField (element: XNode): SimpleFieldDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const numberStr = element.attribute('number')\n const tag = numberStr != null ? parseInt(numberStr, 10) : -1\n if (tag < 0) throw new Error(`no tag/number for ${name}`)\n const type = element.attribute('type') ?? 'STRING'\n\n const sd = new SimpleFieldDefinition(String(tag), name, name, null, null, type, null)\n // Add enum values\n for (const value of element.elements('value')) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description') ?? ''\n if (enumKey != null) {\n sd.addEnum(enumKey, description, description)\n }\n }\n return sd\n }\n\n static getMessage (element: XNode): MessageDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const msgCat = element.attribute('msgcat') ?? ''\n const msgType = element.attribute('msgtype') ?? ''\n return new MessageDefinition(name, name, msgType, msgCat, name)\n }\n\n /**\n * Convenience: parse XML text into a fresh FixDefinitions.\n */\n static parse (xml: string, options: QuickFixGraphParserOptions = {}): FixDefinitions {\n // Pre-parse the version so we can construct FixDefinitions correctly\n const doc = SaxTreeBuilder.parse(xml)\n const fixRoot = doc.firstDescendant('fix')\n if (!fixRoot) throw new Error('no <fix> root element')\n const major = parseInt(fixRoot.attribute('major') ?? '0', 10)\n const minor = parseInt(fixRoot.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(fixRoot.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const definitions = new FixDefinitions(FixDefinitionSource.QuickFix, VersionUtil.resolve(description))\n const parser = new QuickFixGraphParser(definitions, options)\n return parser.parseDocument(doc)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"quick-fix-graph-parser.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/quick-fix-graph-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Graph-based QuickFix XML dictionary parser.\n *\n * Verbatim port of C# QuickFixXmlFileParser. Uses XDocument tree (from SaxTreeBuilder)\n * for random-access XML traversal and a Node/Edge/work-queue pattern for forward\n * reference resolution. Replaces the iterative N-pass SAX-streaming approach.\n *\n * Pre-parse validation via DictionaryValidator catches missing fields, duplicates,\n * and undefined references with \"did you mean\" suggestions before parsing begins.\n */\nimport { XDocument, XNode } from './x-element'\nimport { SaxTreeBuilder } from './sax-tree-builder'\nimport { DictionaryValidator } from './dictionary-validator'\nimport { FixDefinitions } from '../../definition/fix-definitions'\nimport { SimpleFieldDefinition } from '../../definition/simple-field-definition'\nimport { ComponentFieldDefinition } from '../../definition/component-field-definition'\nimport { GroupFieldDefinition } from '../../definition/group-field-definition'\nimport { MessageDefinition } from '../../definition/message-definition'\nimport { ContainedFieldSet } from '../../contained/contained-field-set'\nimport { ContainedSimpleField } from '../../contained/contained-simple-field'\nimport { ContainedComponentField } from '../../contained/contained-component-field'\nimport { ContainedGroupField } from '../../contained/contained-group-field'\nimport { ContainedSetBuilder } from '../../contained/contained-set-builder'\nimport { FixDefinitionSource } from '../../fix-definition-source'\nimport { VersionUtil } from '../../version-util'\nimport { IndexVisitor } from './index-visitor'\n\nexport enum NodeElementType {\n MessageDefinition = 'MessageDefinition',\n SimpleFieldDefinition = 'SimpleFieldDefinition',\n SimpleFieldDeclaration = 'SimpleFieldDeclaration',\n InlineGroupDefinition = 'InlineGroupDefinition',\n GroupDefinition = 'GroupDefinition',\n GroupDeclaration = 'GroupDeclaration',\n ComponentDefinition = 'ComponentDefinition',\n ComponentDeclaration = 'ComponentDeclaration'\n}\n\nexport interface Edge {\n readonly head: number\n readonly tail: number\n}\n\nexport class GraphNode {\n private readonly _edges: Edge[] = []\n\n constructor (\n public readonly id: number,\n public readonly name: string,\n public readonly type: NodeElementType,\n public readonly element: XNode\n ) {}\n\n get edges (): readonly Edge[] {\n return this._edges\n }\n\n makeEdge (tail: number): Edge {\n const edge: Edge = { head: this.id, tail }\n this._edges.push(edge)\n return edge\n }\n\n isRequired (): boolean {\n if (this.name === 'StandardHeader' || this.name === 'StandardTrailer') return true\n return this.element.attribute('required') === 'Y'\n }\n\n toString (): string {\n return `Node: id=${this.id}, name=${this.name}, type=${this.type}`\n }\n}\n\nexport interface QuickFixGraphParserOptions {\n validateBeforeParsing?: boolean\n}\n\nexport class QuickFixGraphParser {\n private readonly definitions: FixDefinitions\n private readonly nodes = new Map<number, GraphNode>()\n private readonly containedSets = new Map<number, ContainedFieldSet>()\n private readonly queue: GraphNode[] = []\n private nextId = 0\n private header: GraphNode | null = null\n private trailer: GraphNode | null = null\n\n public validator: DictionaryValidator | null = null\n public readonly validateBeforeParsing: boolean\n\n constructor (definitions: FixDefinitions, options: QuickFixGraphParserOptions = {}) {\n this.definitions = definitions\n this.validateBeforeParsing = options.validateBeforeParsing ?? true\n }\n\n /**\n * Parse XML text into the FixDefinitions provided at construction.\n * Throws DictionaryValidationException if validation is enabled and errors are found.\n */\n parseText (xml: string): FixDefinitions {\n const doc = SaxTreeBuilder.parse(xml)\n return this.parseDocument(doc)\n }\n\n /**\n * Parse a pre-built XDocument tree.\n */\n parseDocument (doc: XDocument): FixDefinitions {\n if (this.validateBeforeParsing) {\n this.validator = new DictionaryValidator()\n this.validator.validate(doc)\n this.validator.throwIfErrors()\n }\n\n this.parseVersion(doc)\n this.parseFields(doc)\n this.parseComponents(doc)\n this.parseHeader(doc)\n this.parseTrailer(doc)\n this.parseMessages(doc)\n\n for (let node = this.queue.shift(); node !== undefined; node = this.queue.shift()) {\n this.work(node)\n }\n\n /*\n * At this point all fields on all sets are placed, however the parent (e.g. an\n * Instrument component) is not aware of the tags contained in nested groups/components\n * that were resolved AFTER it. The IndexVisitor walks every message and re-indexes\n * its tree post-order so each set knows all tags below it — essential for the segment\n * parser to work.\n */\n new IndexVisitor().compute(this.definitions)\n\n return this.definitions\n }\n\n // ── Graph construction ──\n\n private makeNode (name: string, element: XNode, type: NodeElementType): GraphNode {\n const node = new GraphNode(this.nextId++, name, type, element)\n this.nodes.set(node.id, node)\n this.queue.push(node)\n return node\n }\n\n private constructTailNode (name: string, headNode: GraphNode, element: XNode, type: NodeElementType): void {\n const tailNode = this.makeNode(name, element, type)\n headNode.makeEdge(tailNode.id)\n tailNode.makeEdge(headNode.id)\n }\n\n // ── Parsing entry points ──\n\n private parseVersion (doc: XDocument): void {\n const version = doc.firstDescendant('fix')\n if (!version) throw new Error('no <fix> root element')\n const major = parseInt(version.attribute('major') ?? '0', 10)\n const minor = parseInt(version.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(version.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const resolved = VersionUtil.resolve(description)\n // FixDefinitions doesn't have a setVersion — version is set at construction\n if (resolved !== this.definitions.version) {\n throw new Error(`version mismatch: dictionary declares ${description} but FixDefinitions was constructed with ${this.definitions.version}`)\n }\n }\n\n private parseFields (doc: XDocument): void {\n const fieldsNode = doc.firstDescendant('fields')\n if (!fieldsNode) return\n for (const fieldElement of fieldsNode.elements('field')) {\n this.makeNode(QuickFixGraphParser.nameFrom(fieldElement), fieldElement, NodeElementType.SimpleFieldDefinition)\n }\n }\n\n private parseComponents (doc: XDocument): void {\n const componentsNode = doc.firstDescendant('components')\n if (!componentsNode) return\n for (const componentElement of componentsNode.elements('component')) {\n this.makeNode(QuickFixGraphParser.nameFrom(componentElement), componentElement, NodeElementType.ComponentDefinition)\n }\n }\n\n private parseHeader (doc: XDocument): void {\n const header = doc.firstDescendant('header')\n if (!header) throw new Error('no header declared in fix definitions')\n this.header = this.makeNode('StandardHeader', header, NodeElementType.ComponentDefinition)\n }\n\n private parseTrailer (doc: XDocument): void {\n const trailer = doc.firstDescendant('trailer')\n if (!trailer) throw new Error('no trailer declared in fix definitions')\n this.trailer = this.makeNode('StandardTrailer', trailer, NodeElementType.ComponentDefinition)\n }\n\n private parseMessages (doc: XDocument): void {\n const messagesNode = doc.firstDescendant('messages')\n if (!messagesNode) return\n for (const messageElement of messagesNode.elements('message')) {\n const msgType = messageElement.attribute('msgtype')\n if (!msgType) continue\n this.makeNode(msgType, messageElement, NodeElementType.MessageDefinition)\n }\n }\n\n // ── Work queue dispatch ──\n\n private work (node: GraphNode): void {\n switch (node.type) {\n case NodeElementType.SimpleFieldDefinition: {\n const sd = QuickFixGraphParser.getField(node.element)\n this.definitions.addSimpleFieldDef(sd)\n break\n }\n case NodeElementType.MessageDefinition: {\n this.messageDefinition(node)\n break\n }\n case NodeElementType.ComponentDefinition: {\n this.componentDefinition(node)\n break\n }\n case NodeElementType.SimpleFieldDeclaration: {\n this.simpleFieldDeclaration(node)\n break\n }\n case NodeElementType.InlineGroupDefinition: {\n this.inlineGroupDefinition(node)\n break\n }\n case NodeElementType.GroupDefinition: {\n this.groupDefinition(node)\n break\n }\n case NodeElementType.ComponentDeclaration: {\n this.componentDeclaration(node)\n break\n }\n case NodeElementType.GroupDeclaration: {\n // QuickFix XML never has standalone group declarations — groups are always inline\n break\n }\n }\n }\n\n // ── Definition handlers ──\n\n private getComponentDefinition (node: GraphNode): ComponentFieldDefinition {\n let definition = this.definitions.component.get(node.name)\n if (definition) return definition\n definition = new ComponentFieldDefinition(node.name, node.name, null, node.name)\n this.definitions.addComponentFieldDef(definition)\n return definition\n }\n\n private componentDeclaration (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n const edge = node.edges[0]\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set on which to place declared component '${node.name}'`)\n }\n const containedComponent = new ContainedComponentField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedComponent)\n this.containedSets.set(edge.head, definition)\n }\n\n private messageDefinition (node: GraphNode): void {\n if (!this.header) throw new Error('header not set')\n if (!this.trailer) throw new Error('trailer not set')\n\n const md = QuickFixGraphParser.getMessage(node.element)\n this.definitions.addMessage(md)\n this.containedSets.set(node.id, md)\n\n // wrap the message body in StandardHeader + content + StandardTrailer\n this.constructTailNode('StandardHeader', node, this.header.element, NodeElementType.ComponentDeclaration)\n this.expandSet(node)\n this.constructTailNode('StandardTrailer', node, this.trailer.element, NodeElementType.ComponentDeclaration)\n }\n\n private componentDefinition (node: GraphNode): void {\n const definition = this.getComponentDefinition(node)\n this.containedSets.set(node.id, definition)\n this.expandSet(node)\n }\n\n private groupDefinition (node: GraphNode): void {\n const tail = node.edges[0]?.tail\n if (tail == null) {\n throw new Error(`node ${node} has no edges to find tail for group definition`)\n }\n const definition = this.containedSets.get(tail)\n if (!definition) {\n throw new Error(`node ${node} has no contained set for group definition`)\n }\n this.containedSets.set(node.edges[0].head, definition)\n this.expandSet(node)\n }\n\n private inlineGroupDefinition (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for inline group definition`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for inline group '${node.name}'`)\n }\n const noOFieldDefinition = this.definitions.simple.get(node.name)\n if (!noOFieldDefinition) {\n throw new Error(`${node.name} does not exist in simple field definitions to construct inline group`)\n }\n const name = node.name\n const definition = new GroupFieldDefinition(name, name, null, noOFieldDefinition, name)\n const containedGroup = new ContainedGroupField(definition, parentSet.fields.length, node.isRequired())\n new ContainedSetBuilder(parentSet).add(containedGroup)\n this.containedSets.set(edge.head, definition)\n this.constructTailNode(name, node, node.element, NodeElementType.GroupDefinition)\n }\n\n private simpleFieldDeclaration (node: GraphNode): void {\n const edge = node.edges[0]\n if (!edge) {\n throw new Error(`node ${node} has no edges to find tail for simple field declaration`)\n }\n const parentSet = this.containedSets.get(edge.tail)\n if (!parentSet) {\n throw new Error(`edge tail ${edge.tail} has no contained set for declared field '${node.name}'`)\n }\n const sd = this.definitions.simple.get(node.name)\n if (!sd) {\n throw new Error(`element ${node} cannot be located as a simple field`)\n }\n const containedSimpleField = new ContainedSimpleField(sd, parentSet.fields.length, node.isRequired(), false)\n new ContainedSetBuilder(parentSet).add(containedSimpleField)\n }\n\n // ── Set expansion ──\n\n /**\n * Walks the children of a definition node and constructs tail nodes for each\n * field/group/component reference, queuing them for resolution.\n */\n private expandSet (node: GraphNode): void {\n for (const child of node.element.elements()) {\n switch (child.name) {\n case 'field': {\n this.expandField(node, child)\n break\n }\n case 'group': {\n this.expandGroup(node, child)\n break\n }\n case 'component': {\n this.expandComponent(node, child)\n break\n }\n }\n }\n }\n\n private expandField (node: GraphNode, element: XNode): void {\n this.constructTailNode(QuickFixGraphParser.nameFrom(element), node, element, NodeElementType.SimpleFieldDeclaration)\n }\n\n private expandGroup (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.InlineGroupDefinition, NodeElementType.GroupDeclaration)\n }\n\n private expandComponent (node: GraphNode, element: XNode): void {\n this.expandSetChild(node, element, NodeElementType.ComponentDefinition, NodeElementType.ComponentDeclaration)\n }\n\n private expandSetChild (\n node: GraphNode,\n element: XNode,\n defineElement: NodeElementType,\n declareElement: NodeElementType\n ): void {\n const name = QuickFixGraphParser.nameFrom(element)\n const hasInlinedFields = element.elements().length > 0\n const elementType = hasInlinedFields ? defineElement : declareElement\n this.constructTailNode(name, node, element, elementType)\n }\n\n // ── Static helpers ──\n\n /**\n * Extract a name from an element's attributes, with the same conventions as the C# parser:\n * strip spaces, prefix with 'F' if the name starts with a digit.\n */\n static nameFrom (element: XNode): string {\n let name = element.attribute('name') ?? ''\n name = name.replace(/ /g, '')\n if (name.length > 0 && name[0] >= '0' && name[0] <= '9') {\n name = `F${name}`\n }\n return name\n }\n\n static getField (element: XNode): SimpleFieldDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const numberStr = element.attribute('number')\n const tag = numberStr != null ? parseInt(numberStr, 10) : -1\n if (tag < 0) throw new Error(`no tag/number for ${name}`)\n const type = element.attribute('type') ?? 'STRING'\n\n const sd = new SimpleFieldDefinition(String(tag), name, name, null, null, type, null)\n // Add enum values\n for (const value of element.elements('value')) {\n const enumKey = value.attribute('enum')\n const description = value.attribute('description') ?? ''\n if (enumKey != null) {\n sd.addEnum(enumKey, description, description)\n }\n }\n return sd\n }\n\n static getMessage (element: XNode): MessageDefinition {\n const name = QuickFixGraphParser.nameFrom(element)\n const msgCat = element.attribute('msgcat') ?? ''\n const msgType = element.attribute('msgtype') ?? ''\n return new MessageDefinition(name, name, msgType, msgCat, name)\n }\n\n /**\n * Convenience: parse XML text into a fresh FixDefinitions.\n */\n static parse (xml: string, options: QuickFixGraphParserOptions = {}): FixDefinitions {\n // Pre-parse the version so we can construct FixDefinitions correctly\n const doc = SaxTreeBuilder.parse(xml)\n const fixRoot = doc.firstDescendant('fix')\n if (!fixRoot) throw new Error('no <fix> root element')\n const major = parseInt(fixRoot.attribute('major') ?? '0', 10)\n const minor = parseInt(fixRoot.attribute('minor') ?? '0', 10)\n const servicepack = parseInt(fixRoot.attribute('servicepack') ?? '0', 10)\n const description = (major !== 5 || servicepack === 0)\n ? `FIX.${major}.${minor}`\n : `FIX.${major}.${minor}SP${servicepack}`\n const definitions = new FixDefinitions(FixDefinitionSource.QuickFix, VersionUtil.resolve(description))\n const parser = new QuickFixGraphParser(definitions, options)\n return parser.parseDocument(doc)\n }\n}\n"]}
|
|
@@ -12,6 +12,6 @@ export interface ValidationError {
|
|
|
12
12
|
readonly suggestion?: string;
|
|
13
13
|
}
|
|
14
14
|
export declare class DictionaryValidationException extends Error {
|
|
15
|
-
readonly errors:
|
|
16
|
-
constructor(errors:
|
|
15
|
+
readonly errors: readonly ValidationError[];
|
|
16
|
+
constructor(errors: readonly ValidationError[]);
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/validation-error.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAYD,MAAa,6BAA8B,SAAQ,KAAK;IACtD,YAA6B,
|
|
1
|
+
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../../src/dictionary/parser/quickfix/validation-error.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAYD,MAAa,6BAA8B,SAAQ,KAAK;IACtD,YAA6B,MAAkC;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QACrF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QACzF,MAAM,MAAM,GAAG,yCAAyC,UAAU,iBAAiB,YAAY,cAAc,CAAA;QAC7G,MAAM,OAAO,GAAG,MAAM;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC;aACpD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACvC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI;gBAAE,IAAI,IAAI,UAAU,CAAC,CAAC,UAAU,GAAG,CAAA;YAC3D,IAAI,CAAC,CAAC,UAAU;gBAAE,IAAI,IAAI,MAAM,CAAC,CAAC,UAAU,EAAE,CAAA;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,KAAK,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,CAAA;QAdH,WAAM,GAAN,MAAM,CAA4B;QAe7D,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,CAAC;CACF;AAlBD,sEAkBC","sourcesContent":["export enum ValidationSeverity {\n Warning = 'Warning',\n Error = 'Error'\n}\n\nexport interface ValidationError {\n readonly severity: ValidationSeverity\n readonly code: string\n readonly message: string\n readonly elementName?: string\n readonly elementType?: string\n readonly lineNumber?: number\n readonly suggestion?: string\n}\n\nexport class DictionaryValidationException extends Error {\n constructor (public readonly errors: readonly ValidationError[]) {\n const errorCount = errors.filter(e => e.severity === ValidationSeverity.Error).length\n const warningCount = errors.filter(e => e.severity === ValidationSeverity.Warning).length\n const header = `FIX dictionary validation failed with ${errorCount} error(s) and ${warningCount} warning(s):`\n const details = errors\n .filter(e => e.severity === ValidationSeverity.Error)\n .slice(0, 20)\n .map(e => {\n let line = ` [${e.code}] ${e.message}`\n if (e.lineNumber != null) line += ` (line ${e.lineNumber})`\n if (e.suggestion) line += ` — ${e.suggestion}`\n return line\n })\n .join('\\n')\n super(`${header}\\n${details}`)\n this.name = 'DictionaryValidationException'\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'reflect-metadata';
|