tynder
Version:
TypeScript friendly Data validator for JavaScript.
110 lines • 4.47 kB
JavaScript
;
// Copyright (c) 2020 Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isUnsafeVarNames = exports.funConstructor = exports.objConstructor = exports.globalObj = exports.dummyTargetObject = void 0;
// tslint:disable: no-shadowed-variable
// tslint:disable: function-constructor
exports.dummyTargetObject = {};
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
_a = (() => {
var _a, _b;
let globalObj = null;
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-implied-eval
globalObj = Function('return this')();
}
catch (e) {
// Nothing to do.
}
if (!globalObj) {
// Fall back (for CSP, etc...)
if (typeof window === 'object' && window) {
globalObj = window;
}
else if (typeof global === 'object' && global) {
globalObj = global;
}
else if (typeof globalThis === 'object' && globalThis) {
globalObj = globalThis;
}
else {
globalObj = exports.dummyTargetObject;
}
}
// NOTE: ({}).constructor === Object
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
let objConstructor = null;
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
objConstructor = ((_a = ({}).constructor) !== null && _a !== void 0 ? _a : Object);
}
catch (e) {
// Nothing to do.
}
if (!objConstructor) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
objConstructor = exports.dummyTargetObject;
}
// NOTE: ({}).toString.constructor === Function
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
let funConstructor = null;
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
funConstructor = ((_b = ({}).toString.constructor) !== null && _b !== void 0 ? _b : Function);
}
catch (e) {
// Nothing to do.
}
if (!funConstructor) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
funConstructor = exports.dummyTargetObject;
}
return ({
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
g: globalObj, o: objConstructor, f: funConstructor
});
})(), exports.globalObj = _a.g, exports.objConstructor = _a.o, exports.funConstructor = _a.f;
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function isUnsafeVarNames(target, varName) {
if (target === exports.globalObj ||
varName === '__proto__' ||
varName === '__defineGetter__' || varName === '__defineSetter__' ||
varName === '__lookupGetter__' || varName === '__lookupSetter__') {
return true;
}
if (varName === 'prototype' || varName === 'constructor') {
if (target === null || target === void 0 || typeof target === 'function') {
return true;
}
}
if (target === null || target === void 0 || target === exports.objConstructor) {
if (Object.prototype.hasOwnProperty.call(exports.objConstructor, varName)) {
return true;
}
}
if (target === null || target === void 0 || target === exports.funConstructor) {
// checking 'call', 'arguments', 'caller', ...
let con = exports.funConstructor;
while (con) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
if (Object.prototype.hasOwnProperty.call(con, varName)) {
return true;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
con = con.__proto__;
}
}
if (typeof target === 'function') {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
if (!Object.prototype.hasOwnProperty.call(target, varName)) {
// function's prototypes' members
return true;
}
}
return false;
}
exports.isUnsafeVarNames = isUnsafeVarNames;
//# sourceMappingURL=protection.js.map