UNPKG

typed-utilities

Version:
50 lines (39 loc) 1.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deepTransform = void 0; var _id = require("./id"); const deepTransform = (input, transform, // eslint-disable-next-line @typescript-eslint/ban-types skipVisitConstructors = [Date, Uint8Array], state = { inputTransformed: false, backReferences: new WeakSet() }) => { const transformKey = transform.key ?? _id.id; const transformValue = transform.value ?? _id.id; if (typeof input !== `object` || input === null) { return transformValue(input); } if (state.backReferences.has(input)) { throw new Error(`circular reference`); } if (!state.inputTransformed) { return deepTransform(transformValue(input), transform, skipVisitConstructors, { ...state, inputTransformed: true }); } state.backReferences.add(input); if (skipVisitConstructors.some(type => input instanceof type)) { return input; } if (Array.isArray(input)) { return input.map(item => deepTransform(item, transform, skipVisitConstructors, { ...state, inputTransformed: false })); } return Object.assign(Object.create(Object.getPrototypeOf(input)), Object.fromEntries(Object.entries(input).map(([key, value]) => [transformKey(key), deepTransform(value, transform, skipVisitConstructors, { ...state, inputTransformed: false })]))); }; exports.deepTransform = deepTransform; //# sourceMappingURL=deepTransform.js.map