UNPKG

@plist/openstep.serialize

Version:

TypeScript library for serializing OpenStep/NEXTStep Property Lists, in browser and node.js.

66 lines (65 loc) 2.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.serialize = void 0; const UNQUOTED_STRING_REGEX = /^[A-Za-z0-9_.-]+$/; const escapeString = (string) => JSON.stringify(string) .slice(1, -1) .replace(/[^\x20-\x7F]/g, x => '\\u' + x.codePointAt(0).toString(16).padStart(4, '0')); const pad = (n) => { return n < 10 ? '0' + n : n; }; const ISODateString = (d) => { return (d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + 'Z'); }; const serialize = (value) => { if (value === null) { throw new Error('Unsupported null value'); } switch (typeof value) { case 'string': if (UNQUOTED_STRING_REGEX.test(value)) { return value; } else { return `"${escapeString(value)}"`; } case 'bigint': case 'number': return value.toString(); case 'boolean': return value ? '1' : '0'; case 'object': if (Array.isArray(value)) { return `(${value.map(exports.serialize).join(',')})`; } else if (value instanceof Date) { return ISODateString(value); } else if (value instanceof ArrayBuffer) { return `<${new Uint8Array(value).reduce((str, byte) => { return str + byte.toString(16).padStart(2, '0'); }, '')}>`; } else { if (Object.keys(value).length === 0) { return '{}'; } return `{${Object.keys(value) .map(key => `${(0, exports.serialize)(key)}=${(0, exports.serialize)(value[key])}`) .join(';')};}`; } } throw new Error(`Unsupported value type ${typeof value}`); }; exports.serialize = serialize;