clarity-pattern-parser 4.0.3 → 5.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 (132) hide show
  1. package/README.md +176 -1
  2. package/TODO.md +22 -2
  3. package/dist/ast/Node.d.ts +43 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1248 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +12 -17
  8. package/dist/index.esm.js +1218 -1460
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1217 -1464
  11. package/dist/index.js.map +1 -1
  12. package/dist/patterns/And.d.ts +37 -24
  13. package/dist/patterns/Cursor.d.ts +35 -0
  14. package/dist/patterns/CursorHistory.d.ts +30 -0
  15. package/dist/patterns/Literal.d.ts +36 -19
  16. package/dist/patterns/Not.d.ts +26 -11
  17. package/dist/patterns/Or.d.ts +31 -22
  18. package/dist/patterns/ParseError.d.ts +6 -8
  19. package/dist/patterns/ParseResult.d.ts +6 -0
  20. package/dist/patterns/Pattern.d.ts +17 -26
  21. package/dist/patterns/Reference.d.ts +31 -12
  22. package/dist/patterns/Regex.d.ts +42 -21
  23. package/dist/patterns/Repeat.d.ts +38 -20
  24. package/dist/patterns/clonePatterns.d.ts +2 -0
  25. package/dist/patterns/filterOutNull.d.ts +2 -0
  26. package/dist/patterns/findPattern.d.ts +2 -0
  27. package/dist/patterns/getNextPattern.d.ts +2 -0
  28. package/jest.config.js +2 -1
  29. package/package.json +4 -5
  30. package/rollup.config.js +1 -1
  31. package/src/ast/Node.test.ts +254 -0
  32. package/src/ast/Node.ts +171 -23
  33. package/src/index.ts +11 -24
  34. package/src/intellisense/AutoComplete.test.ts +72 -0
  35. package/src/intellisense/AutoComplete.ts +146 -0
  36. package/src/intellisense/Suggestion.ts +13 -0
  37. package/src/intellisense/SuggestionOption.ts +4 -0
  38. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  39. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  40. package/src/intellisense/css/hex.ts +6 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  42. package/src/intellisense/css/name.ts +5 -0
  43. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  44. package/src/intellisense/css/spaces.ts +6 -0
  45. package/src/intellisense/css/unit.ts +10 -0
  46. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  47. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  48. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  49. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  50. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  51. package/src/intellisense/javascript/escapedCharacter.ts +50 -0
  52. package/src/intellisense/javascript/exponent.ts +26 -0
  53. package/src/intellisense/javascript/expression.ts +87 -0
  54. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  55. package/src/intellisense/javascript/fraction.ts +13 -0
  56. package/src/intellisense/javascript/infixOperator.ts +36 -0
  57. package/src/intellisense/javascript/integer.ts +7 -0
  58. package/src/intellisense/javascript/invocation.ts +28 -0
  59. package/src/intellisense/javascript/literal.ts +14 -0
  60. package/src/intellisense/javascript/name.ts +3 -0
  61. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  62. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  63. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  64. package/src/intellisense/javascript/parameters.ts +20 -0
  65. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  66. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  67. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  68. package/src/patterns/And.test.ts +299 -0
  69. package/src/patterns/And.ts +222 -119
  70. package/src/patterns/Cursor.test.ts +93 -0
  71. package/src/patterns/Cursor.ts +130 -0
  72. package/src/patterns/CursorHistory.test.ts +54 -0
  73. package/src/patterns/CursorHistory.ts +95 -0
  74. package/src/patterns/Literal.test.ts +134 -0
  75. package/src/patterns/Literal.ts +151 -61
  76. package/src/patterns/Not.test.ts +88 -0
  77. package/src/patterns/Not.ts +74 -33
  78. package/src/patterns/Or.test.ts +105 -0
  79. package/src/patterns/Or.ts +106 -98
  80. package/src/patterns/ParseError.ts +3 -7
  81. package/src/patterns/ParseResult.ts +7 -0
  82. package/src/patterns/Pattern.ts +18 -150
  83. package/src/patterns/Reference.test.ts +104 -0
  84. package/src/patterns/Reference.ts +94 -94
  85. package/src/patterns/Regex.test.ts +101 -0
  86. package/src/patterns/Regex.ts +129 -60
  87. package/src/patterns/Repeat.test.ts +196 -0
  88. package/src/patterns/Repeat.ts +208 -104
  89. package/src/patterns/clonePatterns.ts +5 -0
  90. package/src/patterns/filterOutNull.ts +13 -0
  91. package/src/patterns/findPattern.ts +25 -0
  92. package/src/patterns/getNextPattern.test.ts +39 -0
  93. package/src/patterns/getNextPattern.ts +18 -0
  94. package/src/Cursor.ts +0 -141
  95. package/src/CursorHistory.ts +0 -146
  96. package/src/TextSuggester.ts +0 -317
  97. package/src/ast/Visitor.ts +0 -271
  98. package/src/patterns/LookAhead.ts +0 -32
  99. package/src/patterns/Recursive.ts +0 -92
  100. package/src/tests/And.test.ts +0 -180
  101. package/src/tests/ComplexExamples.test.ts +0 -86
  102. package/src/tests/CssPatterns.test.ts +0 -90
  103. package/src/tests/CursorHistory.test.ts +0 -107
  104. package/src/tests/Cusor.test.ts +0 -174
  105. package/src/tests/HtmlPatterns.test.ts +0 -34
  106. package/src/tests/Literal.test.ts +0 -79
  107. package/src/tests/LookAhead.test.ts +0 -44
  108. package/src/tests/Not.test.ts +0 -51
  109. package/src/tests/Or.test.ts +0 -113
  110. package/src/tests/Pattern.test.ts +0 -290
  111. package/src/tests/Recursive.test.ts +0 -64
  112. package/src/tests/Reference.test.ts +0 -16
  113. package/src/tests/Repeat.test.ts +0 -75
  114. package/src/tests/SpeedTest.test.ts +0 -31
  115. package/src/tests/TextSuggester.test.ts +0 -297
  116. package/src/tests/Visitor.test.ts +0 -331
  117. package/src/tests/cssPatterns/hex.ts +0 -5
  118. package/src/tests/cssPatterns/name.ts +0 -5
  119. package/src/tests/cssPatterns/number.ts +0 -8
  120. package/src/tests/cssPatterns/spaces.ts +0 -5
  121. package/src/tests/cssPatterns/unit.ts +0 -8
  122. package/src/tests/htmlPatterns/element.ts +0 -49
  123. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  124. package/src/tests/javascriptPatterns/json.ts +0 -67
  125. package/src/tests/javascriptPatterns/name.ts +0 -5
  126. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  127. package/src/tests/javascriptPatterns/string.ts +0 -84
  128. package/src/tests/javascriptPatterns/unit.ts +0 -8
  129. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  130. package/src/tests/naturalLanguage/filter.ts +0 -37
  131. package/src/tests/patterns/sentence.ts +0 -37
  132. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -0,0 +1,28 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Regex } from "../../patterns/Regex";
5
+ import { Repeat } from "../../patterns/Repeat";
6
+ import { escapedCharacter } from "./escapedCharacter";
7
+
8
+ const doubleQuoteStringLiteral = new And("double-string-literal", [
9
+ new Literal("double-quote", "\""),
10
+ new Repeat("characters", new Or("characters", [
11
+ new Regex("normal-characters", "[^\\\"]+"),
12
+ escapedCharacter
13
+ ])),
14
+ new Literal("double-quote", "\""),
15
+ ]);
16
+
17
+ const singleQuoteStringLiteral = new And("single-string-literal", [
18
+ new Literal("single-quote", "'"),
19
+ new Repeat("characters", new Or("characters", [
20
+ new Regex("normal-characters", "[^\\']+"),
21
+ escapedCharacter
22
+ ])),
23
+ new Literal("single-quote", "'"),
24
+ ]);
25
+
26
+ const stringLiteral = new Or("string-literal", [doubleQuoteStringLiteral, singleQuoteStringLiteral]);
27
+
28
+ export { stringLiteral }
@@ -0,0 +1,299 @@
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
+ ], true);
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
+ ], true);
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", () => {
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("Set Parent", () => {
179
+ const a = new Literal("a", "A", true)
180
+ const sequence = new And("sequence", [
181
+ a,
182
+ ], true);
183
+ const parent = new And("parent", [sequence]);
184
+
185
+ expect(parent.type).toBe("and");
186
+ expect(parent.children[0].type).toBe("and");
187
+ });
188
+
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
+ test("Get Tokens", () => {
217
+ const sequence = new And("sequence", [
218
+ new Literal("a", "A", true),
219
+ new Literal("b", "B"),
220
+ ], true);
221
+ const tokens = sequence.getTokens()
222
+ const expected = ["A", "B"];
223
+
224
+ expect(tokens).toEqual(expected);
225
+ });
226
+
227
+ test("Get Next Tokens", () => {
228
+ const sequence = new And("sequence", [
229
+ new Literal("a", "A"),
230
+ new Literal("b", "B", true),
231
+ new Literal("c", "C"),
232
+ ], true);
233
+
234
+ const tokens = sequence.getNextTokens(sequence.children[0])
235
+ const expected = ["B", "C"];
236
+
237
+ expect(tokens).toEqual(expected);
238
+ });
239
+
240
+ test("Get Next Tokens With Invalid Pattern", () => {
241
+ const sequence = new And("sequence", [
242
+ new Literal("a", "A"),
243
+ new Literal("b", "B", true),
244
+ new Literal("c", "C"),
245
+ ], true);
246
+
247
+ const tokens = sequence.getNextTokens(new Literal("not-child", "not-child"))
248
+
249
+ expect(tokens).toEqual([]);
250
+ });
251
+
252
+ test("Get Next Tokens With Last Child", () => {
253
+ const sequence = new And("sequence", [
254
+ new Literal("a", "A"),
255
+ ], true);
256
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
257
+
258
+
259
+ const tokens = parent.children[0].getNextTokens(parent.children[0].children[0])
260
+
261
+ expect(tokens).toEqual(["B"]);
262
+ });
263
+
264
+ test("Get Next Tokens With Last Optional Child", () => {
265
+ const sequence = new And("sequence", [
266
+ new Literal("a", "A"),
267
+ new Literal("b", "B", true),
268
+ ], true);
269
+ const parent = new And("parent", [sequence, new Literal("c", "C")]);
270
+
271
+
272
+ const tokens = parent.children[0].getNextTokens(parent.children[0].children[0])
273
+
274
+ expect(tokens).toEqual(["B", "C"]);
275
+ });
276
+
277
+ test("Parse Text", () => {
278
+ const sequence = new And("sequence", [new Literal("a", "A")]);
279
+ sequence.enableAstReduction();
280
+
281
+ const { ast: result } = sequence.parseText("A");
282
+ const expected = new Node("and", "sequence", 0, 0, [], "A");
283
+
284
+ expect(result).toEqual(expected)
285
+ });
286
+
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")]);
293
+
294
+
295
+ const nextPattern = parent.children[0].getNextPattern()
296
+
297
+ expect(nextPattern?.name).toBe("c");
298
+ });
299
+ });