simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

RootsPlugin.js (1381B)


      1 /*
      2 	MIT License http://www.opensource.org/licenses/mit-license.php
      3 	Author Ivan Kopeykin @vankop
      4 */
      5 
      6 "use strict";
      7 
      8 const forEachBail = require("./forEachBail");
      9 
     10 /** @typedef {import("./Resolver")} Resolver */
     11 /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
     12 
     13 class RootsPlugin {
     14 	/**
     15 	 * @param {string | ResolveStepHook} source source hook
     16 	 * @param {Set<string>} roots roots
     17 	 * @param {string | ResolveStepHook} target target hook
     18 	 */
     19 	constructor(source, roots, target) {
     20 		this.roots = Array.from(roots);
     21 		this.source = source;
     22 		this.target = target;
     23 	}
     24 
     25 	/**
     26 	 * @param {Resolver} resolver the resolver
     27 	 * @returns {void}
     28 	 */
     29 	apply(resolver) {
     30 		const target = resolver.ensureHook(this.target);
     31 
     32 		resolver
     33 			.getHook(this.source)
     34 			.tapAsync("RootsPlugin", (request, resolveContext, callback) => {
     35 				const req = request.request;
     36 				if (!req) return callback();
     37 				if (!req.startsWith("/")) return callback();
     38 
     39 				forEachBail(
     40 					this.roots,
     41 					(root, callback) => {
     42 						const path = resolver.join(root, req.slice(1));
     43 						const obj = {
     44 							...request,
     45 							path,
     46 							relativePath: request.relativePath && path
     47 						};
     48 						resolver.doResolve(
     49 							target,
     50 							obj,
     51 							`root path ${root}`,
     52 							resolveContext,
     53 							callback
     54 						);
     55 					},
     56 					callback
     57 				);
     58 			});
     59 	}
     60 }
     61 
     62 module.exports = RootsPlugin;