-
Notifications
You must be signed in to change notification settings - Fork 19
/
parser.js
32 lines (25 loc) · 883 Bytes
/
parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"use strict";
const xregexp = require("xregexp");
// Parse a rollup template like "[name]-[hash][extname]" & a filename generated
// from that template into its constituent parts using a bunch of regex nonsense.
// Using xregexp because it allows for supporting node < 10
const patterns = new Map([
[ "extname", "(?<extname>\\.\\w+)" ],
[ "ext", "(?<ext>\\w+)" ],
[ "hash", "(?<hash>[a-f0-9]{8})" ],
[ "name", "(?<name>\\w+)" ],
]);
const patternsRegex = new RegExp(
`\\[(${[ ...patterns.keys() ].join("|")})\\]`,
"ig"
);
exports.parse = (template, name) => {
const marked = xregexp.escape(
template.replace(patternsRegex, (match, key) => `!!${key}!!`)
);
const parser = xregexp(
marked.replace(/!!(.+?)!!/g, (match, key) => patterns.get(key)),
"i"
);
return xregexp.exec(name, parser);
};