This change modifies the build scripts to use --legacy-peer-deps flag when installing npm dependencies to resolve potential peer dependency conflicts during the build process. The change is applied to both bash (build.sh) and batch (build.bat) build scripts.
172 lines
4.3 KiB
JavaScript
172 lines
4.3 KiB
JavaScript
import {
|
|
VOID, PRIMITIVE,
|
|
ARRAY, OBJECT,
|
|
DATE, REGEXP, MAP, SET,
|
|
ERROR, BIGINT
|
|
} from './types.js';
|
|
|
|
const EMPTY = '';
|
|
|
|
const {toString} = {};
|
|
const {keys} = Object;
|
|
|
|
const typeOf = value => {
|
|
const type = typeof value;
|
|
if (type !== 'object' || !value)
|
|
return [PRIMITIVE, type];
|
|
|
|
const asString = toString.call(value).slice(8, -1);
|
|
switch (asString) {
|
|
case 'Array':
|
|
return [ARRAY, EMPTY];
|
|
case 'Object':
|
|
return [OBJECT, EMPTY];
|
|
case 'Date':
|
|
return [DATE, EMPTY];
|
|
case 'RegExp':
|
|
return [REGEXP, EMPTY];
|
|
case 'Map':
|
|
return [MAP, EMPTY];
|
|
case 'Set':
|
|
return [SET, EMPTY];
|
|
case 'DataView':
|
|
return [ARRAY, asString];
|
|
}
|
|
|
|
if (asString.includes('Array'))
|
|
return [ARRAY, asString];
|
|
|
|
if (asString.includes('Error'))
|
|
return [ERROR, asString];
|
|
|
|
return [OBJECT, asString];
|
|
};
|
|
|
|
const shouldSkip = ([TYPE, type]) => (
|
|
TYPE === PRIMITIVE &&
|
|
(type === 'function' || type === 'symbol')
|
|
);
|
|
|
|
const serializer = (strict, json, $, _) => {
|
|
|
|
const as = (out, value) => {
|
|
const index = _.push(out) - 1;
|
|
$.set(value, index);
|
|
return index;
|
|
};
|
|
|
|
const pair = value => {
|
|
if ($.has(value))
|
|
return $.get(value);
|
|
|
|
let [TYPE, type] = typeOf(value);
|
|
switch (TYPE) {
|
|
case PRIMITIVE: {
|
|
let entry = value;
|
|
switch (type) {
|
|
case 'bigint':
|
|
TYPE = BIGINT;
|
|
entry = value.toString();
|
|
break;
|
|
case 'function':
|
|
case 'symbol':
|
|
if (strict)
|
|
throw new TypeError('unable to serialize ' + type);
|
|
entry = null;
|
|
break;
|
|
case 'undefined':
|
|
return as([VOID], value);
|
|
}
|
|
return as([TYPE, entry], value);
|
|
}
|
|
case ARRAY: {
|
|
if (type) {
|
|
let spread = value;
|
|
if (type === 'DataView') {
|
|
spread = new Uint8Array(value.buffer);
|
|
}
|
|
else if (type === 'ArrayBuffer') {
|
|
spread = new Uint8Array(value);
|
|
}
|
|
return as([type, [...spread]], value);
|
|
}
|
|
|
|
const arr = [];
|
|
const index = as([TYPE, arr], value);
|
|
for (const entry of value)
|
|
arr.push(pair(entry));
|
|
return index;
|
|
}
|
|
case OBJECT: {
|
|
if (type) {
|
|
switch (type) {
|
|
case 'BigInt':
|
|
return as([type, value.toString()], value);
|
|
case 'Boolean':
|
|
case 'Number':
|
|
case 'String':
|
|
return as([type, value.valueOf()], value);
|
|
}
|
|
}
|
|
|
|
if (json && ('toJSON' in value))
|
|
return pair(value.toJSON());
|
|
|
|
const entries = [];
|
|
const index = as([TYPE, entries], value);
|
|
for (const key of keys(value)) {
|
|
if (strict || !shouldSkip(typeOf(value[key])))
|
|
entries.push([pair(key), pair(value[key])]);
|
|
}
|
|
return index;
|
|
}
|
|
case DATE:
|
|
return as([TYPE, value.toISOString()], value);
|
|
case REGEXP: {
|
|
const {source, flags} = value;
|
|
return as([TYPE, {source, flags}], value);
|
|
}
|
|
case MAP: {
|
|
const entries = [];
|
|
const index = as([TYPE, entries], value);
|
|
for (const [key, entry] of value) {
|
|
if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))
|
|
entries.push([pair(key), pair(entry)]);
|
|
}
|
|
return index;
|
|
}
|
|
case SET: {
|
|
const entries = [];
|
|
const index = as([TYPE, entries], value);
|
|
for (const entry of value) {
|
|
if (strict || !shouldSkip(typeOf(entry)))
|
|
entries.push(pair(entry));
|
|
}
|
|
return index;
|
|
}
|
|
}
|
|
|
|
const {message} = value;
|
|
return as([TYPE, {name: type, message}], value);
|
|
};
|
|
|
|
return pair;
|
|
};
|
|
|
|
/**
|
|
* @typedef {Array<string,any>} Record a type representation
|
|
*/
|
|
|
|
/**
|
|
* Returns an array of serialized Records.
|
|
* @param {any} value a serializable value.
|
|
* @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,
|
|
* if `true`, will not throw errors on incompatible types, and behave more
|
|
* like JSON stringify would behave. Symbol and Function will be discarded.
|
|
* @returns {Record[]}
|
|
*/
|
|
export const serialize = (value, {json, lossy} = {}) => {
|
|
const _ = [];
|
|
return serializer(!(json || lossy), !!json, new Map, _)(value), _;
|
|
};
|