UNPKG

@chubbyts/chubbyts-decode-encode

Version:

A simple decode/encode solution for json / jsonx / url-encoded / xml / yaml.

96 lines (95 loc) 4.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createJsonxTypeDecoder = void 0; const fast_xml_parser_1 = require("fast-xml-parser"); const throwable_to_error_1 = require("@chubbyts/chubbyts-throwable-to-error/dist/throwable-to-error"); const jsonx_datatypes_1 = require("../jsonx-datatypes.cjs"); const index_1 = require("./index.cjs"); const decodeHtmlEntities = (string) => string.replace(/&#\d+;/gm, (code) => String.fromCharCode(code.match(/\d+/)[0])); const isWithName = (node) => typeof node === 'object' && null !== node && typeof node[':@'] === 'object' && node[':@'] !== null && typeof node[':@']['@_name'] === 'string'; const isObjectNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_OBJECT && Array.isArray(node[jsonx_datatypes_1.DATATYPE_OBJECT]); const isArrayNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_ARRAY && Array.isArray(node[jsonx_datatypes_1.DATATYPE_ARRAY]); const isStringNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_STRING && Array.isArray(node[jsonx_datatypes_1.DATATYPE_STRING]); const isNumberNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_NUMBER && Array.isArray(node[jsonx_datatypes_1.DATATYPE_NUMBER]); const isBooleanNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_BOOLEAN && Array.isArray(node[jsonx_datatypes_1.DATATYPE_BOOLEAN]); const isNullNode = (node) => Object.keys(node)[0] === jsonx_datatypes_1.DATATYPE_NULL && Array.isArray(node[jsonx_datatypes_1.DATATYPE_NULL]); const convertNullNode = () => { return null; }; const convertBooleanNode = (node) => { return node['json:boolean'][0]['#text']; }; const convertNumberNode = (node) => { return node['json:number'][0]['#text']; }; const convertStringNode = (node) => { return decodeHtmlEntities(node['json:string'][0]['#text']); }; const convertNode = (node) => { if (isObjectNode(node)) { return convertObjectNode(node); } else if (isArrayNode(node)) { return convertArrayNode(node); } else if (isStringNode(node)) { return convertStringNode(node); } else if (isNumberNode(node)) { return convertNumberNode(node); } else if (isBooleanNode(node)) { return convertBooleanNode(node); } else if (isNullNode(node)) { return convertNullNode(); } throw new Error(`Unsupported node: ${JSON.stringify(node)}`); }; const convertArrayNode = (node) => { return node['json:array'].map(convertNode); }; const convertNodeWithName = (node) => { if (isObjectNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertObjectNode(node)]; } else if (isArrayNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertArrayNode(node)]; } else if (isStringNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertStringNode(node)]; } else if (isNumberNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertNumberNode(node)]; } else if (isBooleanNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertBooleanNode(node)]; } else if (isNullNode(node) && isWithName(node)) { return [node[':@']['@_name'], convertNullNode()]; } throw new Error(`Unsupported node: ${JSON.stringify(node)}`); }; const convertObjectNode = (node) => { return Object.fromEntries(node['json:object'].map(convertNodeWithName)); }; const createJsonxTypeDecoder = () => { return { decode: (encodedData) => { try { const parser = new fast_xml_parser_1.XMLParser({ preserveOrder: true, ignoreAttributes: false, htmlEntities: false }); return convertNode(parser.parse(encodedData)[1]); } catch (e) { const error = (0, throwable_to_error_1.throwableToError)(e); throw new index_1.DecodeError(error.message, error.stack); } }, contentType: 'application/jsonx+xml', }; }; exports.createJsonxTypeDecoder = createJsonxTypeDecoder;