saxes.d.ts
  1  /**
  2   * The list of supported events.
  3   */
  4  export declare const EVENTS: readonly ["xmldecl", "text", "processinginstruction", "doctype", "comment", "opentagstart", "attribute", "opentag", "closetag", "cdata", "error", "end", "ready"];
  5  /**
  6   * Event handler for the
  7   *
  8   * @param text The text data encountered by the parser.
  9   *
 10   */
 11  export declare type XMLDeclHandler = (decl: XMLDecl) => void;
 12  /**
 13   * Event handler for text data.
 14   *
 15   * @param text The text data encountered by the parser.
 16   *
 17   */
 18  export declare type TextHandler = (text: string) => void;
 19  /**
 20   * Event handler for processing instructions.
 21   *
 22   * @param data The target and body of the processing instruction.
 23   */
 24  export declare type PIHandler = (data: {
 25      target: string;
 26      body: string;
 27  }) => void;
 28  /**
 29   * Event handler for doctype.
 30   *
 31   * @param doctype The doctype contents.
 32   */
 33  export declare type DoctypeHandler = (doctype: string) => void;
 34  /**
 35   * Event handler for comments.
 36   *
 37   * @param comment The comment contents.
 38   */
 39  export declare type CommentHandler = (comment: string) => void;
 40  /**
 41   * Event handler for the start of an open tag. This is called as soon as we
 42   * have a tag name.
 43   *
 44   * @param tag The tag.
 45   */
 46  export declare type OpenTagStartHandler<O> = (tag: StartTagForOptions<O>) => void;
 47  export declare type AttributeEventForOptions<O extends SaxesOptions> = O extends {
 48      xmlns: true;
 49  } ? SaxesAttributeNSIncomplete : O extends {
 50      xmlns?: false | undefined;
 51  } ? SaxesAttributePlain : SaxesAttribute;
 52  /**
 53   * Event handler for attributes.
 54   */
 55  export declare type AttributeHandler<O> = (attribute: AttributeEventForOptions<O>) => void;
 56  /**
 57   * Event handler for an open tag. This is called when the open tag is
 58   * complete. (We've encountered the ">" that ends the open tag.)
 59   *
 60   * @param tag The tag.
 61   */
 62  export declare type OpenTagHandler<O> = (tag: TagForOptions<O>) => void;
 63  /**
 64   * Event handler for a close tag. Note that for self-closing tags, this is
 65   * called right after ``opentag``.
 66   *
 67   * @param tag The tag.
 68   */
 69  export declare type CloseTagHandler<O> = (tag: TagForOptions<O>) => void;
 70  /**
 71   * Event handler for a CDATA section. This is called when ending the
 72   * CDATA section.
 73   *
 74   * @param cdata The contents of the CDATA section.
 75   */
 76  export declare type CDataHandler = (cdata: string) => void;
 77  /**
 78   * Event handler for the stream end. This is called when the stream has been
 79   * closed with ``close`` or by passing ``null`` to ``write``.
 80   */
 81  export declare type EndHandler = () => void;
 82  /**
 83   * Event handler indicating parser readiness . This is called when the parser
 84   * is ready to parse a new document.
 85   */
 86  export declare type ReadyHandler = () => void;
 87  /**
 88   * Event handler indicating an error.
 89   *
 90   * @param err The error that occurred.
 91   */
 92  export declare type ErrorHandler = (err: Error) => void;
 93  export declare type EventName = (typeof EVENTS)[number];
 94  export declare type EventNameToHandler<O, N extends EventName> = {
 95      "xmldecl": XMLDeclHandler;
 96      "text": TextHandler;
 97      "processinginstruction": PIHandler;
 98      "doctype": DoctypeHandler;
 99      "comment": CommentHandler;
100      "opentagstart": OpenTagStartHandler<O>;
101      "attribute": AttributeHandler<O>;
102      "opentag": OpenTagHandler<O>;
103      "closetag": CloseTagHandler<O>;
104      "cdata": CDataHandler;
105      "error": ErrorHandler;
106      "end": EndHandler;
107      "ready": ReadyHandler;
108  }[N];
109  /**
110   * This interface defines the structure of attributes when the parser is
111   * processing namespaces (created with ``xmlns: true``).
112   */
113  export interface SaxesAttributeNS {
114      /**
115       * The attribute's name. This is the combination of prefix and local name.
116       * For instance ``a:b="c"`` would have ``a:b`` for name.
117       */
118      name: string;
119      /**
120       * The attribute's prefix. For instance ``a:b="c"`` would have ``"a"`` for
121       * ``prefix``.
122       */
123      prefix: string;
124      /**
125       * The attribute's local name. For instance ``a:b="c"`` would have ``"b"`` for
126       * ``local``.
127       */
128      local: string;
129      /** The namespace URI of this attribute. */
130      uri: string;
131      /** The attribute's value. */
132      value: string;
133  }
134  /**
135   * This is an attribute, as recorded by a parser which parses namespaces but
136   * prior to the URI being resolvable. This is what is passed to the attribute
137   * event handler.
138   */
139  export declare type SaxesAttributeNSIncomplete = Exclude<SaxesAttributeNS, "uri">;
140  /**
141   * This interface defines the structure of attributes when the parser is
142   * NOT processing namespaces (created with ``xmlns: false``).
143   */
144  export interface SaxesAttributePlain {
145      /**
146       * The attribute's name.
147       */
148      name: string;
149      /** The attribute's value. */
150      value: string;
151  }
152  /**
153   * A saxes attribute, with or without namespace information.
154   */
155  export declare type SaxesAttribute = SaxesAttributeNS | SaxesAttributePlain;
156  /**
157   * This are the fields that MAY be present on a complete tag.
158   */
159  export interface SaxesTag {
160      /**
161       * The tag's name. This is the combination of prefix and global name. For
162       * instance ``<a:b>`` would have ``"a:b"`` for ``name``.
163       */
164      name: string;
165      /**
166       * A map of attribute name to attributes. If namespaces are tracked, the
167       * values in the map are attribute objects. Otherwise, they are strings.
168       */
169      attributes: Record<string, SaxesAttributeNS> | Record<string, string>;
170      /**
171       * The namespace bindings in effect.
172       */
173      ns?: Record<string, string>;
174      /**
175       * The tag's prefix. For instance ``<a:b>`` would have ``"a"`` for
176       * ``prefix``. Undefined if we do not track namespaces.
177       */
178      prefix?: string;
179      /**
180       * The tag's local name. For instance ``<a:b>`` would
181       * have ``"b"`` for ``local``. Undefined if we do not track namespaces.
182       */
183      local?: string;
184      /**
185       * The namespace URI of this tag. Undefined if we do not track namespaces.
186       */
187      uri?: string;
188      /** Whether the tag is self-closing (e.g. ``<foo/>``). */
189      isSelfClosing: boolean;
190  }
191  /**
192   * This type defines the fields that are present on a tag object when
193   * ``onopentagstart`` is called. This interface is namespace-agnostic.
194   */
195  export declare type SaxesStartTag = Pick<SaxesTag, "name" | "attributes" | "ns">;
196  /**
197   * This type defines the fields that are present on a tag object when
198   * ``onopentagstart`` is called on a parser that does not processes namespaces.
199   */
200  export declare type SaxesStartTagPlain = Pick<SaxesStartTag, "name" | "attributes">;
201  /**
202   * This type defines the fields that are present on a tag object when
203   * ``onopentagstart`` is called on a parser that does process namespaces.
204   */
205  export declare type SaxesStartTagNS = Required<SaxesStartTag>;
206  /**
207   * This are the fields that are present on a complete tag produced by a parser
208   * that does process namespaces.
209   */
210  export declare type SaxesTagNS = Required<SaxesTag> & {
211      attributes: Record<string, SaxesAttributeNS>;
212  };
213  /**
214   * This are the fields that are present on a complete tag produced by a parser
215   * that does not process namespaces.
216   */
217  export declare type SaxesTagPlain = Pick<SaxesTag, "name" | "attributes" | "isSelfClosing"> & {
218      attributes: Record<string, string>;
219  };
220  /**
221   * An XML declaration.
222   */
223  export interface XMLDecl {
224      /** The version specified by the XML declaration. */
225      version?: string;
226      /** The encoding specified by the XML declaration. */
227      encoding?: string;
228      /** The value of the standalone parameter */
229      standalone?: string;
230  }
231  /**
232   * A callback for resolving name prefixes.
233   *
234   * @param prefix The prefix to check.
235   *
236   * @returns The URI corresponding to the prefix, if any.
237   */
238  export declare type ResolvePrefix = (prefix: string) => string | undefined;
239  export interface CommonOptions {
240      /** Whether to accept XML fragments. Unset means ``false``. */
241      fragment?: boolean;
242      /** Whether to track positions. Unset means ``true``. */
243      position?: boolean;
244      /**
245       * A file name to use for error reporting. "File name" is a loose concept. You
246       * could use a URL to some resource, or any descriptive name you like.
247       */
248      fileName?: string;
249  }
250  export interface NSOptions {
251      /** Whether to track namespaces. Unset means ``false``. */
252      xmlns?: boolean;
253      /**
254       * A plain object whose key, value pairs define namespaces known before
255       * parsing the XML file. It is not legal to pass bindings for the namespaces
256       * ``"xml"`` or ``"xmlns"``.
257       */
258      additionalNamespaces?: Record<string, string>;
259      /**
260       * A function that will be used if the parser cannot resolve a namespace
261       * prefix on its own.
262       */
263      resolvePrefix?: ResolvePrefix;
264  }
265  export interface NSOptionsWithoutNamespaces extends NSOptions {
266      xmlns?: false;
267      additionalNamespaces?: undefined;
268      resolvePrefix?: undefined;
269  }
270  export interface NSOptionsWithNamespaces extends NSOptions {
271      xmlns: true;
272  }
273  export interface XMLVersionOptions {
274      /**
275       * The default XML version to use. If unspecified, and there is no XML
276       * encoding declaration, the default version is "1.0".
277       */
278      defaultXMLVersion?: "1.0" | "1.1";
279      /**
280       * A flag indicating whether to force the XML version used for parsing to the
281       * value of ``defaultXMLVersion``. When this flag is ``true``,
282       * ``defaultXMLVersion`` must be specified. If unspecified, the default value
283       * of this flag is ``false``.
284       */
285      forceXMLVersion?: boolean;
286  }
287  export interface NoForcedXMLVersion extends XMLVersionOptions {
288      forceXMLVersion?: false;
289  }
290  export interface ForcedXMLVersion extends XMLVersionOptions {
291      forceXMLVersion: true;
292      defaultXMLVersion: Exclude<XMLVersionOptions["defaultXMLVersion"], undefined>;
293  }
294  /**
295   * The entire set of options supported by saxes.
296   */
297  export declare type SaxesOptions = CommonOptions & NSOptions & XMLVersionOptions;
298  export declare type TagForOptions<O extends SaxesOptions> = O extends {
299      xmlns: true;
300  } ? SaxesTagNS : O extends {
301      xmlns?: false | undefined;
302  } ? SaxesTagPlain : SaxesTag;
303  export declare type StartTagForOptions<O extends SaxesOptions> = O extends {
304      xmlns: true;
305  } ? SaxesStartTagNS : O extends {
306      xmlns?: false | undefined;
307  } ? SaxesStartTagPlain : SaxesStartTag;
308  export declare class SaxesParser<O extends SaxesOptions = {}> {
309      private readonly fragmentOpt;
310      private readonly xmlnsOpt;
311      private readonly trackPosition;
312      private readonly fileName?;
313      private readonly nameStartCheck;
314      private readonly nameCheck;
315      private readonly isName;
316      private readonly ns;
317      private openWakaBang;
318      private text;
319      private name;
320      private piTarget;
321      private entity;
322      private q;
323      private tags;
324      private tag;
325      private topNS;
326      private chunk;
327      private chunkPosition;
328      private i;
329      private prevI;
330      private carriedFromPrevious?;
331      private forbiddenState;
332      private attribList;
333      private state;
334      private reportedTextBeforeRoot;
335      private reportedTextAfterRoot;
336      private closedRoot;
337      private sawRoot;
338      private xmlDeclPossible;
339      private xmlDeclExpects;
340      private entityReturnState?;
341      private processAttribs;
342      private positionAtNewLine;
343      private doctype;
344      private getCode;
345      private isChar;
346      private pushAttrib;
347      private _closed;
348      private currentXMLVersion;
349      private readonly stateTable;
350      private xmldeclHandler?;
351      private textHandler?;
352      private piHandler?;
353      private doctypeHandler?;
354      private commentHandler?;
355      private openTagStartHandler?;
356      private openTagHandler?;
357      private closeTagHandler?;
358      private cdataHandler?;
359      private errorHandler?;
360      private endHandler?;
361      private readyHandler?;
362      private attributeHandler?;
363      /**
364       * Indicates whether or not the parser is closed. If ``true``, wait for
365       * the ``ready`` event to write again.
366       */
367      get closed(): boolean;
368      readonly opt: SaxesOptions;
369      /**
370       * The XML declaration for this document.
371       */
372      xmlDecl: XMLDecl;
373      /**
374       * The line number of the next character to be read by the parser. This field
375       * is one-based. (The first line is numbered 1.)
376       */
377      line: number;
378      /**
379       * The column number of the next character to be read by the parser.  *
380       * This field is zero-based. (The first column is 0.)
381       *
382       * This field counts columns by *Unicode character*. Note that this *can*
383       * be different from the index of the character in a JavaScript string due
384       * to how JavaScript handles astral plane characters.
385       *
386       * See [[columnIndex]] for a number that corresponds to the JavaScript index.
387       */
388      column: number;
389      /**
390       * A map of entity name to expansion.
391       */
392      ENTITIES: Record<string, string>;
393      /**
394       * @param opt The parser options.
395       */
396      constructor(opt?: O);
397      _init(): void;
398      /**
399       * The stream position the parser is currently looking at. This field is
400       * zero-based.
401       *
402       * This field is not based on counting Unicode characters but is to be
403       * interpreted as a plain index into a JavaScript string.
404       */
405      get position(): number;
406      /**
407       * The column number of the next character to be read by the parser.  *
408       * This field is zero-based. (The first column in a line is 0.)
409       *
410       * This field reports the index at which the next character would be in the
411       * line if the line were represented as a JavaScript string.  Note that this
412       * *can* be different to a count based on the number of *Unicode characters*
413       * due to how JavaScript handles astral plane characters.
414       *
415       * See [[column]] for a number that corresponds to a count of Unicode
416       * characters.
417       */
418      get columnIndex(): number;
419      /**
420       * Set an event listener on an event. The parser supports one handler per
421       * event type. If you try to set an event handler over an existing handler,
422       * the old handler is silently overwritten.
423       *
424       * @param name The event to listen to.
425       *
426       * @param handler The handler to set.
427       */
428      on<N extends EventName>(name: N, handler: EventNameToHandler<O, N>): void;
429      /**
430       * Unset an event handler.
431       *
432       * @parma name The event to stop listening to.
433       */
434      off(name: EventName): void;
435      /**
436       * Make an error object. The error object will have a message that contains
437       * the ``fileName`` option passed at the creation of the parser. If position
438       * tracking was turned on, it will also have line and column number
439       * information.
440       *
441       * @param message The message describing the error to report.
442       *
443       * @returns An error object with a properly formatted message.
444       */
445      makeError(message: string): Error;
446      /**
447       * Report a parsing error. This method is made public so that client code may
448       * check for issues that are outside the scope of this project and can report
449       * errors.
450       *
451       * @param message The error to report.
452       *
453       * @returns this
454       */
455      fail(message: string): this;
456      /**
457       * Write a XML data to the parser.
458       *
459       * @param chunk The XML data to write.
460       *
461       * @returns this
462       */
463      write(chunk: string | {} | null): this;
464      /**
465       * Close the current stream. Perform final well-formedness checks and reset
466       * the parser tstate.
467       *
468       * @returns this
469       */
470      close(): this;
471      /**
472       * Get a single code point out of the current chunk. This updates the current
473       * position if we do position tracking.
474       *
475       * This is the algorithm to use for XML 1.0.
476       *
477       * @returns The character read.
478       */
479      private getCode10;
480      /**
481       * Get a single code point out of the current chunk. This updates the current
482       * position if we do position tracking.
483       *
484       * This is the algorithm to use for XML 1.1.
485       *
486       * @returns {number} The character read.
487       */
488      private getCode11;
489      /**
490       * Like ``getCode`` but with the return value normalized so that ``NL`` is
491       * returned for ``NL_LIKE``.
492       */
493      private getCodeNorm;
494      private unget;
495      /**
496       * Capture characters into a buffer until encountering one of a set of
497       * characters.
498       *
499       * @param chars An array of codepoints. Encountering a character in the array
500       * ends the capture. (``chars`` may safely contain ``NL``.)
501       *
502       * @return The character code that made the capture end, or ``EOC`` if we hit
503       * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
504       * instead.
505       */
506      private captureTo;
507      /**
508       * Capture characters into a buffer until encountering a character.
509       *
510       * @param char The codepoint that ends the capture. **NOTE ``char`` MAY NOT
511       * CONTAIN ``NL``.** Passing ``NL`` will result in buggy behavior.
512       *
513       * @return ``true`` if we ran into the character. Otherwise, we ran into the
514       * end of the current chunk.
515       */
516      private captureToChar;
517      /**
518       * Capture characters that satisfy ``isNameChar`` into the ``name`` field of
519       * this parser.
520       *
521       * @return The character code that made the test fail, or ``EOC`` if we hit
522       * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
523       * instead.
524       */
525      private captureNameChars;
526      /**
527       * Skip white spaces.
528       *
529       * @return The character that ended the skip, or ``EOC`` if we hit
530       * the end of the chunk. The return value cannot be NL_LIKE: NL is returned
531       * instead.
532       */
533      private skipSpaces;
534      private setXMLVersion;
535      private sBegin;
536      private sBeginWhitespace;
537      private sDoctype;
538      private sDoctypeQuote;
539      private sDTD;
540      private sDTDQuoted;
541      private sDTDOpenWaka;
542      private sDTDOpenWakaBang;
543      private sDTDComment;
544      private sDTDCommentEnding;
545      private sDTDCommentEnded;
546      private sDTDPI;
547      private sDTDPIEnding;
548      private sText;
549      private sEntity;
550      private sOpenWaka;
551      private sOpenWakaBang;
552      private sComment;
553      private sCommentEnding;
554      private sCommentEnded;
555      private sCData;
556      private sCDataEnding;
557      private sCDataEnding2;
558      private sPIFirstChar;
559      private sPIRest;
560      private sPIBody;
561      private sPIEnding;
562      private sXMLDeclNameStart;
563      private sXMLDeclName;
564      private sXMLDeclEq;
565      private sXMLDeclValueStart;
566      private sXMLDeclValue;
567      private sXMLDeclSeparator;
568      private sXMLDeclEnding;
569      private sOpenTag;
570      private sOpenTagSlash;
571      private sAttrib;
572      private sAttribName;
573      private sAttribNameSawWhite;
574      private sAttribValue;
575      private sAttribValueQuoted;
576      private sAttribValueClosed;
577      private sAttribValueUnquoted;
578      private sCloseTag;
579      private sCloseTagSawWhite;
580      private handleTextInRoot;
581      private handleTextOutsideRoot;
582      private pushAttribNS;
583      private pushAttribPlain;
584      /**
585       * End parsing. This performs final well-formedness checks and resets the
586       * parser to a clean state.
587       *
588       * @returns this
589       */
590      private end;
591      /**
592       * Resolve a namespace prefix.
593       *
594       * @param prefix The prefix to resolve.
595       *
596       * @returns The namespace URI or ``undefined`` if the prefix is not defined.
597       */
598      resolve(prefix: string): string | undefined;
599      /**
600       * Parse a qname into its prefix and local name parts.
601       *
602       * @param name The name to parse
603       *
604       * @returns
605       */
606      private qname;
607      private processAttribsNS;
608      private processAttribsPlain;
609      /**
610       * Handle a complete open tag. This parser code calls this once it has seen
611       * the whole tag. This method checks for well-formeness and then emits
612       * ``onopentag``.
613       */
614      private openTag;
615      /**
616       * Handle a complete self-closing tag. This parser code calls this once it has
617       * seen the whole tag. This method checks for well-formeness and then emits
618       * ``onopentag`` and ``onclosetag``.
619       */
620      private openSelfClosingTag;
621      /**
622       * Handle a complete close tag. This parser code calls this once it has seen
623       * the whole tag. This method checks for well-formeness and then emits
624       * ``onclosetag``.
625       */
626      private closeTag;
627      /**
628       * Resolves an entity. Makes any necessary well-formedness checks.
629       *
630       * @param entity The entity to resolve.
631       *
632       * @returns The parsed entity.
633       */
634      private parseEntity;
635  }