UNPKG

commerceml-parser

Version:

Parser for CommerceML standard developed by 1c.ru

108 lines (107 loc) 3.31 kB
/// <reference types="node" /> import X2JS from 'x2js'; import { SaxesTag } from 'saxes'; import Emittery from 'emittery'; import { Readable } from 'stream'; export interface CommerceMlRule { start: string[]; include?: string[][]; } export interface CommerceMlRules extends Record<string, CommerceMlRule> { } /** * Saxes event which is buffered and returned by low level parseChunk() generator. */ export interface SaxesEvent { type: 'opentag' | 'text' | 'closetag' | 'end'; tag?: SaxesTag; text?: string; } /** * CommerceML event which is buffered and returned by top level parse() generator. */ export interface ParserEvent { type: string; data?: unknown; } export declare abstract class CommerceMlAbstractParser { /** * Current position in the xml file. * Array of tag names. */ protected xPath: string[]; /** * Current open tag name. * Last tag name in xPath array. */ protected openTag: string; /** * Current parser rule key which is processed. */ protected currentRuleKey: string; /** * XML content collected starting from the openTag (inclusive) till the close tag (inclusive). */ protected xml: string; /** * Indicates whether current XML node should be collected according to parser rules. */ protected collectCurrentNode: boolean; /** * List of currently opened tags. * i.e. xpath. */ protected openTags: string[]; /** * Buffer of parser events collected from one parsed chunk. * @protected */ protected events: ParserEvent[]; /** * Serial synchronous Event emitter. * @protected */ protected eventEmitter: Emittery; /** * XML to plain JS objects convertor. * @protected */ protected x2js: X2JS; /** * CommerceML rules defines which XML tags should be collected and returned. * @protected */ protected abstract rules: CommerceMlRules; parse(readable: Readable): Promise<void>; parseIterable(iterable: Iterable<string>): Promise<void>; onEnd(callback: () => void | Promise<void>): void; /** * Generator method. * Parses one chunk of the iterable input (Readable stream in the string data reading mode). * @see https://nodejs.org/api/stream.html#stream_event_data * @param iterable Iterable or Readable stream in the string data reading mode. * @returns Array of SaxesParser events * @throws Error if a SaxesParser error event was emitted. */ parseChunk(iterable: Iterable<string>): AsyncGenerator<SaxesEvent[], void, undefined>; /** * Processes parser events. * @param events Collected parser events during one XML chunk parsing. * @protected */ protected processParserEvents(events: ParserEvent[]): Promise<void>; /** * SAX 'opentag' event handler. * @param tag */ protected onOpenTag(tag: SaxesTag): void; /** * */ protected shallCollect(): boolean; protected addEventToBuffer(): void; protected onText(text: string): void; protected onCloseTag(tag: SaxesTag): void; protected isCurrentXPathEqualsToRuleXPath(xPath: string[]): boolean; protected isCurrentXPathStartsWithRuleXPath(xPath: string[]): boolean; }