]> git.immae.eu Git - github/fretlink/purs-loader.git/blame - src/utils.js
Merge pull request #4 from cyrilfretlink/4.2.0
[github/fretlink/purs-loader.git] / src / utils.js
CommitLineData
f9d5f2fa
CS
1const path = require('path');
2
e3de0f71
CS
3exports.PscError = class PscError extends Error {
4 constructor(message, modules) {
5 super(message);
6 this.modules = modules;
40d1d0a5 7 this.isPscError = true;
e3de0f71
CS
8 }
9
10 static get name() {
11 return 'PscError';
12 }
13};
14
f9d5f2fa
CS
15const repeat = (value, times) =>
16 times <= 0 ? [] : [value, ...repeat(value, times - 1)];
17const diffPursModuleNames = (from, target, parts) => {
18 if (!from.length) return parts.concat(target);
19 if (!target.length) return parts.concat(repeat('..', from.length));
20 const [head_from, ...tail_from] = from;
21 const [head_target, ...tail_target] = target;
22 return head_from === head_target
23 ? diffPursModuleNames(tail_from, tail_target, parts)
24 : parts.concat(repeat('..', from.length), target);
25};
ab51e751
CS
26
27const normalizeRewriteRuleDest = ({ dest, moduleName }) =>
28 typeof dest === 'function' ? dest(moduleName) : dest;
29const 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
42exports.resolvePursModule = ({ baseModulePath, baseModuleName, rewriteRules, targetModuleName }) => {
43 const rewrittenModulePath = rewrite({ rules: rewriteRules, moduleName: targetModuleName });
44 if (rewrittenModulePath) return rewrittenModulePath;
f9d5f2fa
CS
45 const parts = diffPursModuleNames(
46 baseModuleName.split('.'),
47 targetModuleName.split('.'),
48 []);
49 return parts.length
50 ? path.resolve(baseModulePath,
51 `${path.join(...parts)}.purs`)
52 : baseModulePath;
53};
c69d78d9
CS
54
55exports.resolveForeignModule = pursModulePath =>
56 path.join(path.dirname(pursModulePath),
57 path.basename(pursModulePath, path.extname(pursModulePath)) + '.js');