clarity-pattern-parser 4.0.3 → 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 (133) hide show
  1. package/README.md +466 -1
  2. package/TODO.md +76 -2
  3. package/dist/ast/Node.d.ts +49 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1513 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +17 -17
  8. package/dist/index.esm.js +1480 -1459
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1481 -1463
  11. package/dist/index.js.map +1 -1
  12. package/dist/intellisense/AutoComplete.d.ts +28 -0
  13. package/dist/intellisense/Suggestion.d.ts +11 -0
  14. package/dist/intellisense/SuggestionOption.d.ts +4 -0
  15. package/dist/patterns/And.d.ts +37 -24
  16. package/dist/patterns/Cursor.d.ts +37 -0
  17. package/dist/patterns/CursorHistory.d.ts +30 -0
  18. package/dist/patterns/Literal.d.ts +35 -19
  19. package/dist/patterns/Not.d.ts +29 -11
  20. package/dist/patterns/Or.d.ts +33 -22
  21. package/dist/patterns/ParseError.d.ts +6 -8
  22. package/dist/patterns/ParseResult.d.ts +6 -0
  23. package/dist/patterns/Pattern.d.ts +20 -26
  24. package/dist/patterns/Reference.d.ts +34 -12
  25. package/dist/patterns/Regex.d.ts +41 -21
  26. package/dist/patterns/Repeat.d.ts +38 -20
  27. package/dist/patterns/clonePatterns.d.ts +2 -0
  28. package/dist/patterns/filterOutNull.d.ts +2 -0
  29. package/dist/patterns/findPattern.d.ts +2 -0
  30. package/dist/patterns/getNextPattern.d.ts +2 -0
  31. package/jest.config.js +2 -1
  32. package/package.json +4 -5
  33. package/rollup.config.js +1 -1
  34. package/src/ast/Node.test.ts +364 -0
  35. package/src/ast/Node.ts +237 -23
  36. package/src/index.ts +25 -27
  37. package/src/intellisense/AutoComplete.test.ts +150 -0
  38. package/src/intellisense/AutoComplete.ts +200 -0
  39. package/src/intellisense/Suggestion.ts +12 -0
  40. package/src/intellisense/SuggestionOption.ts +4 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  42. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  43. package/src/intellisense/css/hex.ts +6 -0
  44. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  45. package/src/intellisense/css/name.ts +5 -0
  46. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  47. package/src/intellisense/css/spaces.ts +6 -0
  48. package/src/intellisense/css/unit.ts +10 -0
  49. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  50. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  51. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  52. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  53. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  54. package/src/intellisense/javascript/escapedCharacter.ts +49 -0
  55. package/src/intellisense/javascript/exponent.ts +24 -0
  56. package/src/intellisense/javascript/expression.ts +87 -0
  57. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  58. package/src/intellisense/javascript/fraction.ts +11 -0
  59. package/src/intellisense/javascript/infixOperator.ts +36 -0
  60. package/src/intellisense/javascript/integer.ts +7 -0
  61. package/src/intellisense/javascript/invocation.ts +28 -0
  62. package/src/intellisense/javascript/literal.ts +14 -0
  63. package/src/intellisense/javascript/name.ts +3 -0
  64. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  65. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  66. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  67. package/src/intellisense/javascript/parameters.ts +20 -0
  68. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  69. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  70. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  71. package/src/patterns/And.test.ts +310 -0
  72. package/src/patterns/And.ts +244 -119
  73. package/src/patterns/Cursor.test.ts +93 -0
  74. package/src/patterns/Cursor.ts +133 -0
  75. package/src/patterns/CursorHistory.test.ts +54 -0
  76. package/src/patterns/CursorHistory.ts +95 -0
  77. package/src/patterns/Literal.test.ts +166 -0
  78. package/src/patterns/Literal.ts +141 -62
  79. package/src/patterns/Not.test.ts +168 -0
  80. package/src/patterns/Not.ts +113 -32
  81. package/src/patterns/Or.test.ts +209 -0
  82. package/src/patterns/Or.ts +128 -97
  83. package/src/patterns/ParseError.ts +3 -7
  84. package/src/patterns/ParseResult.ts +7 -0
  85. package/src/patterns/Pattern.ts +21 -150
  86. package/src/patterns/Reference.test.ts +193 -0
  87. package/src/patterns/Reference.ts +114 -88
  88. package/src/patterns/Regex.test.ts +133 -0
  89. package/src/patterns/Regex.ts +117 -60
  90. package/src/patterns/Repeat.test.ts +218 -0
  91. package/src/patterns/Repeat.ts +220 -103
  92. package/src/patterns/clonePatterns.ts +5 -0
  93. package/src/patterns/filterOutNull.ts +13 -0
  94. package/src/patterns/findPattern.ts +25 -0
  95. package/src/Cursor.ts +0 -141
  96. package/src/CursorHistory.ts +0 -146
  97. package/src/TextSuggester.ts +0 -317
  98. package/src/ast/Visitor.ts +0 -271
  99. package/src/patterns/LookAhead.ts +0 -32
  100. package/src/patterns/Recursive.ts +0 -92
  101. package/src/tests/And.test.ts +0 -180
  102. package/src/tests/ComplexExamples.test.ts +0 -86
  103. package/src/tests/CssPatterns.test.ts +0 -90
  104. package/src/tests/CursorHistory.test.ts +0 -107
  105. package/src/tests/Cusor.test.ts +0 -174
  106. package/src/tests/HtmlPatterns.test.ts +0 -34
  107. package/src/tests/Literal.test.ts +0 -79
  108. package/src/tests/LookAhead.test.ts +0 -44
  109. package/src/tests/Not.test.ts +0 -51
  110. package/src/tests/Or.test.ts +0 -113
  111. package/src/tests/Pattern.test.ts +0 -290
  112. package/src/tests/Recursive.test.ts +0 -64
  113. package/src/tests/Reference.test.ts +0 -16
  114. package/src/tests/Repeat.test.ts +0 -75
  115. package/src/tests/SpeedTest.test.ts +0 -31
  116. package/src/tests/TextSuggester.test.ts +0 -297
  117. package/src/tests/Visitor.test.ts +0 -331
  118. package/src/tests/cssPatterns/hex.ts +0 -5
  119. package/src/tests/cssPatterns/name.ts +0 -5
  120. package/src/tests/cssPatterns/number.ts +0 -8
  121. package/src/tests/cssPatterns/spaces.ts +0 -5
  122. package/src/tests/cssPatterns/unit.ts +0 -8
  123. package/src/tests/htmlPatterns/element.ts +0 -49
  124. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  125. package/src/tests/javascriptPatterns/json.ts +0 -67
  126. package/src/tests/javascriptPatterns/name.ts +0 -5
  127. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  128. package/src/tests/javascriptPatterns/string.ts +0 -84
  129. package/src/tests/javascriptPatterns/unit.ts +0 -8
  130. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  131. package/src/tests/naturalLanguage/filter.ts +0 -37
  132. package/src/tests/patterns/sentence.ts +0 -37
  133. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -0,0 +1,310 @@
1
+ import { Cursor } from "./Cursor";
2
+ import { And } from "./And";
3
+ import { Literal } from "./Literal";
4
+ import { Node } from "../ast/Node"
5
+
6
+ describe("And", () => {
7
+ test("No Patterns", () => {
8
+ expect(() => {
9
+ new And("empty", [])
10
+ }).toThrowError()
11
+ });
12
+
13
+ test("One Pattern Match Successful", () => {
14
+ const sequence = new And("sequence", [new Literal("a", "A")]);
15
+ const cursor = new Cursor("A");
16
+ const result = sequence.parse(cursor);
17
+ const expected = new Node("and", "sequence", 0, 0, [
18
+ new Node("literal", "a", 0, 0, [], "A")
19
+ ]);
20
+
21
+ expect(result).toEqual(expected);
22
+ expect(cursor.furthestError).toBe(null);
23
+ expect(cursor.index).toBe(0);
24
+ });
25
+
26
+ test("One Pattern Match Fails", () => {
27
+ const sequence = new And("sequence", [new Literal("a", "A")]);
28
+ const cursor = new Cursor("V");
29
+ const result = sequence.parse(cursor);
30
+
31
+ expect(result).toEqual(null);
32
+ expect(cursor.error?.index).toBe(0)
33
+ expect(cursor.index).toBe(0);
34
+ });
35
+
36
+ test("Two Pattern Match Successful", () => {
37
+ const sequence = new And("sequence", [
38
+ new Literal("a", "A"),
39
+ new Literal("b", "B")
40
+ ]);
41
+ const cursor = new Cursor("AB");
42
+ const result = sequence.parse(cursor);
43
+ const expected = new Node("and", "sequence", 0, 1, [
44
+ new Node("literal", "a", 0, 0, [], "A"),
45
+ new Node("literal", "b", 1, 1, [], "B")
46
+ ]);
47
+
48
+ expect(result).toEqual(expected);
49
+ expect(cursor.error).toBe(null)
50
+ expect(cursor.index).toBe(1);
51
+ });
52
+
53
+ test("Two Pattern Match Fails", () => {
54
+ const sequence = new And("sequence", [
55
+ new Literal("a", "A"),
56
+ new Literal("b", "B")
57
+ ]);
58
+ const cursor = new Cursor("AC");
59
+ const result = sequence.parse(cursor);
60
+
61
+ expect(result).toEqual(null);
62
+ expect(cursor.error?.index).toBe(1);
63
+ expect(cursor.index).toBe(0);
64
+ });
65
+
66
+ test("One Pattern Match Fails (Optional)", () => {
67
+ const sequence = new And("sequence", [new Literal("a", "A")], true);
68
+ const cursor = new Cursor("V");
69
+ const result = sequence.parse(cursor);
70
+
71
+ expect(result).toEqual(null);
72
+ expect(cursor.error).toBe(null)
73
+ expect(cursor.index).toBe(0);
74
+ });
75
+
76
+ test("Trailing Optional Child Patterns", () => {
77
+ const sequence = new And("sequence", [
78
+ new Literal("a", "A"),
79
+ new Literal("b", "B", true)
80
+ ]);
81
+ const cursor = new Cursor("AD");
82
+ const result = sequence.parse(cursor);
83
+ const expected = new Node("and", "sequence", 0, 0, [
84
+ new Node("literal", "a", 0, 0, [], "A")
85
+ ]);
86
+
87
+ expect(result).toEqual(expected);
88
+ expect(cursor.error).toBe(null)
89
+ expect(cursor.index).toBe(0);
90
+ });
91
+
92
+ test("Trailing Optional Child Patterns With No More Text", () => {
93
+ const sequence = new And("sequence", [
94
+ new Literal("a", "A"),
95
+ new Literal("b", "B", true)
96
+ ]);
97
+ const cursor = new Cursor("A");
98
+ const result = sequence.parse(cursor);
99
+ const expected = new Node("and", "sequence", 0, 0, [
100
+ new Node("literal", "a", 0, 0, [], "A")
101
+ ]);
102
+
103
+ expect(result).toEqual(expected);
104
+ expect(cursor.error).toBe(null)
105
+ expect(cursor.index).toBe(0);
106
+ });
107
+
108
+ test("Incomplete Parse (Optional)", () => {
109
+ const sequence = new And("sequence", [
110
+ new Literal("a", "A"),
111
+ new Literal("b", "B")
112
+ ], true);
113
+ const cursor = new Cursor("A");
114
+ const result = sequence.parse(cursor);
115
+
116
+ expect(result).toEqual(null);
117
+ expect(cursor.error).toBe(null)
118
+ expect(cursor.index).toBe(0);
119
+ });
120
+
121
+ test("Optional Child Pattern With More Patterns", () => {
122
+ const sequence = new And("sequence", [
123
+ new Literal("a", "A", true),
124
+ new Literal("b", "B"),
125
+ new Literal("c", "C")
126
+ ], true);
127
+ const cursor = new Cursor("BC");
128
+ const result = sequence.parse(cursor);
129
+ const expected = new Node("and", "sequence", 0, 1, [
130
+ new Node("literal", "b", 0, 0, [], "B"),
131
+ new Node("literal", "c", 1, 1, [], "C"),
132
+ ]);
133
+
134
+ expect(result).toEqual(expected);
135
+ expect(cursor.error).toBe(null)
136
+ expect(cursor.index).toBe(1);
137
+ });
138
+
139
+ test("Nothing Matched", () => {
140
+ const sequence = new And("sequence", [
141
+ new Literal("a", "A"),
142
+ ], true);
143
+ const cursor = new Cursor("BC");
144
+ const result = sequence.parse(cursor);
145
+
146
+ expect(result).toEqual(null);
147
+ expect(cursor.error).toBe(null)
148
+ expect(cursor.index).toBe(0);
149
+ });
150
+
151
+ test("No Matches On Optional Child Patterns", () => {
152
+ const sequence = new And("sequence", [
153
+ new Literal("a", "A", true),
154
+ new Literal("b", "B", true),
155
+ ], true);
156
+ const cursor = new Cursor("XYZ");
157
+ const result = sequence.parse(cursor);
158
+
159
+ expect(result).toEqual(null);
160
+ expect(cursor.error).toBe(null)
161
+ expect(cursor.index).toBe(0);
162
+ });
163
+
164
+ test("Properties", () => {
165
+ const a = new Literal("a", "A", true)
166
+ const sequence = new And("sequence", [
167
+ a,
168
+ ], true);
169
+
170
+ expect(sequence.type).toBe("and");
171
+ expect(sequence.name).toBe("sequence");
172
+ expect(sequence.parent).toBe(null);
173
+ expect(sequence.isOptional).toBe(true);
174
+ expect(sequence.children[0].type).toBe("literal");
175
+ expect(sequence.children[0].name).toBe("a");
176
+ });
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
+
204
+ test("Set Parent", () => {
205
+ const a = new Literal("a", "A", true)
206
+ const sequence = new And("sequence", [
207
+ a,
208
+ ], true);
209
+ const parent = new And("parent", [sequence]);
210
+
211
+ expect(parent.type).toBe("and");
212
+ expect(parent.children[0].type).toBe("and");
213
+ });
214
+
215
+ test("Get Tokens", () => {
216
+ const sequence = new And("sequence", [
217
+ new Literal("a", "A", true),
218
+ new Literal("b", "B"),
219
+ ], true);
220
+ const tokens = sequence.getTokens()
221
+ const expected = ["A", "B"];
222
+
223
+ expect(tokens).toEqual(expected);
224
+ });
225
+
226
+ test("Get Tokens After", () => {
227
+ const sequence = new And("sequence", [
228
+ new Literal("a", "A"),
229
+ new Literal("b", "B", true),
230
+ new Literal("c", "C"),
231
+ ], true);
232
+
233
+ const tokens = sequence.getTokensAfter(sequence.children[0])
234
+ const expected = ["B", "C"];
235
+
236
+ expect(tokens).toEqual(expected);
237
+ });
238
+
239
+ test("Get Tokens After With Invalid Pattern", () => {
240
+ const sequence = new And("sequence", [
241
+ new Literal("a", "A"),
242
+ new Literal("b", "B", true),
243
+ new Literal("c", "C"),
244
+ ], true);
245
+
246
+ const tokens = sequence.getTokensAfter(new Literal("not-child", "not-child"))
247
+
248
+ expect(tokens).toEqual([]);
249
+ });
250
+
251
+ test("Get Tokens After With Last Child", () => {
252
+ const sequence = new And("sequence", [
253
+ new Literal("a", "A"),
254
+ ], true);
255
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
256
+
257
+
258
+ const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
259
+
260
+ expect(tokens).toEqual(["B"]);
261
+ });
262
+
263
+ test("Get Tokens After With Last Optional Child", () => {
264
+ const sequence = new And("sequence", [
265
+ new Literal("a", "A"),
266
+ new Literal("b", "B", true),
267
+ ], true);
268
+ const parent = new And("parent", [sequence, new Literal("c", "C")]);
269
+
270
+ const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
271
+
272
+ expect(tokens).toEqual(["B", "C"]);
273
+ });
274
+
275
+ test("Get Next Tokens", () => {
276
+ const sequence = new And("sequence", [new Literal("a", "A")]);
277
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
278
+
279
+ const sequenceClone = parent.findPattern(p => p.name === "sequence");
280
+ const tokens = sequenceClone?.getNextTokens() || [];
281
+
282
+ expect(tokens[0]).toBe("B");
283
+ });
284
+
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
+ });
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")]);
295
+
296
+ const sequenceClone = parent.findPattern(p => p.name === "sequence");
297
+ const nextPatterns = sequenceClone?.getNextPatterns() || [];
298
+ const b = parent.findPattern(p => p.name === "b")
299
+
300
+ expect(nextPatterns[0]).toBe(b);
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
+
310
+ });