UNPKG

expression-evaluation

Version:
208 lines (207 loc) 11.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.funcToText = exports.funcFromJsonString = exports.funcToJsonString = exports.funcFromBufferString = exports.funcToBufferString = exports.funcFromNumberString = exports.funcToNumberString = exports.funcFromBooleanString = exports.funcToBooleanString = exports.funcFromStringBuffer = exports.funcToStringBuffer = exports.funcFromNumberBuffer = exports.funcToNumberBuffer = exports.funcFromTimeString = exports.funcToTimeString = exports.funcToLocalTimeWeekdayIndex = exports.funcToUniversalTimeWeekdayIndex = exports.funcToLocalTimeMonthIndex = exports.funcToUniversalTimeMonthIndex = exports.funcFromLocalTime = exports.funcToLocalTime = exports.funcFromUniversalTime = exports.funcToUniversalTime = void 0; exports.parseDate = parseDate; exports.parseBuffer = parseBuffer; exports.stringifyBuffer = stringifyBuffer; exports.textifyValue = textifyValue; const FunctionDefinition_js_1 = require("../FunctionDefinition.js"); const Type_js_1 = require("../Type.js"); exports.funcToUniversalTime = new FunctionDefinition_js_1.FunctionDefinition((value) => { const v = parseDate(value); return v ? [v.getUTCFullYear(), v.getUTCMonth() + 1, v.getUTCDate(), v.getUTCHours(), v.getUTCMinutes(), v.getUTCSeconds(), v.getUTCMilliseconds()] : undefined; }, Type_js_1.typeArray, [Type_js_1.typeNumberOrString]); exports.funcFromUniversalTime = new FunctionDefinition_js_1.FunctionDefinition((value) => Date.UTC(value[0] ?? 1970, (value[1] ?? 1) - 1, value[2] ?? 1, value[3] ?? 0, value[4] ?? 0, value[5] ?? 0, value[6] ?? 0), Type_js_1.typeNumber, [Type_js_1.typeArray]); exports.funcToLocalTime = new FunctionDefinition_js_1.FunctionDefinition((value) => { const v = parseDate(value); return v ? [v.getFullYear(), v.getMonth() + 1, v.getDate(), v.getHours(), v.getMinutes(), v.getSeconds(), v.getMilliseconds()] : undefined; }, Type_js_1.typeArray, [Type_js_1.typeNumberOrString]); exports.funcFromLocalTime = new FunctionDefinition_js_1.FunctionDefinition((value) => new Date(value[0] ?? 1970, (value[1] ?? 1) - 1, value[2] ?? 1, value[3] ?? 0, value[4] ?? 0, value[5] ?? 0, value[6] ?? 0).getTime(), Type_js_1.typeNumber, [Type_js_1.typeArray]); exports.funcToUniversalTimeMonthIndex = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.getUTCMonth(), Type_js_1.typeNumber, [Type_js_1.typeNumberOrString]); exports.funcToLocalTimeMonthIndex = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.getMonth(), Type_js_1.typeNumber, [Type_js_1.typeNumberOrString]); exports.funcToUniversalTimeWeekdayIndex = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.getUTCDay(), Type_js_1.typeNumber, [Type_js_1.typeNumberOrString]); exports.funcToLocalTimeWeekdayIndex = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.getDay(), Type_js_1.typeNumber, [Type_js_1.typeNumberOrString]); exports.funcToTimeString = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.toISOString(), Type_js_1.typeString, [Type_js_1.typeNumberOrString]); exports.funcFromTimeString = new FunctionDefinition_js_1.FunctionDefinition((value) => parseDate(value)?.getTime(), Type_js_1.typeNumber, [Type_js_1.typeString]); exports.funcToNumberBuffer = new FunctionDefinition_js_1.FunctionDefinition((value, encoding) => { if (value == null) { return undefined; } let bits = ''; for (let i = 0; i < encoding.length; ++i) { const c = encoding[i]; if (c >= '0' && c <= '9') { bits += c; } } const dv = new DataView(new Uint8Array(Number.parseInt(bits) / 8).buffer); switch (encoding) { case 'int8': dv.setInt8(0, value); break; case 'int16': dv.setInt16(0, value); break; case 'int16le': dv.setInt16(0, value, true); break; case 'int32': dv.setInt32(0, value); break; case 'int32le': dv.setInt32(0, value, true); break; case 'uint8': dv.setUint8(0, value); break; case 'uint16': dv.setUint16(0, value); break; case 'uint16le': dv.setUint16(0, value, true); break; case 'uint32': dv.setUint32(0, value); break; case 'uint32le': dv.setUint32(0, value, true); break; case 'float32': dv.setFloat32(0, value); break; case 'float32le': dv.setFloat32(0, value, true); break; case 'float64': dv.setFloat64(0, value); break; case 'float64le': dv.setFloat64(0, value, true); break; default: throw new Error(`${encoding} encoding not supported`); } return dv.buffer; }, Type_js_1.typeBuffer, [Type_js_1.typeNumber, Type_js_1.typeString]); exports.funcFromNumberBuffer = new FunctionDefinition_js_1.FunctionDefinition((value, encoding, byteOffset) => { if (value == null) { return undefined; } const dv = new DataView(value, byteOffset); switch (encoding) { case 'int8': return dv.getInt8(0); case 'int16': return dv.getInt16(0); case 'int16le': return dv.getInt16(0, true); case 'int32': return dv.getInt32(0); case 'int32le': return dv.getInt32(0, true); case 'uint8': return dv.getUint8(0); case 'uint16': return dv.getUint16(0); case 'uint16le': return dv.getUint16(0, true); case 'uint32': return dv.getUint32(0); case 'uint32le': return dv.getUint32(0, true); case 'float32': return dv.getFloat32(0); case 'float32le': return dv.getFloat32(0, true); case 'float64': return dv.getFloat64(0); case 'float64le': return dv.getFloat64(0, true); default: throw new Error(`${encoding} encoding not supported`); } }, Type_js_1.typeNumber, [Type_js_1.typeBuffer, Type_js_1.typeString, Type_js_1.typeOptionalNumber], 2, 3); exports.funcToStringBuffer = new FunctionDefinition_js_1.FunctionDefinition((value, encoding = 'utf8') => { if (value == null) { return undefined; } if (encoding === 'utf8') { return new TextEncoder().encode(value).buffer; } else { const dv = new DataView(new Uint16Array(value.length).buffer); const lessOrEqual = encoding.endsWith('le'); for (let i = 0; i < value.length; ++i) { dv.setUint16(i << 1, value.charCodeAt(i), lessOrEqual); } return dv.buffer; } }, Type_js_1.typeBuffer, [Type_js_1.typeString, Type_js_1.typeOptionalString], 1, 2); exports.funcFromStringBuffer = new FunctionDefinition_js_1.FunctionDefinition((value, encoding = 'utf8', byteOffset, byteLength) => { if (value == null) { return undefined; } if (encoding === 'utf8') { return new TextDecoder().decode(new DataView(value, byteOffset, byteLength)); } else { const dv = new DataView(value, byteOffset, byteLength); const lessOrEqual = encoding.endsWith('le'); let str = ''; for (let i = 0; i < dv.byteLength; i += 2) { str += String.fromCharCode(dv.getUint16(i, lessOrEqual)); } return str; } }, Type_js_1.typeString, [Type_js_1.typeBuffer, Type_js_1.typeOptionalString, Type_js_1.typeOptionalNumber, Type_js_1.typeOptionalNumber], 1, 4); exports.funcToBooleanString = new FunctionDefinition_js_1.FunctionDefinition((value) => value?.toString(), Type_js_1.typeOptionalString, [Type_js_1.typeOptionalBoolean]); exports.funcFromBooleanString = new FunctionDefinition_js_1.FunctionDefinition((value) => value ? value.toLowerCase() === 'true' : undefined, Type_js_1.typeOptionalBoolean, [Type_js_1.typeOptionalString]); exports.funcToNumberString = new FunctionDefinition_js_1.FunctionDefinition((value, radix) => value?.toString(radix), Type_js_1.typeOptionalString, [Type_js_1.typeOptionalNumber], 1, 2); exports.funcFromNumberString = new FunctionDefinition_js_1.FunctionDefinition((value) => value ? Number.parseFloat(value) : undefined, Type_js_1.typeOptionalNumber, [Type_js_1.typeOptionalString]); exports.funcToBufferString = new FunctionDefinition_js_1.FunctionDefinition((value) => stringifyBuffer(value), Type_js_1.typeOptionalString, [Type_js_1.typeOptionalBuffer]); exports.funcFromBufferString = new FunctionDefinition_js_1.FunctionDefinition((value) => parseBuffer(value), Type_js_1.typeOptionalBuffer, [Type_js_1.typeOptionalString]); exports.funcToJsonString = new FunctionDefinition_js_1.FunctionDefinition((value, whitespace) => value ? JSON.stringify(value, undefined, whitespace) : undefined, Type_js_1.typeOptionalString, [Type_js_1.typeJson, Type_js_1.typeOptionalString], 1, 2); exports.funcFromJsonString = new FunctionDefinition_js_1.FunctionDefinition((value) => value ? JSON.parse(value) : undefined, Type_js_1.typeJson, [Type_js_1.typeOptionalString]); exports.funcToText = new FunctionDefinition_js_1.FunctionDefinition((value, whitespace) => textifyValue(value, whitespace), Type_js_1.typeString, [Type_js_1.typeUnknown], 1, 2); function parseDate(value) { if (value == null) { return undefined; } const date = new Date(value); return isNaN(date.getTime()) ? undefined : date; } function parseBuffer(value) { if (value == null) { return undefined; } const bytes = new Uint8Array(Math.ceil(value.length / 2)); for (let i = 0, c = 0; c < value.length; ++i) { bytes[i] = Number.parseInt(value.slice(c, c += 2), 16); } return bytes.buffer; } function stringifyBuffer(value) { if (value == null) { return undefined; } const bytes = new Uint8Array(value); let str = ''; for (let i = 0; i < bytes.byteLength; ++i) { str += bytes[i].toString(16).padStart(2, '0'); } return str; } function textifyValue(value, whitespace) { const str = value == null ? 'null' : typeof value === 'boolean' ? value.toString() : typeof value === 'number' ? value.toString() : value instanceof ArrayBuffer ? `#${stringifyBuffer(value)}#` : typeof value === 'string' ? `"${value}"` : undefined; if (str != null) { return str; } const prefix = whitespace ? '\n' + whitespace : ''; const suffix = whitespace ? '\n' : ''; if (Array.isArray(value)) { const lines = value.map((i) => `${prefix}${textifyValue(i, whitespace).split('\n').join(prefix)}`); return `[${lines.join(',')}${suffix}]`; } if (typeof value === 'object') { const separator = whitespace ? ' ' : ''; const lines = Object.entries(value).map(([k, v]) => `${prefix}"${k}":${separator}${textifyValue(v, whitespace).split('\n').join(prefix)}`); return `[${lines.join(',')}${suffix}]`; } return 'function'; }