]>
git.immae.eu Git - github/fretlink/purs-loader.git/blob - src/utils.js
1 const path
= require('path');
3 exports
.PscError
= class PscError
extends Error
{
4 constructor(message
, modules
) {
6 this.modules
= modules
;
7 this.isPscError
= true;
15 const repeat
= (value
, times
) =>
16 times
<= 0 ? [] : [value
, ...repeat(value
, times
- 1)];
17 const 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
);
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`;
42 exports
.resolvePursModule
= ({ baseModulePath
, baseModuleName
, rewriteRules
, targetModuleName
}) => {
43 const rewrittenModulePath
= rewrite({ rules: rewriteRules
, moduleName: targetModuleName
});
44 if (rewrittenModulePath
) return rewrittenModulePath
;
45 const parts
= diffPursModuleNames(
46 baseModuleName
.split('.'),
47 targetModuleName
.split('.'),
50 ? path
.resolve(baseModulePath
,
51 `${path.join(...parts)}.purs`)
55 exports
.resolveForeignModule
= pursModulePath
=>
56 path
.join(path
.dirname(pursModulePath
),
57 path
.basename(pursModulePath
, path
.extname(pursModulePath
)) + '.js');