@markuplint/parser-utils 3.13.0 → 4.0.0-alpha.10

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 (57) hide show
  1. package/LICENSE +1 -1
  2. package/lib/attr-tokenizer.d.ts +18 -0
  3. package/lib/attr-tokenizer.js +169 -0
  4. package/lib/const.d.ts +9 -2
  5. package/lib/const.js +12 -9
  6. package/lib/debugger.d.ts +3 -2
  7. package/lib/debugger.js +38 -39
  8. package/lib/decision.js +6 -11
  9. package/lib/detect-element-type.d.ts +1 -5
  10. package/lib/detect-element-type.js +4 -8
  11. package/lib/enums.d.ts +16 -0
  12. package/lib/enums.js +18 -0
  13. package/lib/get-location.d.ts +4 -17
  14. package/lib/get-location.js +11 -31
  15. package/lib/idl-attributes.d.ts +2 -2
  16. package/lib/idl-attributes.js +5 -10
  17. package/lib/ignore-block.d.ts +4 -3
  18. package/lib/ignore-block.js +75 -131
  19. package/lib/ignore-front-matter.d.ts +4 -1
  20. package/lib/ignore-front-matter.js +15 -10
  21. package/lib/index.d.ts +7 -16
  22. package/lib/index.js +7 -19
  23. package/lib/parser-error.d.ts +19 -24
  24. package/lib/parser-error.js +8 -15
  25. package/lib/parser.d.ts +108 -0
  26. package/lib/parser.js +1076 -0
  27. package/lib/script-parser.d.ts +6 -0
  28. package/lib/script-parser.js +22 -0
  29. package/lib/sort-nodes.d.ts +2 -0
  30. package/lib/sort-nodes.js +18 -0
  31. package/lib/types.d.ts +50 -12
  32. package/lib/types.js +1 -2
  33. package/package.json +17 -8
  34. package/lib/create-token.d.ts +0 -9
  35. package/lib/create-token.js +0 -35
  36. package/lib/flatten-nodes.d.ts +0 -2
  37. package/lib/flatten-nodes.js +0 -251
  38. package/lib/get-space-before.d.ts +0 -1
  39. package/lib/get-space-before.js +0 -13
  40. package/lib/idl-attributes.test.d.ts +0 -1
  41. package/lib/idl-attributes.test.js +0 -45
  42. package/lib/parse-attr.d.ts +0 -27
  43. package/lib/parse-attr.js +0 -150
  44. package/lib/remove-deprecated-node.d.ts +0 -7
  45. package/lib/remove-deprecated-node.js +0 -43
  46. package/lib/siblings-correction.d.ts +0 -9
  47. package/lib/siblings-correction.js +0 -26
  48. package/lib/tag-splitter.d.ts +0 -7
  49. package/lib/tag-splitter.js +0 -92
  50. package/lib/walker.d.ts +0 -2
  51. package/lib/walker.js +0 -22
  52. package/test/create-token.spec.js +0 -17
  53. package/test/flatten-nodes.spec.js +0 -31
  54. package/test/get-location.spec.js +0 -38
  55. package/test/ignore-block.spec.js +0 -274
  56. package/test/ignore-front-matter.spec.js +0 -20
  57. package/test/parse-attr.spec.js +0 -68
@@ -1,274 +0,0 @@
1
- const { parse } = require('@markuplint/html-parser');
2
-
3
- const { nodeListToDebugMaps } = require('../lib/debugger');
4
- const { ignoreBlock, restoreNode } = require('../lib/ignore-block');
5
-
6
- const tags = [
7
- {
8
- type: 'ejs-tag',
9
- start: /<%/,
10
- end: /%>/,
11
- },
12
- ];
13
-
14
- describe('ignoreBlock', () => {
15
- it('basic', () => {
16
- const result = ignoreBlock('<div><%= test %></div>', tags);
17
- expect(result).toStrictEqual({
18
- source: '<div><%= test %></div>',
19
- replaced: '<div><!></div>',
20
- stack: [
21
- {
22
- type: 'ejs-tag',
23
- index: 5,
24
- startTag: '<%',
25
- taggedCode: '= test ',
26
- endTag: '%>',
27
- },
28
- ],
29
- maskChar: '',
30
- });
31
- });
32
-
33
- it('2 tags', () => {
34
- const result = ignoreBlock('<div><%= test %></div><div><%= test2 %></div>', tags);
35
- expect(result).toStrictEqual({
36
- source: '<div><%= test %></div><div><%= test2 %></div>',
37
- replaced: '<div><!></div><div><!></div>',
38
- stack: [
39
- {
40
- type: 'ejs-tag',
41
- index: 5,
42
- startTag: '<%',
43
- taggedCode: '= test ',
44
- endTag: '%>',
45
- },
46
- {
47
- type: 'ejs-tag',
48
- index: 27,
49
- startTag: '<%',
50
- taggedCode: '= test2 ',
51
- endTag: '%>',
52
- },
53
- ],
54
- maskChar: '',
55
- });
56
- });
57
-
58
- it('without closing tag', () => {
59
- const result = ignoreBlock('<div><%= test', tags);
60
- expect(result).toStrictEqual({
61
- source: '<div><%= test',
62
- replaced: '<div><!>',
63
- stack: [
64
- {
65
- type: 'ejs-tag',
66
- index: 5,
67
- startTag: '<%',
68
- taggedCode: '= test',
69
- endTag: null,
70
- },
71
- ],
72
- maskChar: '',
73
- });
74
- });
75
-
76
- it('with line break', () => {
77
- const result = ignoreBlock('<div><% if () {\n\t\n} %></div>', tags);
78
- expect(result).toStrictEqual({
79
- source: '<div><% if () {\n\t\n} %></div>',
80
- replaced: '<div><!\n\n></div>',
81
- stack: [
82
- {
83
- type: 'ejs-tag',
84
- index: 5,
85
- startTag: '<%',
86
- taggedCode: ' if () {\n\t\n} ',
87
- endTag: '%>',
88
- },
89
- ],
90
- maskChar: '',
91
- });
92
- });
93
-
94
- it('multiple tags', () => {
95
- const result = ignoreBlock('<% 1 %>2<%= 3 %>4<%_ 5 _%>6<%- 7 -%>8<%% 9 %>', [
96
- {
97
- type: 'ejs-whitespace-slurping',
98
- start: /<%_/,
99
- end: /%>/,
100
- },
101
- {
102
- type: 'ejs-output-value',
103
- start: /<%=/,
104
- end: /%>/,
105
- },
106
- {
107
- type: 'ejs-output-unescaped',
108
- start: /<%-/,
109
- end: /%>/,
110
- },
111
- {
112
- type: 'ejs-comment',
113
- start: /<%#/,
114
- end: /%>/,
115
- },
116
- {
117
- type: 'ejs-scriptlet',
118
- start: /<%(?!%)/,
119
- end: /%>/,
120
- },
121
- ]);
122
-
123
- expect(result).toStrictEqual({
124
- source: '<% 1 %>2<%= 3 %>4<%_ 5 _%>6<%- 7 -%>8<%% 9 %>',
125
- replaced: '<!>2<!>4<!>6<!>8<%% 9 %>',
126
- stack: [
127
- {
128
- type: 'ejs-scriptlet',
129
- index: 0,
130
- startTag: '<%',
131
- taggedCode: ' 1 ',
132
- endTag: '%>',
133
- },
134
- {
135
- type: 'ejs-output-value',
136
- index: 8,
137
- startTag: '<%=',
138
- taggedCode: ' 3 ',
139
- endTag: '%>',
140
- },
141
- {
142
- type: 'ejs-whitespace-slurping',
143
- index: 17,
144
- startTag: '<%_',
145
- taggedCode: ' 5 _',
146
- endTag: '%>',
147
- },
148
- {
149
- type: 'ejs-output-unescaped',
150
- index: 27,
151
- startTag: '<%-',
152
- taggedCode: ' 7 -',
153
- endTag: '%>',
154
- },
155
- ],
156
- maskChar: '',
157
- });
158
- });
159
- });
160
-
161
- describe('restoreNode', () => {
162
- it('basic', () => {
163
- const code = '<div attr="<% attr %>"><% content %></div>';
164
- const masked = ignoreBlock(code, tags);
165
- const ast = parse(masked.replaced);
166
- const restoredAst = restoreNode(ast.nodeList, masked);
167
- const nodeMap = nodeListToDebugMaps(restoredAst, true);
168
- // TODO: Remove the masks from Element.raw and Attribute.raw
169
- expect(nodeMap).toStrictEqual([
170
- '[1:1]>[1:24](0,23)div: <div␣attr="">',
171
- '[1:6]>[1:23](5,22)attr: attr=""',
172
- ' [1:5]>[1:6](4,5)bN: ␣',
173
- ' [1:6]>[1:10](5,9)name: attr',
174
- ' [1:10]>[1:10](9,9)bE: ',
175
- ' [1:10]>[1:11](9,10)equal: =',
176
- ' [1:11]>[1:11](10,10)aE: ',
177
- ' [1:11]>[1:12](10,11)sQ: "',
178
- ' [1:12]>[1:22](11,21)value: <%␣attr␣%>',
179
- ' [1:22]>[1:23](21,22)eQ: "',
180
- ' isDirective: false',
181
- ' isDynamicValue: true',
182
- '[1:24]>[1:37](23,36)#ps:ejs-tag: <%␣content␣%>',
183
- '[1:37]>[1:43](36,42)div: </div>',
184
- ]);
185
- });
186
-
187
- it('tag', () => {
188
- const code = '<title><% content %></title>';
189
- const masked = ignoreBlock(code, tags);
190
- const ast = parse(masked.replaced);
191
- const restoredAst = restoreNode(ast.nodeList, masked);
192
- const nodeMap = nodeListToDebugMaps(restoredAst);
193
- expect(nodeMap).toStrictEqual([
194
- '[1:1]>[1:8](0,7)title: <title>',
195
- '[1:8]>[1:21](7,20)#ps:ejs-tag: <%␣content␣%>',
196
- '[1:21]>[1:29](20,28)title: </title>',
197
- ]);
198
- });
199
-
200
- it('attr', () => {
201
- const code = '<div attr="<% attr %><% attr2 %>"></div>';
202
- const masked = ignoreBlock(code, tags);
203
- const ast = parse(masked.replaced);
204
- const restoredAst = restoreNode(ast.nodeList, masked);
205
- expect(restoredAst[0].attributes[0].value.raw).toBe('<% attr %><% attr2 %>');
206
- });
207
-
208
- it('attr', () => {
209
- const code = '<div attr="<% attr %> <% attr2 %>"></div>';
210
- const masked = ignoreBlock(code, tags);
211
- const ast = parse(masked.replaced);
212
- const restoredAst = restoreNode(ast.nodeList, masked);
213
- expect(restoredAst[0].attributes[0].value.raw).toBe('<% attr %> <% attr2 %>');
214
- });
215
-
216
- it('attr', () => {
217
- const code = '<div attr="<% attr %>A<% attr2 %>"></div>';
218
- const masked = ignoreBlock(code, tags);
219
- const ast = parse(masked.replaced);
220
- const restoredAst = restoreNode(ast.nodeList, masked);
221
- expect(restoredAst[0].attributes[0].value.raw).toBe('<% attr %>A<% attr2 %>');
222
- });
223
-
224
- it('before space', () => {
225
- const code = '<div attr=" <% attr %>"></div>';
226
- const masked = ignoreBlock(code, tags);
227
- const ast = parse(masked.replaced);
228
- const restoredAst = restoreNode(ast.nodeList, masked);
229
- expect(restoredAst[0].attributes[0].value.raw).toBe(' <% attr %>');
230
- });
231
-
232
- it('after space', () => {
233
- const code = '<div attr=" <% attr %> "></div>';
234
- const masked = ignoreBlock(code, tags);
235
- const ast = parse(masked.replaced);
236
- const restoredAst = restoreNode(ast.nodeList, masked);
237
- expect(restoredAst[0].attributes[0].value.raw).toBe(' <% attr %> ');
238
- });
239
-
240
- it('before char', () => {
241
- const code = '<div attr="A<% attr %>"></div>';
242
- const masked = ignoreBlock(code, tags);
243
- const ast = parse(masked.replaced);
244
- const restoredAst = restoreNode(ast.nodeList, masked);
245
- expect(restoredAst[0].attributes[0].value.raw).toBe('A<% attr %>');
246
- });
247
-
248
- it('after char', () => {
249
- const code = '<div attr="A<% attr %>B"></div>';
250
- const masked = ignoreBlock(code, tags);
251
- const ast = parse(masked.replaced);
252
- const restoredAst = restoreNode(ast.nodeList, masked);
253
- expect(restoredAst[0].attributes[0].value.raw).toBe('A<% attr %>B');
254
- });
255
-
256
- it('unexpected parsing', () => {
257
- const code = '<div attr="<% attr %> "></div>';
258
- const masked = ignoreBlock(code, tags);
259
- const ast = parse(masked.replaced);
260
- const restoredAst = restoreNode(ast.nodeList, masked);
261
- expect(restoredAst).toStrictEqual([]);
262
- });
263
- });
264
-
265
- describe('Issues', () => {
266
- test('#607', () => {
267
- const code = '<div><% %><img/></div>';
268
- const masked = ignoreBlock(code, tags);
269
- const ast = parse(masked.replaced);
270
- const restoredAst = restoreNode(ast.nodeList, masked);
271
- expect(restoredAst[2].parentNode?.uuid).toBe(restoredAst[0].uuid);
272
- expect(restoredAst[2].prevNode?.uuid).toBe(restoredAst[1].uuid);
273
- });
274
- });
@@ -1,20 +0,0 @@
1
- const { ignoreFrontMatter } = require('../lib/ignore-front-matter');
2
-
3
- describe('ignoreFrontMatter', () => {
4
- it('basic', () => {
5
- expect(ignoreFrontMatter('---')).toStrictEqual('---');
6
- expect(ignoreFrontMatter('---\np: v')).toStrictEqual('---\np: v');
7
- expect(ignoreFrontMatter('---\np: v\n---')).toStrictEqual('---\np: v\n---');
8
- expect(ignoreFrontMatter('---\np: v\n---\n')).toStrictEqual(' \n \n \n');
9
- });
10
-
11
- it('basic', () => {
12
- expect(
13
- ignoreFrontMatter(`
14
- ---
15
- prop: value
16
- ---
17
- <html></html>`),
18
- ).toStrictEqual('\n \n \n \n<html></html>');
19
- });
20
- });
@@ -1,68 +0,0 @@
1
- const { tokenize, defaultValueDelimiters } = require('../lib/parse-attr');
2
-
3
- describe('tokenize', () => {
4
- test('name', () => {
5
- expect(tokenize('a').name).toBe('a');
6
- expect(tokenize('abc').name).toBe('abc');
7
- expect(tokenize('abc:').name).toBe('abc:');
8
- expect(tokenize(':abc').name).toBe(':abc');
9
- expect(tokenize('xxx:abc').name).toBe('xxx:abc');
10
- expect(tokenize('@abc').name).toBe('@abc');
11
- });
12
-
13
- test('value', () => {
14
- expect(tokenize('a=b').value).toBe('b');
15
- expect(tokenize('abc=xyz').value).toBe('xyz');
16
- expect(tokenize('abc:="xyz"').value).toBe('xyz');
17
- });
18
-
19
- test('complex', () => {
20
- expect(tokenize(' @a:x.y\n= x + y ')).toStrictEqual({
21
- beforeName: ' ',
22
- name: '@a:x.y',
23
- afterName: '\n',
24
- equal: '=',
25
- beforeValue: '',
26
- startQuote: '',
27
- value: ' x + y ',
28
- endQuote: '',
29
- afterAttr: '',
30
- });
31
-
32
- expect(tokenize(' @a:x.y\n= " x\' + y " ')).toStrictEqual({
33
- beforeName: ' ',
34
- name: '@a:x.y',
35
- afterName: '\n',
36
- equal: '=',
37
- beforeValue: ' ',
38
- startQuote: '"',
39
- value: " x' + y ",
40
- endQuote: '"',
41
- afterAttr: ' ',
42
- });
43
- });
44
-
45
- test('jsx', () => {
46
- expect(
47
- tokenize(' className={classList.map((c) => `${c.toLowerCase()}`).join(",")} ', {
48
- valueDelimiters: [
49
- ...defaultValueDelimiters,
50
- {
51
- start: '{',
52
- end: '}',
53
- },
54
- ],
55
- }),
56
- ).toStrictEqual({
57
- beforeName: ' ',
58
- name: 'className',
59
- afterName: '',
60
- equal: '=',
61
- beforeValue: '',
62
- startQuote: '{',
63
- value: 'classList.map((c) => `${c.toLowerCase()}`).join(",")',
64
- endQuote: '}',
65
- afterAttr: ' ',
66
- });
67
- });
68
- });