]> git.immae.eu Git - github/fretlink/purs-loader.git/commitdiff
Support multiple sources directories when resolving module names
authorCyril Sobierajewicz <cyril.sobierajewicz@fretlink.com>
Fri, 22 Mar 2019 15:25:43 +0000 (16:25 +0100)
committerCyril Sobierajewicz <cyril.sobierajewicz@fretlink.com>
Fri, 22 Mar 2019 15:28:18 +0000 (16:28 +0100)
src/index.js
src/utils.js

index be809c685ac5959cc011388259cea1026578102c..d713737337e985078fab9fef30512ca13e594be9 100644 (file)
@@ -126,7 +126,8 @@ module.exports = function purescriptLoader(source, map) {
     warnings: true,
     watch: false,
     output: 'output',
-    src: []
+    src: [],
+    rewriteRules: {}
   }, loaderOptions, {
     src: srcOption
   });
@@ -227,6 +228,7 @@ module.exports = function purescriptLoader(source, map) {
               const resolved = utils.resolvePursModule({
                 baseModulePath,
                 baseModuleName,
+                rewriteRules: options.rewriteRules,
                 targetModuleName
               });
               this.addDependency(resolved);
index 829ba72902d652f01f7632cf9bb1b2081de87e02..446402ccf98d6f457294229d1db60d573e63b1ac 100644 (file)
@@ -23,7 +23,25 @@ const diffPursModuleNames = (from, target, parts) => {
     ? diffPursModuleNames(tail_from, tail_target, parts)
     : parts.concat(repeat('..', from.length), target);
 };
-exports.resolvePursModule = ({ baseModulePath, baseModuleName, targetModuleName }) => {
+
+const normalizeRewriteRuleDest = ({ dest, moduleName }) =>
+  typeof dest === 'function' ? dest(moduleName) : dest;
+const rewrite = ({ rules, moduleName }) => {
+  const moduleNameParts = moduleName.split('.')
+  for (const [rule, dest] of Object.entries(rules)) {
+    const ruleParts = rule.split('.');
+    const matched = ruleParts.every((part, i) =>
+      part === '*' || part === moduleNameParts[i]);
+    if (!matched) continue;
+    const rest = moduleNameParts.slice(ruleParts.length);
+    const base = normalizeRewriteRuleDest({ dest, moduleName });
+    return `${path.join(base, ...rest)}.purs`;
+  }
+};
+
+exports.resolvePursModule = ({ baseModulePath, baseModuleName, rewriteRules, targetModuleName }) => {
+  const rewrittenModulePath = rewrite({ rules: rewriteRules, moduleName: targetModuleName });
+  if (rewrittenModulePath) return rewrittenModulePath;
   const parts = diffPursModuleNames(
     baseModuleName.split('.'),
     targetModuleName.split('.'),