jsdom-configurable-resource-loader
Version:
A JSDOM ResourceLoader with configuration options to whitelist and blacklist resources.
65 lines (63 loc) • 7.46 kB
JavaScript
// src/configurable-resource-loader.ts
import {
ResourceLoader
} from "jsdom";
// src/url-matches.ts
function urlMatches(url, matcher) {
switch (typeof matcher) {
case "string":
if (matcher === "") {
throw new Error(
`Invalid matcher: Tried to match '${url}' against a blank string.`
);
}
return url === matcher;
default:
if (isBlankRegExp(matcher)) {
throw new Error(
`Invalid matcher: Tried to match '${url}' against a blank RegExp.`
);
}
return matcher.test(url);
}
}
var isBlankRegExp = (re) => {
return re.source === new RegExp("").source;
};
// src/configurable-resource-loader.ts
var ConfigurableResourceLoader = class _ConfigurableResourceLoader extends ResourceLoader {
constructor(options) {
super(
_ConfigurableResourceLoader.strictlyResourceLoaderConstructorOptions(
options
)
);
this.options = options != null ? options : { whitelist: [] };
}
static strictlyResourceLoaderConstructorOptions(options) {
if (options === void 0) {
return void 0;
}
const { strictSSL, proxy, userAgent } = options;
return { strictSSL, proxy, userAgent };
}
fetch(url, options) {
if ("blacklist" in this.options) {
if (this.options.blacklist.some((forbidden) => urlMatches(url, forbidden))) {
return null;
}
if (!("whitelist" in this.options)) {
return super.fetch(url, options);
}
}
if ("whitelist" in this.options && (this.options.whitelist.length === 0 || this.options.whitelist.some((allowed) => urlMatches(url, allowed)))) {
return super.fetch(url, options);
} else {
return null;
}
}
};
export {
ConfigurableResourceLoader
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbmZpZ3VyYWJsZS1yZXNvdXJjZS1sb2FkZXIudHMiLCAiLi4vc3JjL3VybC1tYXRjaGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xyXG4gIFJlc291cmNlTG9hZGVyLFxyXG4gIHR5cGUgUmVzb3VyY2VMb2FkZXJDb25zdHJ1Y3Rvck9wdGlvbnMsXHJcbiAgdHlwZSBGZXRjaE9wdGlvbnMsXHJcbiAgdHlwZSBBYm9ydGFibGVQcm9taXNlLFxyXG59IGZyb20gJ2pzZG9tJztcclxuaW1wb3J0IHsgTWF0Y2hlciwgdXJsTWF0Y2hlcyB9IGZyb20gJy4vdXJsLW1hdGNoZXMnO1xyXG5cclxudHlwZSBOZXdPcHRpb25zID1cclxuICB8IHtcclxuICAgICAgd2hpdGVsaXN0OiBNYXRjaGVyW107XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIGJsYWNrbGlzdDogTWF0Y2hlcltdO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB3aGl0ZWxpc3Q6IE1hdGNoZXJbXTtcclxuICAgICAgYmxhY2tsaXN0OiBNYXRjaGVyW107XHJcbiAgICB9O1xyXG5cclxuZXhwb3J0IHR5cGUgQ29uZmlndXJhYmxlUmVzb3VyY2VMb2FkZXJPcHRpb25zID1cclxuICBSZXNvdXJjZUxvYWRlckNvbnN0cnVjdG9yT3B0aW9ucyAmIE5ld09wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhYmxlUmVzb3VyY2VMb2FkZXIgZXh0ZW5kcyBSZXNvdXJjZUxvYWRlciB7XHJcbiAgb3B0aW9uczogQ29uZmlndXJhYmxlUmVzb3VyY2VMb2FkZXJPcHRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29uZmlndXJhYmxlUmVzb3VyY2VMb2FkZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgQ29uZmlndXJhYmxlUmVzb3VyY2VMb2FkZXIuc3RyaWN0bHlSZXNvdXJjZUxvYWRlckNvbnN0cnVjdG9yT3B0aW9ucyhcclxuICAgICAgICBvcHRpb25zXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID8/IHsgd2hpdGVsaXN0OiBbXSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgc3RyaWN0bHlSZXNvdXJjZUxvYWRlckNvbnN0cnVjdG9yT3B0aW9ucyhcclxuICAgIG9wdGlvbnM/OiBDb25maWd1cmFibGVSZXNvdXJjZUxvYWRlck9wdGlvbnNcclxuICApOlxyXG4gICAgfCBPbWl0PFxyXG4gICAgICAgIENvbmZpZ3VyYWJsZVJlc291cmNlTG9hZGVyT3B0aW9ucyxcclxuICAgICAgICBrZXlvZiBOZXdPcHRpb25zXHJcbiAgICAgID5cclxuICAgIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IHN0cmljdFNTTCwgcHJveHksIHVzZXJBZ2VudCB9ID0gb3B0aW9ucztcclxuICAgIHJldHVybiB7IHN0cmljdFNTTCwgcHJveHksIHVzZXJBZ2VudCB9O1xyXG4gIH1cclxuXHJcbiAgZmV0Y2godXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyk6IEFib3J0YWJsZVByb21pc2U8QnVmZmVyPiB8IG51bGwge1xyXG4gICAgaWYgKCdibGFja2xpc3QnIGluIHRoaXMub3B0aW9ucykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmJsYWNrbGlzdC5zb21lKChmb3JiaWRkZW4pID0+IHVybE1hdGNoZXModXJsLCBmb3JiaWRkZW4pKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoISgnd2hpdGVsaXN0JyBpbiB0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZldGNoKHVybCwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICd3aGl0ZWxpc3QnIGluIHRoaXMub3B0aW9ucyAmJlxyXG4gICAgICAodGhpcy5vcHRpb25zLndoaXRlbGlzdC5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICB0aGlzLm9wdGlvbnMud2hpdGVsaXN0LnNvbWUoKGFsbG93ZWQpID0+IHVybE1hdGNoZXModXJsLCBhbGxvd2VkKSkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmZldGNoKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImV4cG9ydCB0eXBlIE1hdGNoZXIgPSBzdHJpbmcgfCBSZWdFeHA7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXJsTWF0Y2hlcyh1cmw6IHN0cmluZywgbWF0Y2hlcjogTWF0Y2hlcik6IGJvb2xlYW4ge1xyXG4gIHN3aXRjaCAodHlwZW9mIG1hdGNoZXIpIHtcclxuICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgIGlmIChtYXRjaGVyID09PSAnJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGBJbnZhbGlkIG1hdGNoZXI6IFRyaWVkIHRvIG1hdGNoICcke3VybH0nIGFnYWluc3QgYSBibGFuayBzdHJpbmcuYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHVybCA9PT0gbWF0Y2hlcjtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGlmIChpc0JsYW5rUmVnRXhwKG1hdGNoZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYEludmFsaWQgbWF0Y2hlcjogVHJpZWQgdG8gbWF0Y2ggJyR7dXJsfScgYWdhaW5zdCBhIGJsYW5rIFJlZ0V4cC5gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbWF0Y2hlci50ZXN0KHVybCk7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc0JsYW5rUmVnRXhwID0gKHJlOiBSZWdFeHApOiBib29sZWFuID0+IHtcclxuICAvLyBBcHBhcmVudGx5LCBuZXcgUmVnRXhwKCcnKS5zb3VyY2UgZG9lcyBub3QgcmV0dXJuIFwiXCIsIGl0IHJldHVybnMgXCIoPzopXCJcclxuICAvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBzdWJqZWN0IHRvIGNoYW5nZSwgc28gdGhpc1xyXG4gIC8vIGZlbHQgbGlrZSB0aGUgc2FmZXN0IHdheSB0byBjaGVjayBpZiBhIHJlZ2V4IHdhcyBidWlsdCB3aXRoIGEgYmxhbmsgcGF0dGVybjpcclxuICByZXR1cm4gcmUuc291cmNlID09PSBuZXcgUmVnRXhwKCcnKS5zb3VyY2U7XHJcbn07XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUFBLEVBQ0U7QUFBQSxPQUlLOzs7QUNIQSxTQUFTLFdBQVcsS0FBYSxTQUEyQjtBQUNqRSxVQUFRLE9BQU8sU0FBUztBQUFBLElBQ3RCLEtBQUs7QUFDSCxVQUFJLFlBQVksSUFBSTtBQUNsQixjQUFNLElBQUk7QUFBQSxVQUNSLG9DQUFvQyxHQUFHO0FBQUEsUUFDekM7QUFBQSxNQUNGO0FBQ0EsYUFBTyxRQUFRO0FBQUEsSUFDakI7QUFDRSxVQUFJLGNBQWMsT0FBTyxHQUFHO0FBQzFCLGNBQU0sSUFBSTtBQUFBLFVBQ1Isb0NBQW9DLEdBQUc7QUFBQSxRQUN6QztBQUFBLE1BQ0Y7QUFDQSxhQUFPLFFBQVEsS0FBSyxHQUFHO0FBQUEsRUFDM0I7QUFDRjtBQUVBLElBQU0sZ0JBQWdCLENBQUMsT0FBd0I7QUFJN0MsU0FBTyxHQUFHLFdBQVcsSUFBSSxPQUFPLEVBQUUsRUFBRTtBQUN0Qzs7O0FESE8sSUFBTSw2QkFBTixNQUFNLG9DQUFtQyxlQUFlO0FBQUEsRUFHN0QsWUFBWSxTQUE2QztBQUN2RDtBQUFBLE1BQ0UsNEJBQTJCO0FBQUEsUUFDekI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFNBQUssVUFBVSw0QkFBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFO0FBQUEsRUFDNUM7QUFBQSxFQUVBLE9BQWUseUNBQ2IsU0FNWTtBQUNaLFFBQUksWUFBWSxRQUFXO0FBQ3pCLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxFQUFFLFdBQVcsT0FBTyxVQUFVLElBQUk7QUFDeEMsV0FBTyxFQUFFLFdBQVcsT0FBTyxVQUFVO0FBQUEsRUFDdkM7QUFBQSxFQUVBLE1BQU0sS0FBYSxTQUF3RDtBQUN6RSxRQUFJLGVBQWUsS0FBSyxTQUFTO0FBQy9CLFVBQ0UsS0FBSyxRQUFRLFVBQVUsS0FBSyxDQUFDLGNBQWMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxHQUNyRTtBQUNBLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxFQUFFLGVBQWUsS0FBSyxVQUFVO0FBQ2xDLGVBQU8sTUFBTSxNQUFNLEtBQUssT0FBTztBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUVBLFFBQ0UsZUFBZSxLQUFLLFlBQ25CLEtBQUssUUFBUSxVQUFVLFdBQVcsS0FDakMsS0FBSyxRQUFRLFVBQVUsS0FBSyxDQUFDLFlBQVksV0FBVyxLQUFLLE9BQU8sQ0FBQyxJQUNuRTtBQUNBLGFBQU8sTUFBTSxNQUFNLEtBQUssT0FBTztBQUFBLElBQ2pDLE9BQU87QUFDTCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K