clarity-pattern-parser 5.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +328 -38
  2. package/TODO.md +55 -1
  3. package/dist/ast/Node.d.ts +8 -2
  4. package/dist/index.browser.js +470 -205
  5. package/dist/index.browser.js.map +1 -1
  6. package/dist/index.d.ts +6 -1
  7. package/dist/index.esm.js +469 -206
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/index.js +470 -205
  10. package/dist/index.js.map +1 -1
  11. package/dist/intellisense/AutoComplete.d.ts +28 -0
  12. package/dist/intellisense/Suggestion.d.ts +11 -0
  13. package/dist/intellisense/SuggestionOption.d.ts +4 -0
  14. package/dist/patterns/And.d.ts +7 -7
  15. package/dist/patterns/Cursor.d.ts +6 -4
  16. package/dist/patterns/CursorHistory.d.ts +2 -2
  17. package/dist/patterns/Literal.d.ts +7 -8
  18. package/dist/patterns/Not.d.ts +8 -5
  19. package/dist/patterns/Or.d.ts +7 -5
  20. package/dist/patterns/Pattern.d.ts +7 -4
  21. package/dist/patterns/Reference.d.ts +10 -7
  22. package/dist/patterns/Regex.d.ts +7 -8
  23. package/dist/patterns/Repeat.d.ts +7 -7
  24. package/package.json +1 -1
  25. package/src/ast/Node.test.ts +110 -0
  26. package/src/ast/Node.ts +71 -5
  27. package/src/index.ts +14 -3
  28. package/src/intellisense/AutoComplete.test.ts +90 -12
  29. package/src/intellisense/AutoComplete.ts +66 -12
  30. package/src/intellisense/Suggestion.ts +3 -4
  31. package/src/intellisense/javascript/Javascript.test.ts +56 -56
  32. package/src/intellisense/javascript/escapedCharacter.ts +0 -1
  33. package/src/intellisense/javascript/exponent.ts +0 -2
  34. package/src/intellisense/javascript/fraction.ts +0 -2
  35. package/src/patterns/And.test.ts +63 -52
  36. package/src/patterns/And.ts +58 -36
  37. package/src/patterns/Cursor.ts +17 -14
  38. package/src/patterns/CursorHistory.ts +8 -8
  39. package/src/patterns/Literal.test.ts +70 -38
  40. package/src/patterns/Literal.ts +31 -42
  41. package/src/patterns/Not.test.ts +88 -8
  42. package/src/patterns/Not.ts +54 -14
  43. package/src/patterns/Or.test.ts +117 -13
  44. package/src/patterns/Or.ts +36 -13
  45. package/src/patterns/Pattern.ts +7 -4
  46. package/src/patterns/Reference.test.ts +117 -28
  47. package/src/patterns/Reference.ts +58 -32
  48. package/src/patterns/Regex.test.ts +67 -35
  49. package/src/patterns/Regex.ts +31 -43
  50. package/src/patterns/Repeat.test.ts +63 -41
  51. package/src/patterns/Repeat.ts +51 -38
  52. package/src/patterns/getNextPattern.test.ts +0 -39
  53. package/src/patterns/getNextPattern.ts +0 -18
@@ -10,191 +10,191 @@ import { prefixOperator } from "./prefixOperator";
10
10
 
11
11
  describe("Ecmascript 3", () => {
12
12
  test("Escaped Character", () => {
13
- let result = escapedCharacter.parseText(`\\"`);
13
+ let result = escapedCharacter.exec(`\\"`);
14
14
  expect(result.ast?.value).toBe(`\\"`)
15
15
 
16
- result = escapedCharacter.parseText(`\\'`)
16
+ result = escapedCharacter.exec(`\\'`)
17
17
  expect(result.ast?.value).toBe(`\\'`)
18
18
 
19
- result = escapedCharacter.parseText(`\\\\`)
19
+ result = escapedCharacter.exec(`\\\\`)
20
20
  expect(result.ast?.value).toBe(`\\\\`)
21
21
 
22
- result = escapedCharacter.parseText(`\\/`)
22
+ result = escapedCharacter.exec(`\\/`)
23
23
  expect(result.ast?.value).toBe(`\\/`)
24
24
 
25
- result = escapedCharacter.parseText(`\\f`)
25
+ result = escapedCharacter.exec(`\\f`)
26
26
  expect(result.ast?.value).toBe(`\\f`)
27
27
 
28
- result = escapedCharacter.parseText(`\\t`)
28
+ result = escapedCharacter.exec(`\\t`)
29
29
  expect(result.ast?.value).toBe(`\\t`)
30
30
 
31
- result = escapedCharacter.parseText(`\\u00E9`)
31
+ result = escapedCharacter.exec(`\\u00E9`)
32
32
  expect(result.ast?.value).toBe(`\\u00E9`)
33
33
  });
34
34
 
35
35
  test("Exponent", () => {
36
- let result = exponent.parseText("e+1");
36
+ let result = exponent.exec("e+1");
37
37
  expect(result.ast?.value).toBe("e+1")
38
38
 
39
- result = exponent.parseText("e-1");
39
+ result = exponent.exec("e-1");
40
40
  expect(result.ast?.value).toBe("e-1")
41
41
 
42
- result = exponent.parseText("E+1");
42
+ result = exponent.exec("E+1");
43
43
  expect(result.ast?.value).toBe("E+1")
44
44
 
45
- result = exponent.parseText("E-1");
45
+ result = exponent.exec("E-1");
46
46
  expect(result.ast?.value).toBe("E-1")
47
47
 
48
- result = exponent.parseText("e+11");
48
+ result = exponent.exec("e+11");
49
49
  expect(result.ast?.value).toBe("e+11")
50
50
 
51
- result = exponent.parseText("11");
51
+ result = exponent.exec("11");
52
52
  expect(result.ast).toBeNull()
53
53
  });
54
54
 
55
55
  test("Integer", () => {
56
- let result = integer.parseText("0");
56
+ let result = integer.exec("0");
57
57
  expect(result.ast?.value).toBe("0");
58
58
 
59
- result = integer.parseText("1");
59
+ result = integer.exec("1");
60
60
  expect(result.ast?.value).toBe("1");
61
61
 
62
- result = integer.parseText("100");
62
+ result = integer.exec("100");
63
63
  expect(result.ast?.value).toBe("100");
64
64
 
65
- result = integer.parseText(".1");
65
+ result = integer.exec(".1");
66
66
  expect(result.ast).toBeNull();
67
67
  });
68
68
 
69
69
  test("Infix Operator", () => {
70
- let result = infixOperator.parseText("*");
70
+ let result = infixOperator.exec("*");
71
71
  expect(result.ast?.value).toBe("*");
72
72
 
73
- result = infixOperator.parseText("/");
73
+ result = infixOperator.exec("/");
74
74
  expect(result.ast?.value).toBe("/");
75
75
 
76
- result = infixOperator.parseText("%");
76
+ result = infixOperator.exec("%");
77
77
  expect(result.ast?.value).toBe("%");
78
78
 
79
- result = infixOperator.parseText("+");
79
+ result = infixOperator.exec("+");
80
80
  expect(result.ast?.value).toBe("+");
81
81
 
82
- result = infixOperator.parseText("-");
82
+ result = infixOperator.exec("-");
83
83
  expect(result.ast?.value).toBe("-");
84
84
 
85
- result = infixOperator.parseText(">=");
85
+ result = infixOperator.exec(">=");
86
86
  expect(result.ast?.value).toBe(">=");
87
87
 
88
- result = infixOperator.parseText("<=");
88
+ result = infixOperator.exec("<=");
89
89
  expect(result.ast?.value).toBe("<=");
90
90
 
91
- result = infixOperator.parseText(">");
91
+ result = infixOperator.exec(">");
92
92
  expect(result.ast?.value).toBe(">");
93
93
 
94
- result = infixOperator.parseText("<");
94
+ result = infixOperator.exec("<");
95
95
  expect(result.ast?.value).toBe("<");
96
96
 
97
- result = infixOperator.parseText("===");
97
+ result = infixOperator.exec("===");
98
98
  expect(result.ast?.value).toBe("===");
99
99
 
100
- result = infixOperator.parseText("!==");
100
+ result = infixOperator.exec("!==");
101
101
  expect(result.ast?.value).toBe("!==");
102
102
 
103
- result = infixOperator.parseText("||");
103
+ result = infixOperator.exec("||");
104
104
  expect(result.ast?.value).toBe("||");
105
105
 
106
- result = infixOperator.parseText("&&");
106
+ result = infixOperator.exec("&&");
107
107
  expect(result.ast?.value).toBe("&&");
108
108
 
109
- result = infixOperator.parseText("bad");
109
+ result = infixOperator.exec("bad");
110
110
  expect(result.ast).toBeNull();
111
111
  });
112
112
 
113
113
 
114
114
  test("Name", () => {
115
- let result = name.parseText("p_0");
115
+ let result = name.exec("p_0");
116
116
  expect(result.ast?.value).toBe("p_0");
117
117
 
118
- result = name.parseText("_0");
118
+ result = name.exec("_0");
119
119
  expect(result.ast?.value).toBe("_0");
120
120
 
121
- result = name.parseText("0");
121
+ result = name.exec("0");
122
122
  expect(result.ast).toBeNull();
123
123
 
124
- result = name.parseText("_");
124
+ result = name.exec("_");
125
125
  expect(result.ast?.value).toBe("_");
126
126
  });
127
127
 
128
128
  test("Parameters", () => {
129
- let result = parameters.parseText("(param1)");
129
+ let result = parameters.exec("(param1)");
130
130
  expect(result.ast?.value).toBe("(param1)");
131
131
 
132
- result = parameters.parseText("(param1, param2)");
132
+ result = parameters.exec("(param1, param2)");
133
133
  expect(result.ast?.value).toBe("(param1, param2)");
134
134
 
135
- result = parameters.parseText("(param1, param2,)");
135
+ result = parameters.exec("(param1, param2,)");
136
136
  expect(result.ast).toBeNull();
137
137
  });
138
138
 
139
139
  test("Prefix Operator", () => {
140
- let result = prefixOperator.parseText("typeof ");
140
+ let result = prefixOperator.exec("typeof ");
141
141
  expect(result.ast?.value).toBe("typeof ");
142
142
 
143
- result = prefixOperator.parseText("+");
143
+ result = prefixOperator.exec("+");
144
144
  expect(result.ast?.value).toBe("+");
145
145
 
146
- result = prefixOperator.parseText("-");
146
+ result = prefixOperator.exec("-");
147
147
  expect(result.ast?.value).toBe("-");
148
148
 
149
- result = prefixOperator.parseText("!");
149
+ result = prefixOperator.exec("!");
150
150
  expect(result.ast?.value).toBe("!");
151
151
 
152
- result = prefixOperator.parseText("a");
152
+ result = prefixOperator.exec("a");
153
153
  expect(result.ast).toBeNull();
154
154
  });
155
155
 
156
156
  test("Object Literal", () => {
157
- let result = expression.parseText(`{}`)
157
+ let result = expression.exec(`{}`)
158
158
  expect(result.ast?.value).toBe("{}");
159
159
 
160
- result = expression.parseText(`{prop:{}}`)
160
+ result = expression.exec(`{prop:{}}`)
161
161
  expect(result.ast?.value).toBe("{prop:{}}");
162
162
 
163
- result = expression.parseText(`{prop:"value"}`)
163
+ result = expression.exec(`{prop:"value"}`)
164
164
  expect(result.ast?.value).toBe(`{prop:"value"}`);
165
165
 
166
- result = expression.parseText(`{prop:0.9}`)
166
+ result = expression.exec(`{prop:0.9}`)
167
167
  expect(result.ast?.value).toBe(`{prop:0.9}`);
168
168
 
169
- result = expression.parseText(`{prop:1}`)
169
+ result = expression.exec(`{prop:1}`)
170
170
  expect(result.ast?.value).toBe(`{prop:1}`);
171
171
 
172
- result = expression.parseText(`{"prop":1}`)
172
+ result = expression.exec(`{"prop":1}`)
173
173
  expect(result.ast?.value).toBe(`{"prop":1}`);
174
174
  });
175
175
 
176
176
  test("Array Literal", () => {
177
- let result = expression.parseText("[]")
177
+ let result = expression.exec("[]")
178
178
  expect(result.ast?.value).toBe("[]");
179
179
 
180
- result = expression.parseText("[{}, 9, 0.9e-10, [1, 2]]")
180
+ result = expression.exec("[{}, 9, 0.9e-10, [1, 2]]")
181
181
  expect(result.ast?.value).toBe("[{}, 9, 0.9e-10, [1, 2]]");
182
182
  });
183
183
 
184
184
  test("Expression Statement", () => {
185
- let result = expressionStatement.parseText(`name = "John"`);
185
+ let result = expressionStatement.exec(`name = "John"`);
186
186
  expect(result.ast?.value).toBe(`name = "John"`);
187
187
 
188
- result = expressionStatement.parseText(`name = othername = "John"`)
188
+ result = expressionStatement.exec(`name = othername = "John"`)
189
189
  expect(result.ast?.value).toBe(`name = othername = "John"`);
190
190
 
191
- result = expressionStatement.parseText(`name = othername.prop = "John"`)
191
+ result = expressionStatement.exec(`name = othername.prop = "John"`)
192
192
  expect(result.ast?.value).toBe(`name = othername.prop = "John"`);
193
193
 
194
- result = expressionStatement.parseText(`name = othername.prop += 2`)
194
+ result = expressionStatement.exec(`name = othername.prop += 2`)
195
195
  expect(result.ast?.value).toBe(`name = othername.prop += 2`);
196
196
 
197
- result = expressionStatement.parseText(`name.prop().method(blah) = blah.prop()`)
197
+ result = expressionStatement.exec(`name.prop().method(blah) = blah.prop()`)
198
198
  expect(result.ast?.value).toBe(`name.prop().method(blah) = blah.prop()`);
199
199
 
200
200
  });
@@ -42,7 +42,6 @@ const specialCharacter = new Or("special-character", [
42
42
  ]);
43
43
 
44
44
  const escapedCharacter = new And("escaped-character", [backslash, specialCharacter])
45
- escapedCharacter.enableAstReduction();
46
45
 
47
46
  export {
48
47
  escapedCharacter
@@ -21,6 +21,4 @@ const exponent = new And("exponent", [
21
21
  digit,
22
22
  ]);
23
23
 
24
- exponent.enableAstReduction();
25
-
26
24
  export { exponent }
@@ -6,8 +6,6 @@ const period = new Literal("period", ".");
6
6
  const digit = new Regex("digit", "\\d+");
7
7
  const fraction = new And("fraction", [period, digit]);
8
8
 
9
- fraction.enableAstReduction();
10
-
11
9
  export {
12
10
  fraction
13
11
  }
@@ -77,7 +77,7 @@ describe("And", () => {
77
77
  const sequence = new And("sequence", [
78
78
  new Literal("a", "A"),
79
79
  new Literal("b", "B", true)
80
- ], true);
80
+ ]);
81
81
  const cursor = new Cursor("AD");
82
82
  const result = sequence.parse(cursor);
83
83
  const expected = new Node("and", "sequence", 0, 0, [
@@ -93,7 +93,7 @@ describe("And", () => {
93
93
  const sequence = new And("sequence", [
94
94
  new Literal("a", "A"),
95
95
  new Literal("b", "B", true)
96
- ], true);
96
+ ]);
97
97
  const cursor = new Cursor("A");
98
98
  const result = sequence.parse(cursor);
99
99
  const expected = new Node("and", "sequence", 0, 0, [
@@ -105,7 +105,7 @@ describe("And", () => {
105
105
  expect(cursor.index).toBe(0);
106
106
  });
107
107
 
108
- test("Incomplete Parse", () => {
108
+ test("Incomplete Parse (Optional)", () => {
109
109
  const sequence = new And("sequence", [
110
110
  new Literal("a", "A"),
111
111
  new Literal("b", "B")
@@ -175,6 +175,32 @@ describe("And", () => {
175
175
  expect(sequence.children[0].name).toBe("a");
176
176
  });
177
177
 
178
+ test("Exec", () => {
179
+ const sequence = new And("sequence", [new Literal("a", "A")]);
180
+
181
+ const { ast: result, cursor } = sequence.exec("A");
182
+ const expected = new Node("and", "sequence", 0, 0, [
183
+ new Node("literal", "a", 0, 0, undefined, "A")
184
+ ]);
185
+
186
+ expect(result).toEqual(expected)
187
+ expect(cursor).not.toBeNull();
188
+ });
189
+
190
+ test("Test With Match", () => {
191
+ const sequence = new And("sequence", [new Literal("a", "A")]);
192
+ const hasMatch = sequence.test("A");
193
+
194
+ expect(hasMatch).toBeTruthy();
195
+ });
196
+
197
+ test("Test With No Match", () => {
198
+ const sequence = new And("sequence", [new Literal("a", "A")]);
199
+ const hasMatch = sequence.test("B");
200
+
201
+ expect(hasMatch).toBeFalsy();
202
+ });
203
+
178
204
  test("Set Parent", () => {
179
205
  const a = new Literal("a", "A", true)
180
206
  const sequence = new And("sequence", [
@@ -186,33 +212,6 @@ describe("And", () => {
186
212
  expect(parent.children[0].type).toBe("and");
187
213
  });
188
214
 
189
- test("Reduce Ast", () => {
190
- const sequence = new And("sequence", [
191
- new Literal("a", "A"),
192
- ], true);
193
- sequence.enableAstReduction();
194
-
195
- const cursor = new Cursor("A");
196
- let result = sequence.parse(cursor);
197
- let expected = new Node("and", "sequence", 0, 0, [], "A");
198
-
199
- expect(result).toEqual(expected);
200
- expect(cursor.error).toBe(null)
201
- expect(cursor.index).toBe(0);
202
-
203
- sequence.disableAstReduction()
204
-
205
- cursor.moveTo(0)
206
- result = sequence.parse(cursor);
207
- expected = new Node("and", "sequence", 0, 0, [
208
- new Node("literal", "a", 0, 0, [], "A"),
209
- ]);
210
-
211
- expect(result).toEqual(expected);
212
- expect(cursor.error).toBe(null)
213
- expect(cursor.index).toBe(0);
214
- });
215
-
216
215
  test("Get Tokens", () => {
217
216
  const sequence = new And("sequence", [
218
217
  new Literal("a", "A", true),
@@ -224,76 +223,88 @@ describe("And", () => {
224
223
  expect(tokens).toEqual(expected);
225
224
  });
226
225
 
227
- test("Get Next Tokens", () => {
226
+ test("Get Tokens After", () => {
228
227
  const sequence = new And("sequence", [
229
228
  new Literal("a", "A"),
230
229
  new Literal("b", "B", true),
231
230
  new Literal("c", "C"),
232
231
  ], true);
233
232
 
234
- const tokens = sequence.getNextTokens(sequence.children[0])
233
+ const tokens = sequence.getTokensAfter(sequence.children[0])
235
234
  const expected = ["B", "C"];
236
235
 
237
236
  expect(tokens).toEqual(expected);
238
237
  });
239
238
 
240
- test("Get Next Tokens With Invalid Pattern", () => {
239
+ test("Get Tokens After With Invalid Pattern", () => {
241
240
  const sequence = new And("sequence", [
242
241
  new Literal("a", "A"),
243
242
  new Literal("b", "B", true),
244
243
  new Literal("c", "C"),
245
244
  ], true);
246
245
 
247
- const tokens = sequence.getNextTokens(new Literal("not-child", "not-child"))
246
+ const tokens = sequence.getTokensAfter(new Literal("not-child", "not-child"))
248
247
 
249
248
  expect(tokens).toEqual([]);
250
249
  });
251
250
 
252
- test("Get Next Tokens With Last Child", () => {
251
+ test("Get Tokens After With Last Child", () => {
253
252
  const sequence = new And("sequence", [
254
253
  new Literal("a", "A"),
255
254
  ], true);
256
255
  const parent = new And("parent", [sequence, new Literal("b", "B")]);
257
256
 
258
257
 
259
- const tokens = parent.children[0].getNextTokens(parent.children[0].children[0])
258
+ const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
260
259
 
261
260
  expect(tokens).toEqual(["B"]);
262
261
  });
263
262
 
264
- test("Get Next Tokens With Last Optional Child", () => {
263
+ test("Get Tokens After With Last Optional Child", () => {
265
264
  const sequence = new And("sequence", [
266
265
  new Literal("a", "A"),
267
266
  new Literal("b", "B", true),
268
267
  ], true);
269
268
  const parent = new And("parent", [sequence, new Literal("c", "C")]);
270
269
 
271
-
272
- const tokens = parent.children[0].getNextTokens(parent.children[0].children[0])
270
+ const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
273
271
 
274
272
  expect(tokens).toEqual(["B", "C"]);
275
273
  });
276
274
 
277
- test("Parse Text", () => {
275
+ test("Get Next Tokens", () => {
278
276
  const sequence = new And("sequence", [new Literal("a", "A")]);
279
- sequence.enableAstReduction();
277
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
280
278
 
281
- const { ast: result } = sequence.parseText("A");
282
- const expected = new Node("and", "sequence", 0, 0, [], "A");
279
+ const sequenceClone = parent.findPattern(p => p.name === "sequence");
280
+ const tokens = sequenceClone?.getNextTokens() || [];
283
281
 
284
- expect(result).toEqual(expected)
282
+ expect(tokens[0]).toBe("B");
285
283
  });
286
284
 
287
- test("Get Next Pattern", () => {
288
- const sequence = new And("sequence", [
289
- new Literal("a", "A"),
290
- new Literal("b", "B", true),
291
- ], true);
292
- const parent = new And("parent", [sequence, new Literal("c", "C")]);
285
+ test("Get Next Tokens With Null Parent", () => {
286
+ const sequence = new And("sequence", [new Literal("a", "A")]);
287
+ const tokens = sequence.getNextTokens();
288
+
289
+ expect(tokens.length).toBe(0);
290
+ });
293
291
 
292
+ test("Get Next Patterns", () => {
293
+ const sequence = new And("sequence", [new Literal("a", "A")]);
294
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
294
295
 
295
- const nextPattern = parent.children[0].getNextPattern()
296
+ const sequenceClone = parent.findPattern(p => p.name === "sequence");
297
+ const nextPatterns = sequenceClone?.getNextPatterns() || [];
298
+ const b = parent.findPattern(p => p.name === "b")
296
299
 
297
- expect(nextPattern?.name).toBe("c");
300
+ expect(nextPatterns[0]).toBe(b);
298
301
  });
302
+
303
+ test("Get Next Patterns With Null Parent", () => {
304
+ const sequence = new And("sequence", [new Literal("a", "A")]);
305
+ const nextPatterns = sequence.getNextPatterns()
306
+
307
+ expect(nextPatterns.length).toBe(0);
308
+ });
309
+
299
310
  });