typed-utilities
Version:
Strongly typed general purpose utilities
50 lines (39 loc) • 1.45 kB
JavaScript
;
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