This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
2021-04-02 02:24:13 +03:00

1 line
6.1 KiB
Plaintext

{"version":3,"file":"XML.js","sourceRoot":"","sources":["../../src/utils/XML.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport { EOL } from 'os';\nimport path from 'path';\nimport { Builder, Parser } from 'xml2js';\n\nexport type XMLValue = boolean | number | string | null | XMLArray | XMLObject;\n\nexport interface XMLArray extends Array<XMLValue> {}\n\nexport interface XMLObject {\n [key: string]: XMLValue | undefined;\n}\n\nexport function logXMLString(doc: XMLObject) {\n const builder = new Builder();\n const xmlInput = builder.buildObject(doc);\n console.log(xmlInput);\n}\n\nexport async function writeXMLAsync(options: { path: string; xml: any }): Promise<void> {\n const xml = new Builder().buildObject(options.xml);\n await fs.ensureDir(path.dirname(options.path));\n await fs.writeFile(options.path, xml);\n}\n\nasync function removeFileIfExists(filePath: string) {\n if (await fs.pathExists(filePath)) {\n await fs.unlink(filePath);\n }\n}\n\nfunction hasResources(xml: XMLObject): boolean {\n return Array.isArray(xml.resources) && !!xml.resources.length;\n}\n\nexport async function writeXMLOrRemoveFileUponNoResourcesAsync(\n filePath: string,\n xml: XMLObject,\n { disregardComments }: { disregardComments?: boolean } = {}\n) {\n if (hasResources(xml)) {\n await writeXMLAsync({ path: filePath, xml });\n } else {\n await removeFileIfExists(filePath);\n }\n}\n\nexport async function readXMLAsync(options: {\n path: string;\n fallback?: string | null;\n}): Promise<XMLObject> {\n let contents: string = '';\n try {\n contents = await fs.readFile(options.path, { encoding: 'utf8', flag: 'r' });\n } catch {\n // catch and use fallback\n }\n const parser = new Parser();\n const manifest = await parser.parseStringPromise(contents || options.fallback || '');\n return manifest;\n}\n\nconst stringTimesN = (n: number, char: string) => Array(n + 1).join(char);\n\nexport function format(manifest: any, { indentLevel = 2, newline = EOL } = {}): string {\n let xmlInput: string;\n if (typeof manifest === 'string') {\n xmlInput = manifest;\n } else if (manifest.toString) {\n const builder = new Builder({ headless: true });\n xmlInput = builder.buildObject(manifest);\n return xmlInput;\n } else {\n throw new Error(`Invalid XML value passed in: ${manifest}`);\n }\n const indentString = stringTimesN(indentLevel, ' ');\n\n let formatted = '';\n const regex = /(>)(<)(\\/*)/g;\n const xml = xmlInput.replace(regex, `$1${newline}$2$3`);\n let pad = 0;\n xml\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .forEach((line: string) => {\n let indent = 0;\n if (line.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n } else if (line.match(/^<\\/\\w/)) {\n // Somehow istanbul doesn't see the else case as covered, although it is. Skip it.\n /* istanbul ignore else */\n if (pad !== 0) {\n pad -= 1;\n }\n } else if (line.match(/^<\\w([^>]*[^/])?>.*$/)) {\n indent = 1;\n } else {\n indent = 0;\n }\n\n const padding = stringTimesN(pad, indentString);\n formatted += padding + line + newline; // eslint-disable-line prefer-template\n pad += indent;\n });\n\n return formatted.trim();\n}\n"]}