clarity-pattern-parser 3.0.16 → 4.0.1

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 (169) hide show
  1. package/README.md +0 -191
  2. package/dist/ast/Node.d.ts +4 -5
  3. package/dist/index.browser.js +476 -731
  4. package/dist/index.browser.js.map +1 -1
  5. package/dist/index.d.ts +10 -18
  6. package/dist/index.esm.js +469 -716
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/index.js +476 -731
  9. package/dist/index.js.map +1 -1
  10. package/dist/patterns/And.d.ts +24 -0
  11. package/dist/patterns/Literal.d.ts +19 -0
  12. package/dist/patterns/LookAhead.d.ts +8 -0
  13. package/dist/patterns/Not.d.ts +11 -0
  14. package/dist/patterns/Or.d.ts +22 -0
  15. package/dist/patterns/Pattern.d.ts +6 -7
  16. package/dist/patterns/{RecursivePattern.d.ts → Recursive.d.ts} +4 -4
  17. package/dist/patterns/Reference.d.ts +14 -0
  18. package/dist/patterns/Regex.d.ts +21 -0
  19. package/dist/patterns/Repeat.d.ts +20 -0
  20. package/package.json +1 -1
  21. package/src/CursorHistory.ts +1 -1
  22. package/src/TextSuggester.ts +1 -1
  23. package/src/ast/Node.ts +20 -17
  24. package/src/ast/Visitor.ts +14 -18
  25. package/src/index.ts +17 -33
  26. package/src/patterns/And.ts +178 -0
  27. package/src/patterns/Literal.ts +91 -0
  28. package/src/patterns/Not.ts +50 -0
  29. package/src/patterns/Or.ts +132 -0
  30. package/src/patterns/Pattern.ts +31 -47
  31. package/src/patterns/Recursive.ts +92 -0
  32. package/src/patterns/{ReferencePattern.ts → Reference.ts} +32 -28
  33. package/src/patterns/Regex.ts +123 -0
  34. package/src/patterns/Repeat.ts +155 -0
  35. package/src/tests/{AndValue.test.ts → And.test.ts} +31 -41
  36. package/src/tests/CursorHistory.test.ts +6 -6
  37. package/src/tests/Cusor.test.ts +7 -10
  38. package/src/tests/Literal.test.ts +3 -5
  39. package/src/tests/LookAhead.test.ts +2 -51
  40. package/src/tests/Not.test.ts +51 -0
  41. package/src/tests/Or.test.ts +113 -0
  42. package/src/tests/Pattern.test.ts +40 -139
  43. package/src/tests/{RecursivePattern.test.ts → Recursive.test.ts} +10 -8
  44. package/src/tests/Reference.test.ts +16 -0
  45. package/src/tests/{RepeatValue.test.ts → Repeat.test.ts} +10 -42
  46. package/src/tests/TextSuggester.test.ts +30 -28
  47. package/src/tests/{NodeVisitor.test.ts → Visitor.test.ts} +42 -21
  48. package/src/tests/cssPatterns/cssValue.ts +2 -2
  49. package/src/tests/cssPatterns/divider.ts +2 -2
  50. package/src/tests/cssPatterns/hex.ts +2 -2
  51. package/src/tests/cssPatterns/method.ts +7 -9
  52. package/src/tests/cssPatterns/name.ts +2 -2
  53. package/src/tests/cssPatterns/number.ts +2 -2
  54. package/src/tests/cssPatterns/optionalSpaces.ts +1 -2
  55. package/src/tests/cssPatterns/spaces.ts +2 -2
  56. package/src/tests/cssPatterns/unit.ts +3 -3
  57. package/src/tests/cssPatterns/value.ts +2 -2
  58. package/src/tests/cssPatterns/values.ts +2 -2
  59. package/src/tests/htmlPatterns/element.ts +18 -33
  60. package/src/tests/javascriptPatterns/boolean.ts +2 -3
  61. package/src/tests/javascriptPatterns/json.ts +14 -26
  62. package/src/tests/javascriptPatterns/name.ts +3 -20
  63. package/src/tests/javascriptPatterns/number.ts +2 -2
  64. package/src/tests/javascriptPatterns/objectLiteral.ts +9 -16
  65. package/src/tests/javascriptPatterns/string.ts +26 -24
  66. package/src/tests/javascriptPatterns/unit.ts +3 -6
  67. package/src/tests/javascriptPatterns/whitespace.ts +8 -12
  68. package/src/tests/naturalLanguage/filter.ts +16 -33
  69. package/src/tests/patterns/sentence.ts +8 -8
  70. package/dist/Cursor.js +0 -105
  71. package/dist/Cursor.js.map +0 -1
  72. package/dist/CursorHistory.js +0 -104
  73. package/dist/CursorHistory.js.map +0 -1
  74. package/dist/Permutor.d.ts +0 -13
  75. package/dist/Permutor.js +0 -52
  76. package/dist/Permutor.js.map +0 -1
  77. package/dist/TextSuggester.js +0 -244
  78. package/dist/TextSuggester.js.map +0 -1
  79. package/dist/ast/CompositeNode.d.ts +0 -6
  80. package/dist/ast/CompositeNode.js +0 -17
  81. package/dist/ast/CompositeNode.js.map +0 -1
  82. package/dist/ast/Node.js +0 -16
  83. package/dist/ast/Node.js.map +0 -1
  84. package/dist/ast/NodeVisitor.d.ts +0 -31
  85. package/dist/ast/ValueNode.d.ts +0 -6
  86. package/dist/ast/ValueNode.js +0 -14
  87. package/dist/ast/ValueNode.js.map +0 -1
  88. package/dist/ast/Visitor.js +0 -209
  89. package/dist/ast/Visitor.js.map +0 -1
  90. package/dist/patterns/ParseError.js +0 -9
  91. package/dist/patterns/ParseError.js.map +0 -1
  92. package/dist/patterns/Pattern.js +0 -127
  93. package/dist/patterns/Pattern.js.map +0 -1
  94. package/dist/patterns/RecursivePattern.js +0 -65
  95. package/dist/patterns/RecursivePattern.js.map +0 -1
  96. package/dist/patterns/composite/AndComposite.d.ts +0 -22
  97. package/dist/patterns/composite/AndComposite.js +0 -117
  98. package/dist/patterns/composite/AndComposite.js.map +0 -1
  99. package/dist/patterns/composite/CompositePattern.d.ts +0 -4
  100. package/dist/patterns/composite/CompositePattern.js +0 -7
  101. package/dist/patterns/composite/CompositePattern.js.map +0 -1
  102. package/dist/patterns/composite/OptionalComposite.d.ts +0 -10
  103. package/dist/patterns/composite/OptionalComposite.js +0 -29
  104. package/dist/patterns/composite/OptionalComposite.js.map +0 -1
  105. package/dist/patterns/composite/OrComposite.d.ts +0 -16
  106. package/dist/patterns/composite/OrComposite.js +0 -69
  107. package/dist/patterns/composite/OrComposite.js.map +0 -1
  108. package/dist/patterns/composite/RepeatComposite.d.ts +0 -21
  109. package/dist/patterns/composite/RepeatComposite.js +0 -88
  110. package/dist/patterns/composite/RepeatComposite.js.map +0 -1
  111. package/dist/patterns/value/AndValue.d.ts +0 -21
  112. package/dist/patterns/value/AndValue.js +0 -118
  113. package/dist/patterns/value/AndValue.js.map +0 -1
  114. package/dist/patterns/value/AnyOfThese.d.ts +0 -18
  115. package/dist/patterns/value/AnyOfThese.js +0 -59
  116. package/dist/patterns/value/AnyOfThese.js.map +0 -1
  117. package/dist/patterns/value/Literal.d.ts +0 -20
  118. package/dist/patterns/value/Literal.js +0 -63
  119. package/dist/patterns/value/Literal.js.map +0 -1
  120. package/dist/patterns/value/NotValue.d.ts +0 -17
  121. package/dist/patterns/value/NotValue.js +0 -70
  122. package/dist/patterns/value/NotValue.js.map +0 -1
  123. package/dist/patterns/value/OptionalValue.d.ts +0 -9
  124. package/dist/patterns/value/OptionalValue.js +0 -32
  125. package/dist/patterns/value/OptionalValue.js.map +0 -1
  126. package/dist/patterns/value/OrValue.d.ts +0 -19
  127. package/dist/patterns/value/OrValue.js +0 -73
  128. package/dist/patterns/value/OrValue.js.map +0 -1
  129. package/dist/patterns/value/RegexValue.d.ts +0 -19
  130. package/dist/patterns/value/RegexValue.js +0 -69
  131. package/dist/patterns/value/RegexValue.js.map +0 -1
  132. package/dist/patterns/value/RepeatValue.d.ts +0 -19
  133. package/dist/patterns/value/RepeatValue.js +0 -89
  134. package/dist/patterns/value/RepeatValue.js.map +0 -1
  135. package/dist/patterns/value/ValuePattern.d.ts +0 -5
  136. package/dist/patterns/value/ValuePattern.js +0 -7
  137. package/dist/patterns/value/ValuePattern.js.map +0 -1
  138. package/src/Permutor.ts +0 -64
  139. package/src/ast/CompositeNode.ts +0 -26
  140. package/src/ast/ValueNode.ts +0 -28
  141. package/src/patterns/RecursivePattern.ts +0 -86
  142. package/src/patterns/composite/AndComposite.ts +0 -159
  143. package/src/patterns/composite/CompositePattern.ts +0 -7
  144. package/src/patterns/composite/OptionalComposite.ts +0 -37
  145. package/src/patterns/composite/OrComposite.ts +0 -96
  146. package/src/patterns/composite/RepeatComposite.ts +0 -130
  147. package/src/patterns/value/AndValue.ts +0 -152
  148. package/src/patterns/value/AnyOfThese.ts +0 -81
  149. package/src/patterns/value/Literal.ts +0 -92
  150. package/src/patterns/value/NotValue.ts +0 -95
  151. package/src/patterns/value/OptionalValue.ts +0 -39
  152. package/src/patterns/value/OrValue.ts +0 -103
  153. package/src/patterns/value/RegexValue.ts +0 -103
  154. package/src/patterns/value/RepeatValue.ts +0 -131
  155. package/src/patterns/value/ValuePattern.ts +0 -8
  156. package/src/tests/AndComposite.test.ts +0 -102
  157. package/src/tests/AnyOfThese.test.ts +0 -74
  158. package/src/tests/CompositeNode.test.ts +0 -33
  159. package/src/tests/NotValue.test.ts +0 -76
  160. package/src/tests/OptionalValue.test.ts +0 -50
  161. package/src/tests/OrComposite.test.ts +0 -75
  162. package/src/tests/OrValue.test.ts +0 -171
  163. package/src/tests/Permutor.test.ts +0 -30
  164. package/src/tests/ReferencePattern.test.ts +0 -24
  165. package/src/tests/RegexValue.test.ts +0 -22
  166. package/src/tests/RepeatComposite.test.ts +0 -58
  167. package/src/tests/ValueNode.test.ts +0 -24
  168. package/src/tests/javascriptPatterns/varStatement.ts +0 -0
  169. package/src/tests/readmeDemo.test.ts +0 -124
@@ -1,171 +0,0 @@
1
- /** @jest-environment node */
2
- import OrValue from "../patterns/value/OrValue";
3
- import AnyOfThese from "../patterns/value/AnyOfThese";
4
- import Literal from "../patterns/value/Literal";
5
- import Cursor from "../Cursor";
6
-
7
- describe("OrValue", () => {
8
- test("OrValue: Empty constructor.", () => {
9
- expect(() => {
10
- new (OrValue as any)();
11
- }).toThrow();
12
- });
13
-
14
- test("OrValue: Undefined parser.", () => {
15
- expect(() => {
16
- new (OrValue as any)("name");
17
- }).toThrow();
18
- });
19
-
20
- test("OrValue: Null patterns.", () => {
21
- expect(() => {
22
- new (OrValue as any)("name", null);
23
- }).toThrow();
24
- });
25
-
26
- test("OrValue: Empty array parser.", () => {
27
- expect(() => {
28
- new (OrValue as any)("name", []);
29
- }).toThrow();
30
- });
31
-
32
- test("OrValue: One parser.", () => {
33
- expect(() => {
34
- new (OrValue as any)("name", [new Literal("some-value", "")]);
35
- }).toThrow();
36
- });
37
-
38
- test("OrValue: Name and patterns.", () => {
39
- const letter = new AnyOfThese(
40
- "letter",
41
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
42
- );
43
- const number = new AnyOfThese("number", "0987654321");
44
- const alphaNumeric = new (OrValue as any)("alpha-numeric", [
45
- letter,
46
- number,
47
- ]);
48
-
49
- const letterCursor = new Cursor("a");
50
- const numberCursor = new Cursor("1");
51
-
52
- const letterNode = alphaNumeric.parse(letterCursor);
53
- const numberNode = alphaNumeric.parse(numberCursor);
54
-
55
- expect(letterNode.name).toBe("alpha-numeric");
56
- expect(letterNode.value).toBe("a");
57
-
58
- expect(numberNode.name).toBe("alpha-numeric");
59
- expect(numberNode.value).toBe("1");
60
- });
61
-
62
- test("OrValue: Optional Pattern as one of the patterns.", () => {
63
- const letter = new AnyOfThese(
64
- "letter",
65
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
66
- );
67
- const number = new AnyOfThese("number", "0987654321");
68
- const alphaNumeric = new (OrValue as any)("alpha-numeric", [
69
- letter,
70
- number,
71
- ]);
72
-
73
- const letterCursor = new Cursor("a");
74
- const numberCursor = new Cursor("1");
75
-
76
- const letterNode = alphaNumeric.parse(letterCursor);
77
- const numberNode = alphaNumeric.parse(numberCursor);
78
-
79
- expect(letterNode.name).toBe("alpha-numeric");
80
- expect(letterNode.value).toBe("a");
81
-
82
- expect(numberNode.name).toBe("alpha-numeric");
83
- expect(numberNode.value).toBe("1");
84
- });
85
-
86
- test("OrValue: Fail.", () => {
87
- const letter = new AnyOfThese("some-letter", "abc");
88
- const number = new AnyOfThese("some-number", "123");
89
- const alphaNumeric = new (OrValue as any)("some-alpha-numeric", [
90
- letter,
91
- number,
92
- ]);
93
-
94
- const letterCursor = new Cursor("d");
95
- const numberCursor = new Cursor("4");
96
-
97
- const letterNode = alphaNumeric.parse(letterCursor);
98
- const numberNode = alphaNumeric.parse(numberCursor);
99
-
100
- expect(letterCursor.getIndex()).toBe(0);
101
- expect(letterCursor.hasUnresolvedError()).toBe(true);
102
-
103
- expect(numberCursor.getIndex()).toBe(0);
104
- expect(numberCursor.hasUnresolvedError()).toBe(true);
105
- });
106
-
107
- test("OrValue: Clone.", () => {
108
- const letter = new AnyOfThese("some-letter", "abc");
109
- const number = new AnyOfThese("some-number", "123");
110
- const alphaNumeric = new (OrValue as any)("some-alpha-numeric", [
111
- letter,
112
- number,
113
- ]);
114
-
115
- const clone = alphaNumeric.clone();
116
-
117
- expect(alphaNumeric.children.length).toBe(clone.children.length);
118
- expect(alphaNumeric.name).toBe(clone.name);
119
- });
120
-
121
- test("OrValue: Invalid patterns.", () => {
122
- expect(() => {
123
- new (OrValue as any)("some-alpha-numeric", [{}, null]);
124
- });
125
- });
126
-
127
- test("OrValue: Not enough patterns.", () => {
128
- expect(() => {
129
- new (OrValue as any)("some-alpha-numeric", [{}]);
130
- });
131
- });
132
-
133
- test("OrValue: Bad name.", () => {
134
- expect(() => {
135
- new (OrValue as any)({}, [new Literal("a", "a"), new Literal("a", "a")]);
136
- });
137
- });
138
-
139
- test("OrValue: Bad cursor.", () => {
140
- expect(() => {
141
- new (OrValue as any)("A", [
142
- new Literal("a", "a"),
143
- new Literal("a", "a"),
144
- ]).parse();
145
- });
146
- });
147
-
148
- test("OrValue: Furthest Parse Error.", () => {
149
- const longer = new Literal("longer", "Longer");
150
- const bang = new Literal("bang", "Bang");
151
- const orValue = new (OrValue as any)("test", [longer, bang]);
152
- const cursor = new Cursor("Longed");
153
-
154
- orValue.parse(cursor);
155
-
156
- expect(cursor.getIndex()).toBe(0);
157
- expect(cursor.hasUnresolvedError()).toBe(true);
158
- });
159
-
160
- test("OrValue: Last pattern matches.", () => {
161
- const longer = new Literal("longer", "Longer");
162
- const bang = new Literal("bang", "Bang");
163
- const orValue = new (OrValue as any)("test", [longer, bang]);
164
- const cursor = new Cursor("Bang");
165
-
166
- const node = orValue.parse(cursor);
167
-
168
- expect(node.name).toBe("test");
169
- expect(node.value).toBe("Bang");
170
- });
171
- });
@@ -1,30 +0,0 @@
1
- /** @jest-environment node */
2
- import Permutor from "../Permutor";
3
-
4
- describe("Permutor", () => {
5
- test("Permutor: simple.", () => {
6
- const permutor = new Permutor();
7
- const array = [
8
- [0, 1],
9
- [0, 1],
10
- [0, 1],
11
- ];
12
-
13
- const result = permutor.permute(array);
14
- expect(result.join(",")).toBe("000,001,010,011,100,101,110,111");
15
- });
16
-
17
- test("Permutor: larger.", () => {
18
- const permutor = new Permutor();
19
- const array = [
20
- [0, 1, 2],
21
- [0, 1],
22
- [0, 1, 2, 3],
23
- ];
24
-
25
- const result = permutor.permute(array);
26
- expect(result.join(",")).toBe(
27
- "000,001,002,003,010,011,012,013,100,101,102,103,110,111,112,113,200,201,202,203,210,211,212,213"
28
- );
29
- });
30
- });
@@ -1,24 +0,0 @@
1
- import Cursor from "../Cursor";
2
- import ReferencePattern from "../patterns/ReferencePattern";
3
- import AndValue from "../patterns/value/AndValue";
4
- import Literal from "../patterns/value/Literal";
5
- import OrValue from "../patterns/value/OrValue";
6
-
7
- describe("ReferencePattern", () => {
8
- test("Reference to node in different branch.", () => {
9
- const a = new Literal("a", "a");
10
- const b = new Literal("b", "b");
11
- const c = new Literal("c", "c");
12
- const a_b_c = new AndValue("a-and-b-and-c", [
13
- a,
14
- b,
15
- new ReferencePattern("c"),
16
- ]);
17
- const b_c = new AndValue("b-and-c", [b, c]);
18
- const main = new OrValue("main", [a_b_c, b_c]);
19
-
20
- const result = main.parse(new Cursor("abc"));
21
-
22
- expect(result).not.toBeNull();
23
- });
24
- });
@@ -1,22 +0,0 @@
1
- /** @jest-environment node */
2
- import { RegexValue } from "../index";
3
-
4
- test("RegexValue: exec.", () => {
5
- const notA = new RegexValue("not-a", "[^a]+");
6
-
7
- const result = notA.exec("John");
8
- const result2 = notA.exec("a");
9
-
10
- const expectedValue = {
11
- children: [],
12
- value: "John",
13
- type: "regex-value",
14
- name: "not-a",
15
- startIndex: 0,
16
- endIndex: 3,
17
- isComposite: false,
18
- };
19
-
20
- expect(JSON.stringify(result)).toBe(JSON.stringify(expectedValue));
21
- expect(result2).toBe(null);
22
- });
@@ -1,58 +0,0 @@
1
- /** @jest-environment node */
2
- import RepeatComposite from "../patterns/composite/RepeatComposite";
3
- import AndComposite from "../patterns/composite/AndComposite";
4
- import OptionalComposite from "../patterns/composite/OptionalComposite";
5
- import Literal from "../patterns/value/Literal";
6
- import Cursor from "../Cursor";
7
- import OrComposite from "../patterns/composite/OrComposite";
8
-
9
- describe("RepeatComposite", () => {
10
- test("Cannot use optional patterns.", () => {
11
- const firstName = new Literal("John", "John");
12
- const lastName = new Literal("Doe", "Doe");
13
- const andComposite = new AndComposite("full-name", [firstName, lastName]);
14
-
15
- expect(() => {
16
- new RepeatComposite("full-names", new OptionalComposite(andComposite));
17
- }).toThrow();
18
- });
19
-
20
- test("clone with custom name.", () => {
21
- const firstName = new Literal("John", "John");
22
- const lastName = new Literal("Doe", "Doe");
23
- const andComposite = new AndComposite("full-name", [firstName, lastName]);
24
- const fullnames = new RepeatComposite("full-names", andComposite);
25
- const clone = fullnames.clone("full-names-2");
26
-
27
- expect(clone.name).toBe("full-names-2");
28
- });
29
-
30
- test("parse.", () => {
31
- const a = new Literal("a", "A");
32
- const b = new Literal("b", "B");
33
- const space = new Literal("space", " ");
34
- const or = new OrComposite("names", [a, b]);
35
-
36
- const repeat = new RepeatComposite("repeat", or, space);
37
- const result = repeat.parse(new Cursor("A B"));
38
-
39
- expect(result?.children[0].value).toBe("A");
40
- expect(result?.children[0].name).toBe("a");
41
- expect(result?.children[1].value).toBe(" ");
42
- expect(result?.children[1].name).toBe("space");
43
- expect(result?.children[2].value).toBe("B");
44
- expect(result?.children[2].name).toBe("b");
45
- });
46
-
47
- test("Cannot end on a divider.", () => {
48
- const a = new Literal("a", "A");
49
- const b = new Literal("b", "B");
50
- const space = new Literal("space", " ");
51
- const or = new OrComposite("names", [a, b]);
52
-
53
- const repeat = new RepeatComposite("repeat", or, space);
54
- const result = repeat.parse(new Cursor("A B "));
55
-
56
- expect(result).toBe(null);
57
- });
58
- });
@@ -1,24 +0,0 @@
1
- /** @jest-environment node */
2
- import ValueNode from "../ast/ValueNode";
3
- import assert from "assert";
4
-
5
- describe("ValueNode", () => {
6
- test("clone.", () => {
7
- const node = new ValueNode("type", "name", "value", 0, 1);
8
- const clone = node.clone();
9
-
10
- assert.equal(node.name, clone.name);
11
- assert.equal(node.value, clone.value);
12
- assert.equal(node.startIndex, clone.startIndex);
13
- assert.equal(node.endIndex, clone.endIndex);
14
- });
15
-
16
- test("Without indexes.", () => {
17
- const node = new ValueNode("type", "name", "value");
18
-
19
- assert.equal(node.name, "name");
20
- assert.equal(node.value, "value");
21
- assert.equal(node.startIndex, 0);
22
- assert.equal(node.endIndex, 0);
23
- });
24
- });
File without changes
@@ -1,124 +0,0 @@
1
- /** @jest-environment node */
2
- import {
3
- Cursor,
4
- Literal,
5
- AndValue,
6
- OrValue,
7
- RepeatValue,
8
- NotValue,
9
- AndComposite,
10
- } from "../index";
11
-
12
- describe("Readme.md", () => {
13
- test("value", () => {
14
- const forwardSlashes = new Literal("forward-slashes", "//");
15
- const newLine = new Literal("new-line", "\n");
16
- const returnCarriage = new Literal("return-carriage", "\r");
17
- const windowsNewLine = new AndValue("windows-new-line", [
18
- returnCarriage,
19
- newLine,
20
- ]);
21
- const lineEnd = new OrValue("line-end", [newLine, windowsNewLine]);
22
- const character = new NotValue("character", lineEnd);
23
- const comment = new RepeatValue("comment", character);
24
-
25
- const lineEndingComment = new AndValue("line-ending-comment", [
26
- forwardSlashes,
27
- comment,
28
- lineEnd,
29
- ]);
30
-
31
- const string = "// This is a comment\n";
32
- const cursor = new Cursor(string);
33
- const node = lineEndingComment.parse(cursor);
34
-
35
- expect(node?.name).toBe("line-ending-comment"); // --> true
36
- expect(node?.value).toBe(string); // --> true
37
-
38
- const expectedValue = {
39
- children: [],
40
- value: "// This is a comment\n",
41
- type: "and-value",
42
- name: "line-ending-comment",
43
- startIndex: 0,
44
- endIndex: 20,
45
- isComposite: false,
46
- };
47
-
48
- expect(JSON.stringify(node)).toBe(JSON.stringify(expectedValue)); // --> true
49
- });
50
-
51
- test("composite", () => {
52
- const forwardSlashes = new Literal("forward-slashes", "//");
53
- const newLine = new Literal("new-line", "\n");
54
- const returnCarriage = new Literal("return-carriage", "\r");
55
- const windowsNewLine = new AndValue("windows-new-line", [
56
- returnCarriage,
57
- newLine,
58
- ]);
59
- const lineEnd = new OrValue("line-end", [newLine, windowsNewLine]);
60
- const character = new NotValue("character", lineEnd);
61
- const comment = new RepeatValue("comment", character);
62
-
63
- const lineEndingComment = new AndComposite("line-ending-comment", [
64
- forwardSlashes,
65
- comment,
66
- lineEnd,
67
- ]);
68
-
69
- const string = "// This is a comment\n";
70
- const cursor = new Cursor(string);
71
- const node = lineEndingComment.parse(cursor);
72
-
73
- expect(node?.name).toBe("line-ending-comment");
74
-
75
- expect(node?.children[0].name).toBe("forward-slashes");
76
- expect(node?.children[0].value).toBe("//");
77
-
78
- expect(node?.children[1].name).toBe("comment");
79
- expect(node?.children[1].value).toBe(" This is a comment");
80
-
81
- expect(node?.children[2].name).toBe("line-end");
82
- expect(node?.children[2].value).toBe("\n");
83
-
84
- const expectedValue = {
85
- children: [
86
- {
87
- children: [],
88
- value: "//",
89
- type: "literal",
90
- name: "forward-slashes",
91
- startIndex: 0,
92
- endIndex: 1,
93
- isComposite: false,
94
- },
95
- {
96
- children: [],
97
- value: " This is a comment",
98
- type: "repeat-value",
99
- name: "comment",
100
- startIndex: 2,
101
- endIndex: 19,
102
- isComposite: false,
103
- },
104
- {
105
- children: [],
106
- value: "\n",
107
- type: "or-value",
108
- name: "line-end",
109
- startIndex: 20,
110
- endIndex: 20,
111
- isComposite: false,
112
- },
113
- ],
114
- value: "",
115
- type: "and-composite",
116
- name: "line-ending-comment",
117
- startIndex: 0,
118
- endIndex: 20,
119
- isComposite: true,
120
- };
121
-
122
- expect(JSON.stringify(node)).toBe(JSON.stringify(expectedValue)); // --> true
123
- });
124
- });