gatsby
Version:
Blazing fast modern site generator for React
55 lines (53 loc) • 2.18 kB
JavaScript
// initializing global here for unsafe builtin usage at import time
global.unsafeBuiltinUsage = [];
function createProxyHandler(prefix, options) {
return {
get: function (target, key) {
const value = target[key];
const path = key && key.toString ? `${prefix}.${key.toString()}` : prefix;
if (options.ignore.includes(path)) {
return value;
}
const fieldDescriptor = Object.getOwnPropertyDescriptor(target, key);
if (fieldDescriptor && !fieldDescriptor.writable) {
// this is to prevent errors like:
// ```
// TypeError: 'get' on proxy: property 'constants' is a read - only and
// non - configurable data property on the proxy target but the proxy
// did not return its actual value
// (expected '[object Object]' but got '[object Object]')
// ```
return value;
}
if (typeof value === `function`) {
return function wrapper(...args) {
const myErrorHolder = {
name: `Unsafe builtin usage ${path}`
};
Error.captureStackTrace(myErrorHolder, wrapper);
// - loadPageDataSync already is tracked with dedicated warning messages,
// so skipping marking it to avoid multiple messages for same usage
// - node-gyp-build will use fs.readDirSync in attempt to load binaries
// this should be ok to ignore.
if (!myErrorHolder.stack.includes(`loadPageDataSync`) && !myErrorHolder.stack.includes(`node-gyp-build`)) {
global.unsafeBuiltinUsage.push(myErrorHolder.stack);
}
return value.apply(target, args);
};
} else if (typeof value === `object` && value !== null) {
return new Proxy(value, createProxyHandler(path, options));
}
return value;
}
};
}
function wrapModuleWithTracking(moduleName, options = {}) {
if (!options.ignore) {
options.ignore = [];
}
const mod = require(moduleName);
return new Proxy(mod, createProxyHandler(moduleName, options));
}
exports.wrapModuleWithTracking = wrapModuleWithTracking;
//# sourceMappingURL=tracking-unsafe-module-wrapper.js.map
;