UNPKG

1.72 kBJavaScriptView Raw
1'use strict';
2
3// Load modules
4
5
6// Declare internals
7
8const internals = {};
9
10
11exports.generate = function () {
12
13 /*
14 /path/{param}/path/{param?}
15 /path/{param*2}/path
16 /path/{param*2}
17 /path/x{param}x
18 /{param*}
19 */
20
21 const empty = '(?:^\\/$)';
22
23 const legalChars = '[\\w\\!\\$&\'\\(\\)\\*\\+\\,;\\=\\:@\\-\\.~]';
24 const encoded = '%[A-F0-9]{2}';
25
26 const literalChar = '(?:' + legalChars + '|' + encoded + ')';
27 const literal = literalChar + '+';
28 const literalOptional = literalChar + '*';
29
30 const midParam = '(?:\\{\\w+(?:\\*[1-9]\\d*)?\\})'; // {p}, {p*2}
31 const endParam = '(?:\\/(?:\\{\\w+(?:(?:\\*(?:[1-9]\\d*)?)|(?:\\?))?\\})?)?'; // {p}, {p*2}, {p*}, {p?}
32
33 const partialParam = '(?:\\{\\w+\\??\\})'; // {p}, {p?}
34 const mixedParam = '(?:(?:' + literal + partialParam + ')+' + literalOptional + ')|(?:' + partialParam + '(?:' + literal + partialParam + ')+' + literalOptional + ')|(?:' + partialParam + literal + ')';
35
36 const segmentContent = '(?:' + literal + '|' + midParam + '|' + mixedParam + ')';
37 const segment = '\\/' + segmentContent;
38 const segments = '(?:' + segment + ')*';
39
40 const path = '(?:^' + segments + endParam + '$)';
41
42 // 1:literal 2:name 3:* 4:count 5:?
43 const parseParam = '(' + literal + ')|(?:\\{(\\w+)(?:(\\*)(\\d+)?)?(\\?)?\\})';
44
45 const expressions = {
46 parseParam: new RegExp(parseParam, 'g'),
47 validatePath: new RegExp(empty + '|' + path),
48 validatePathEncoded: /%(?:2[146-9A-E]|3[\dABD]|4[\dA-F]|5[\dAF]|6[1-9A-F]|7[\dAE])/g
49 };
50
51 return expressions;
52};