diff options
Diffstat (limited to 'src/utils.js')
-rw-r--r-- | src/utils.js | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/utils.js b/src/utils.js index 829ba72..446402c 100644 --- a/src/utils.js +++ b/src/utils.js | |||
@@ -23,7 +23,25 @@ const diffPursModuleNames = (from, target, parts) => { | |||
23 | ? diffPursModuleNames(tail_from, tail_target, parts) | 23 | ? diffPursModuleNames(tail_from, tail_target, parts) |
24 | : parts.concat(repeat('..', from.length), target); | 24 | : parts.concat(repeat('..', from.length), target); |
25 | }; | 25 | }; |
26 | exports.resolvePursModule = ({ baseModulePath, baseModuleName, targetModuleName }) => { | 26 | |
27 | const normalizeRewriteRuleDest = ({ dest, moduleName }) => | ||
28 | typeof dest === 'function' ? dest(moduleName) : dest; | ||
29 | const rewrite = ({ rules, moduleName }) => { | ||
30 | const moduleNameParts = moduleName.split('.') | ||
31 | for (const [rule, dest] of Object.entries(rules)) { | ||
32 | const ruleParts = rule.split('.'); | ||
33 | const matched = ruleParts.every((part, i) => | ||
34 | part === '*' || part === moduleNameParts[i]); | ||
35 | if (!matched) continue; | ||
36 | const rest = moduleNameParts.slice(ruleParts.length); | ||
37 | const base = normalizeRewriteRuleDest({ dest, moduleName }); | ||
38 | return `${path.join(base, ...rest)}.purs`; | ||
39 | } | ||
40 | }; | ||
41 | |||
42 | exports.resolvePursModule = ({ baseModulePath, baseModuleName, rewriteRules, targetModuleName }) => { | ||
43 | const rewrittenModulePath = rewrite({ rules: rewriteRules, moduleName: targetModuleName }); | ||
44 | if (rewrittenModulePath) return rewrittenModulePath; | ||
27 | const parts = diffPursModuleNames( | 45 | const parts = diffPursModuleNames( |
28 | baseModuleName.split('.'), | 46 | baseModuleName.split('.'), |
29 | targetModuleName.split('.'), | 47 | targetModuleName.split('.'), |