@matatbread/typia
Version:
Superfast runtime validators with only one line
210 lines • 6.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.iterate_metadata_native = void 0;
const MetadataNative_1 = require("../../../schemas/metadata/MetadataNative");
const ArrayUtil_1 = require("../../../utils/ArrayUtil");
const TypeFactory_1 = require("../../TypeFactory");
const iterate_metadata_native = (props) => {
const name = TypeFactory_1.TypeFactory.getFullName({
checker: props.checker,
type: props.type,
symbol: props.type.getSymbol(),
});
const simple = SIMPLES.get(name);
if (simple !== undefined &&
validate({
checker: props.checker,
type: props.type,
info: simple,
})) {
ArrayUtil_1.ArrayUtil.take(props.metadata.natives, (native) => native.name === name, () => MetadataNative_1.MetadataNative.create({
name,
tags: [],
}));
return true;
}
for (const generic of GENERICS)
if (name.substring(0, generic.name.length) === generic.name &&
validate({
checker: props.checker,
type: props.type,
info: generic,
})) {
ArrayUtil_1.ArrayUtil.take(props.metadata.natives, (native) => native.name === name, () => {
var _a;
return MetadataNative_1.MetadataNative.create({
name: (_a = generic.name) !== null && _a !== void 0 ? _a : name,
tags: [],
});
});
return true;
}
return false;
};
exports.iterate_metadata_native = iterate_metadata_native;
const validate = (props) => {
var _a, _b;
return ((_a = props.info.methods) !== null && _a !== void 0 ? _a : []).every((method) => {
const returnType = TypeFactory_1.TypeFactory.getReturnTypeOfClassMethod({
checker: props.checker,
class: props.type,
function: method.name,
});
return (returnType !== null &&
props.checker.typeToString(returnType) === method.return);
}) &&
((_b = props.info.properties) !== null && _b !== void 0 ? _b : []).every((property) => {
const prop = props.checker.getPropertyOfType(props.type, property.name);
const propType = (prop === null || prop === void 0 ? void 0 : prop.valueDeclaration)
? props.checker.getTypeAtLocation(prop === null || prop === void 0 ? void 0 : prop.valueDeclaration)
: undefined;
return (propType !== undefined &&
props.checker.typeToString(propType) === property.type);
});
};
const getBinaryProps = (className) => ({
name: className,
methods: [
...["indexOf", "lastIndexOf"].map((name) => ({
name,
return: "number",
})),
...["some", "every"].map((name) => ({
name,
return: "boolean",
})),
...["join", "toLocaleString"].map((name) => ({
name,
return: "string",
})),
...["reverse", "slice", "subarray"].map((name) => ({
name,
return: className,
})),
],
properties: ["BYTES_PER_ELEMENT", "length", "byteLength", "byteOffset"].map((name) => ({
name,
type: "number",
})),
});
const SIMPLES = new Map([
[
"Date",
{
methods: ["getTime", "getFullYear", "getMonth", "getMinutes"].map((name) => ({
name,
return: "number",
})),
},
],
[
"Boolean",
{
methods: [
{
name: "valueOf",
return: "boolean",
},
],
},
],
[
"Number",
{
methods: [
...["toFixed", "toExponential", "toPrecision"].map((name) => ({
name,
return: "string",
})),
{ name: "valueOf", return: "number" },
],
},
],
[
"String",
{
methods: [
"charAt",
"concat",
"valueOf",
"trim",
"replace",
"substring",
].map((name) => ({ name, return: "string" })),
},
],
...[
"Uint8Array",
"Uint8ClampedArray",
"Uint16Array",
"Uint32Array",
"BigUint64Array",
"Int8Array",
"Int16Array",
"Int32Array",
"BigInt64Array",
"Float32Array",
"Float64Array",
].map((name) => [name, getBinaryProps(name)]),
...["ArrayBuffer", "SharedArrayBuffer"].map((className) => {
const info = {
methods: [{ name: "slice", return: className }],
properties: [{ name: "byteLength", type: "number" }],
};
return [className, info];
}),
...["Blob", "File"].map((className) => [
className,
{
methods: [
{ name: "arrayBuffer", return: "Promise<ArrayBuffer>" },
{ name: "slice", return: "Blob" },
{ name: "text", return: "Promise<string>" },
],
properties: [
{ name: "size", type: "number" },
{ name: "type", type: "string" },
],
},
]),
[
"DataView",
{
methods: [
"getFloat32",
"getFloat64",
"getInt8",
"getInt16",
"getInt32",
"getUint8",
"getUint16",
"getUint32",
].map((name) => ({
name,
return: "number",
})),
},
],
[
"RegExp",
{
methods: [
{
name: "test",
return: "boolean",
},
],
},
],
]);
const GENERICS = [
"WeakMap",
"WeakSet",
].map((name) => ({
name,
methods: ["has", "delete"].map((name) => ({
name,
return: "boolean",
})),
}));
//# sourceMappingURL=iterate_metadata_native.js.map