@sudoo/marked
Version:
JavaScript & TypeScript code runner in JavaScript, safe with marked territory, asynchronous
104 lines (103 loc) • 3.74 kB
JavaScript
;
/**
* @author WMXPY
* @namespace Parse
* @description Native To Sand
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseNativeToSand = void 0;
const error_code_1 = require("../declare/error-code");
const error_1 = require("../util/error/error");
const type_check_1 = require("../util/type-check");
const native_class_1 = require("../variable/native-class/native-class");
const native_class_instance_1 = require("../variable/native-class/native-class-instance");
const sand_class_1 = require("../variable/sand-class/sand-class");
const sand_class_instance_1 = require("../variable/sand-class/sand-class-instance");
const sand_function_1 = require("../variable/sand-function/sand-function");
const sand_list_1 = require("../variable/sand-list");
const bigint_1 = require("../variable/sand-literal/bigint");
const regexp_1 = require("../variable/sand-literal/regexp");
const sand_map_1 = require("../variable/sand-map");
const sand_to_native_1 = require("./sand-to-native");
const parseNativeToSand = (target) => {
if (typeof target === "undefined") {
return undefined;
}
if (target === null) {
return null;
}
if (typeof target === "string") {
return target;
}
if (typeof target === "number") {
return target;
}
if (typeof target === "boolean") {
return target;
}
if (typeof target === "bigint") {
const sandBitInt = bigint_1.SandLiteralBigInt.create(target.toString());
return sandBitInt;
}
if (Array.isArray(target)) {
const list = sand_list_1.SandList.fromScratch();
for (const element of target) {
list.push((0, exports.parseNativeToSand)(element));
}
return list;
}
if (target instanceof RegExp) {
return regexp_1.SandLiteralRegExp.create(target.source, target.flags);
}
if (target instanceof native_class_1.MarkedNativeClass) {
return target;
}
if (target instanceof native_class_instance_1.MarkedNativeClassInstance) {
return target;
}
if (target instanceof sand_class_1.SandClass) {
return target;
}
if (target instanceof sand_class_instance_1.SandClassInstance) {
return target;
}
if (target instanceof sand_function_1.SandFunction) {
return target;
}
if (target instanceof bigint_1.SandLiteralBigInt) {
return target;
}
if (target instanceof regexp_1.SandLiteralRegExp) {
return target;
}
if (target instanceof sand_map_1.SandMap) {
return target;
}
if (target instanceof sand_list_1.SandList) {
return target;
}
if (typeof target === "object") {
if (target.constructor && target.constructor.name !== "Object") {
throw (0, error_1.error)(error_code_1.ERROR_CODE.CANNOT_TRANSFER_NATIVE_TO_CLASS_INSTANCE, target.constructor.name);
}
const map = sand_map_1.SandMap.fromScratch();
for (const key of Object.keys(target)) {
map.set(key, (0, exports.parseNativeToSand)(target[key]));
}
return map;
}
if ((0, type_check_1.typeCheckIsConstructor)(target)) {
throw (0, error_1.error)(error_code_1.ERROR_CODE.CANNOT_TRANSFER_NATIVE_TO_CLASS, target);
}
if (typeof target === "function") {
return (...args) => {
const parsedArgs = [];
for (const arg of args) {
parsedArgs.push((0, sand_to_native_1.extractSandToNative)(arg));
}
return target(...parsedArgs);
};
}
throw (0, error_1.error)(error_code_1.ERROR_CODE.INTERNAL_ERROR, "Invalid Type");
};
exports.parseNativeToSand = parseNativeToSand;