1 | function ensureValidUseOfParenthesesOrBrackets(pattern) {
|
2 | const counts = {
|
3 | '[': 0,
|
4 | ']': 0,
|
5 | '(': 0,
|
6 | ')': 0
|
7 | };
|
8 | for (let i = 0; i < pattern.length; i += 1) {
|
9 | const c = pattern.charAt(i);
|
10 | if (c in counts) {
|
11 | counts[c] += 1;
|
12 | }
|
13 | if (c === ']' && counts['['] >= counts[']']) {
|
14 | if (counts['['] === counts[']'] + 1) {
|
15 | throw new Error(
|
16 | `Assertion patterns must not contain flags with brackets: '${pattern}'`
|
17 | );
|
18 | }
|
19 |
|
20 | if (counts['('] !== counts[')']) {
|
21 | throw new Error(
|
22 | `Assertion patterns must not contain flags with parentheses: '${pattern}'`
|
23 | );
|
24 | }
|
25 |
|
26 | if (pattern.charAt(i - 1) === '[') {
|
27 | throw new Error(
|
28 | `Assertion patterns must not contain empty flags: '${pattern}'`
|
29 | );
|
30 | }
|
31 | } else if (c === ')' && counts['('] >= counts[')']) {
|
32 | if (counts['('] === counts[')'] + 1) {
|
33 | throw new Error(
|
34 | `Assertion patterns must not contain alternations with parentheses: '${pattern}'`
|
35 | );
|
36 | }
|
37 |
|
38 | if (counts['['] !== counts[']']) {
|
39 | throw new Error(
|
40 | `Assertion patterns must not contain alternations with brackets: '${pattern}'`
|
41 | );
|
42 | }
|
43 | }
|
44 | }
|
45 |
|
46 | if (counts['['] !== counts[']']) {
|
47 | throw new Error(
|
48 | `Assertion patterns must not contain unbalanced brackets: '${pattern}'`
|
49 | );
|
50 | }
|
51 |
|
52 | if (counts['('] !== counts[')']) {
|
53 | throw new Error(
|
54 | `Assertion patterns must not contain unbalanced parentheses: '${pattern}'`
|
55 | );
|
56 | }
|
57 | }
|
58 |
|
59 | module.exports = ensureValidUseOfParenthesesOrBrackets;
|