| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 | /** * Copyright (C) 2016-2020 Michael Kourlas * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//** * The options associated with parsing an object and formatting the resulting * XML. */export interface IOptions {    /**     * If an object or map contains a key that, when converted to a string,     * is equal to the value of `aliasString`, then the name of the XML element     * containing the object will be replaced with the value associated with     * said key.     *     * For example, if `aliasString` is `"="`, then the following object:     * ```javascript     * {     *     "abc": {     *         "=": "def"     *         "#": "ghi"     *     }     * }     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     <def>ghi</def>     * </root>     * ```     *     * The default alias string is `"="`.     */    aliasString?: string;    /**     * If an object or map contains a key that, when converted to a string,     * begins with the value of `attributeString`, then the value mapped by     * said key will be interpreted as attributes for the XML element for that     * object.     *     * The keys of the value of `attributeString` are interpreted as attribute     * names, while the values mapping to those keys are interpreted as     * attribute values.     *     * For example, if `attributeString` is `"@"`, then the following object:     * ```javascript     * {     *     "abc": {     *         "@1": {     *             "ghi": "jkl",     *             "mno": "pqr"     *         },     *         "stu": "vwx",     *         "@2": {     *             "yza": "bcd"     *         },     *     }     * }     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     <abc ghi='jkl' mno='pqr' yza='bcd'>     *         <stu>vwx</stu>     *     </abc>     * </root>     * ```     *     * The default attribute string is `"@"`.     */    attributeString?: string;    /**     * Whether to enclose any text containing the characters `<` or `&`     * in CDATA sections. If this is false, these characters shall be replaced     * with XML escape characters instead.     *     * By default, this is disabled.     */    cdataInvalidChars?: boolean;    /**     * If an object or map contains a key that, when converted to a string, is     * equal to an item in `cdataKeys`, then the value mapped by said key will     * be enclosed in a CDATA section.     *     * For example, if `cdataKeys` is:     * ```javascript     * [     *     "abc"     * ]     * ```     * then the following object:     * ```javascript     * {     *     "abc": "def&",     *     "ghi": "jkl",     *     "mno": "pqr<"     * }     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     <abc><![CDATA[def&]]></ghi>     *     <ghi>jlk</ghi>     *     <mno>pqr<</mno>     * </root>     * ```     *     * If `cdataKeys` has a key named `"*"`, then that entry will match all     * keys.     *     * By default, this is an empty array.     */    cdataKeys?: string[];    /**     * The options associated with the XML declaration.     */    declaration?: IDeclarationOptions;    /**     * The options associated with the XML document type definition.     */    dtd?: IDtdOptions;    /**     * The options associated with the formatting of the XML document.     */    format?: IFormatOptions;    /**     * Whether to replace any characters that are not valid in XML in particular     * contexts with the Unicode replacement character, U+FFFD.     *     * At present this is limited to attribute names and values; element names     * and character data; CDATA sections; and comments. This may be extended     * in future.     *     * By default, this is disabled.     */    replaceInvalidChars?: boolean;    /**     * If a value has a type (as defined by calling `Object.prototype.toString`     * on the value) equal to a key in `typeHandlers`, then said value will be     * replaced by the return value of the function mapped to by the key in     * `typeHandlers`. This function is called with the value as a parameter.     *     * If one of these functions returns the sole instance of {@link Absent},     * then the value will be suppressed from the XML output altogether.     *     * For example, if `typeHandlers` is:     * ```javascript     * {     *     "[object Date]": function(value) {     *         return value.getYear();     *     },     *     "[object Null]": function(value) {     *         return Absent.instance;     *     }     * }     * ```     * then the following object:     * ```javascript     * {     *     "abc": new Date(2012, 10, 31),     *     "def": null     * }     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     <abc>2012</abc>     * </root>     * ```     *     * If `typeHandlers` has a key named `"*"`, then that entry will match all     * values, unless there is a more specific entry.     *     * Note that normal parsing still occurs for the value returned by the     * function; it is not directly converted to a string.     *     * The default value is an empty object.     */    typeHandlers?: ITypeHandlers;    /**     * Whether to use a self-closing tag for empty elements.     *     * For example, the following element will be used:     * ```xml     * <element/>     * ```     * instead of:     * ```xml     * <element></element>     * ```     *     * By default, this is enabled.     */    useSelfClosingTagIfEmpty?: boolean;    /**     * Whether to throw an exception if basic XML validation fails while     * building the document.     *     * By default, this is enabled.     */    validation?: boolean;    /**     * If an object or map contains a key that, when converted to a string,     * begins with the value of `valueString`, then the value mapped by said key     * will be represented as bare text within the XML element for that object.     *     * For example, if `valueString` is `"#"`, then the following object:     * ```javascript     * new Map([     *     ["#1", "abc"],     *     ["def", "ghi"],     *     ["#2", "jkl"]     * ])     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     abc     *     <def>ghi</def>     *     jkl     * </root>     * ```     *     * The default value is `"#"`.     */    valueString?: string;    /**     * If an object or map contains a key that, when converted to a string, is     * equal to a key in `wrapHandlers`, and the key in said object or map maps     * to an array or set, then all items in the array or set will be wrapped     * in an XML element with the same name as the key.     *     * The key in `wrapHandlers` must map to a function that is called with the     * key name, as well as the array or set, as parameters. This function must     * return a string or value that can be converted to a string, which will     * become the name for each XML element for each item in the array or set.     * Alternatively, this function may return `null` to indicate that no     * wrapping should occur.     *     * For example, if `wrapHandlers` is:     * ```javascript     * {     *     "abc": function(key, value) {     *         return "def";     *     }     * }     * ```     * then the following object:     * ```javascript     * {     *     "ghi": "jkl",     *     "mno": {     *         "pqr": ["s", "t"]     *     },     *     "uvw": {     *         "abc": ["x", "y"]     *     }     * }     * ```     * will result in the following XML for a root element named `"root"`:     * ```xml     * <root>     *     <ghi>jkl</ghi>     *     <mno>     *         <pqr>s</pqr>     *         <pqr>t</pqr>     *     </mno>     *     <uwv>     *         <abc>     *             <def>x</def>     *             <def>y</def>     *         </abc>     *     </uwv>     * </root>     * ```     *     * If `wrapHandlers` has a key named `"*"`, then that entry will     * match all arrays and sets, unless there is a more specific entry.     *     * The default value is an empty object.     */    wrapHandlers?: IWrapHandlers;}/** * Implementation of the IOptions interface used to provide default values * to fields. */export declare class Options implements IOptions {    aliasString: string;    attributeString: string;    cdataInvalidChars: boolean;    cdataKeys: string[];    declaration: DeclarationOptions;    dtd: DtdOptions;    format: FormatOptions;    replaceInvalidChars: boolean;    typeHandlers: TypeHandlers;    useSelfClosingTagIfEmpty: boolean;    validation: boolean;    valueString: string;    wrapHandlers: WrapHandlers;    constructor(options?: IOptions);}/** * The options associated with the XML declaration. An example of an XML * declaration is as follows: * * ```xml * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * ``` */export interface IDeclarationOptions {    /**     * Whether to include a declaration in the generated XML. By default,     * one is included.     */    include?: boolean;    /**     * The encoding attribute to be included in the declaration. If defined,     * this value must be a valid encoding. By default, no encoding attribute     * is included.     */    encoding?: string;    /**     * The value of the standalone attribute to be included in the declaration.     * If defined, this value must be "yes" or "no". By default, no standalone     * attribute is included.     */    standalone?: string;    /**     * The XML version to be included in the declaration. If defined, this     * value must be a valid XML version number. Defaults to "1.0".     */    version?: string;}/** * Implementation of the IDeclarationOptions interface used to provide default * values to fields. */export declare class DeclarationOptions implements IDeclarationOptions {    include: boolean;    encoding?: string;    standalone?: string;    version?: string;    constructor(declarationOptions?: IDeclarationOptions);}/** * The options associated with the XML document type definition (DTD). An * example of a DTD is as follows: * * ```xml * <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" *                       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> * ``` */export interface IDtdOptions {    /**     * Whether to include a DTD in the generated XML. By default, no DTD is     * included.     */    include?: boolean;    /**     * The name of the DTD. This value cannot be left undefined if `include`     * is true.     */    name?: string;    /**     * The system identifier of the DTD, excluding quotation marks. By default,     * no system identifier is included.     */    sysId?: string;    /**     * The public identifier of the DTD, excluding quotation marks. If a public     * identifier is provided, a system identifier must be provided as well.     * By default, no public identifier is included.     */    pubId?: string;}/** * Implementation of the IDtdOptions interface used to provide default values * to fields. */export declare class DtdOptions implements IDtdOptions {    include: boolean;    name?: string;    sysId?: string;    pubId?: string;    constructor(validation: boolean, dtdOptions?: IDtdOptions);}/** * The options associated with the formatting of the XML document. */export interface IFormatOptions {    /**     * Whether double quotes or single quotes should be used in XML attributes.     * By default, single quotes are used.     */    doubleQuotes?: boolean;    /**     * The indent string used for pretty-printing. The default indent string is     * four spaces.     */    indent?: string;    /**     * The newline string used for pretty-printing. The default newline string     * is "\n".     */    newline?: string;    /**     * Whether pretty-printing is enabled. By default, pretty-printing is     * enabled.     */    pretty?: boolean;}/** * Implementation of the IFormatOptions interface used to provide default values * to fields. */export declare class FormatOptions implements IFormatOptions {    doubleQuotes?: boolean;    indent?: string;    newline?: string;    pretty?: boolean;    constructor(formatOptions?: IFormatOptions);}/** * Map for the `typeHandlers` property in the {@link IOptions} interface. */export interface ITypeHandlers {    /**     * Mapping between the type of a value in an object to a function taking     * this value and returning a replacement value.     */    [type: string]: (value: any) => unknown;}/** * Implementation of the ITypeHandlers interface used to provide default values * to fields. */export declare class TypeHandlers implements ITypeHandlers {    [type: string]: (value: any) => unknown;    constructor(typeHandlers?: ITypeHandlers);}/** * Map for the `wrapHandlers` property in the {@link IOptions} interface. */export interface IWrapHandlers {    /**     * Mapping between the string version of a key in an object or map with a     * value that is an array or set to a function taking the string version     * of that key, as well as that array or set.     *     * This function returns either a string that will become the name for each     * XML element for each item in the array or set, or `null` to indicate that     * wrapping should not occur.     */    [key: string]: (key: string, value: any) => string | null;}/** * Implementation of the IWrapHandlers interface used to provide default values * to fields. */export declare class WrapHandlers implements IWrapHandlers {    [key: string]: (key: string, value: any) => string | null;    constructor(wrapHandlers?: IWrapHandlers);}
 |