| |
| |
| |
| |
| |
| "use strict"; |
|
|
| |
| |
|
|
| const slashCode = "/".charCodeAt(0); |
| const backslashCode = "\\".charCodeAt(0); |
|
|
| |
| |
| |
| |
| |
| const isInside = (path, parent) => { |
| if (!path.startsWith(parent)) return false; |
| if (path.length === parent.length) return true; |
| const charCode = path.charCodeAt(parent.length); |
| return charCode === slashCode || charCode === backslashCode; |
| }; |
|
|
| module.exports = class RestrictionsPlugin { |
| |
| |
| |
| |
| constructor(source, restrictions) { |
| this.source = source; |
| this.restrictions = restrictions; |
| } |
|
|
| |
| |
| |
| |
| apply(resolver) { |
| resolver |
| .getHook(this.source) |
| .tapAsync("RestrictionsPlugin", (request, resolveContext, callback) => { |
| if (typeof request.path === "string") { |
| const { path } = request; |
| for (const rule of this.restrictions) { |
| if (typeof rule === "string") { |
| if (!isInside(path, rule)) { |
| if (resolveContext.log) { |
| resolveContext.log( |
| `${path} is not inside of the restriction ${rule}`, |
| ); |
| } |
| return callback(null, null); |
| } |
| } else if (!rule.test(path)) { |
| if (resolveContext.log) { |
| resolveContext.log( |
| `${path} doesn't match the restriction ${rule}`, |
| ); |
| } |
| return callback(null, null); |
| } |
| } |
| } |
|
|
| callback(); |
| }); |
| } |
| }; |
|
|