| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Ivan Kopeykin @vankop |
| */ |
| |
| "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.path; |
| |
| for (let i = 0; i < this.restrictions.length; i++) { |
| const rule = this.restrictions[i]; |
| 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(); |
| }); |
| } |
| }; |