@lvce-editor/shared-process 0.11.12 → 0.12.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.
- package/config/fileMap.json +1 -2
- package/extensions/builtin.language-basics-css/README.md +2 -0
- package/extensions/builtin.language-basics-css/src/tokenizeCss.js +7 -0
- package/extensions/builtin.language-basics-dotenv/extension.json +7 -1
- package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +9 -2
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +54 -2
- package/extensions/builtin.language-basics-json/extension.json +4 -1
- package/extensions/builtin.language-basics-json/src/tokenizeJson.js +27 -0
- package/extensions/builtin.language-basics-markdown/src/tokenizeMarkdown.js +25 -2
- package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +17 -15
- package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +55 -5
- package/extensions/builtin.language-basics-vue/README.md +14 -0
- package/extensions/builtin.language-basics-vue/extension.json +13 -0
- package/extensions/builtin.language-basics-vue/src/tokenizeVue.js +327 -0
- package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +2 -1
- package/extensions/builtin.theme-atom-one-dark/color-theme.json +16 -0
- package/extensions/builtin.theme-ayu/color-theme.json +10 -1
- package/extensions/builtin.theme-cobalt2/color-theme.json +16 -0
- package/extensions/builtin.theme-gruvbox/color-theme.json +16 -0
- package/extensions/builtin.theme-noctis-uva/color-theme.json +20 -0
- package/extensions/builtin.theme-palenight/color-theme.json +8 -0
- package/extensions/builtin.theme-slime/color-theme.json +16 -0
- package/package.json +6 -6
- package/src/parts/FileSystem/FileSystem.js +0 -1
package/config/fileMap.json
CHANGED
|
@@ -257,6 +257,13 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
257
257
|
} else if ((next = part.match(RE_COMMA))) {
|
|
258
258
|
token = TokenType.Punctuation
|
|
259
259
|
state = State.AfterQuery
|
|
260
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
261
|
+
token = TokenType.Punctuation
|
|
262
|
+
state = State.InsideDoubleQuoteString
|
|
263
|
+
stack.push(State.AfterQuery)
|
|
264
|
+
} else if ((next = part.match(RE_SEMICOLON))) {
|
|
265
|
+
token = TokenType.Punctuation
|
|
266
|
+
state = stack.pop() || State.TopLevelContent
|
|
260
267
|
} else {
|
|
261
268
|
part
|
|
262
269
|
throw new Error('no')
|
|
@@ -6,7 +6,13 @@
|
|
|
6
6
|
{
|
|
7
7
|
"id": "dotenv",
|
|
8
8
|
"extensions": [".env"],
|
|
9
|
-
"fileNames": [
|
|
9
|
+
"fileNames": [
|
|
10
|
+
"sampledotenv",
|
|
11
|
+
".env.local",
|
|
12
|
+
".env.example",
|
|
13
|
+
".env.development.example",
|
|
14
|
+
".env.production.example"
|
|
15
|
+
],
|
|
10
16
|
"configuration": "./languageConfiguration.json",
|
|
11
17
|
"tokenize": "src/tokenizeDotenv.js"
|
|
12
18
|
}
|
|
@@ -56,13 +56,14 @@ export const TokenMap = {
|
|
|
56
56
|
const RE_ANGLE_BRACKET_CLOSE = /^>/
|
|
57
57
|
const RE_ANGLE_BRACKET_ONLY = /^</
|
|
58
58
|
const RE_ANGLE_BRACKET_OPEN = /^</
|
|
59
|
-
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(
|
|
59
|
+
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!])/
|
|
60
60
|
const RE_ANY_TEXT = /^[^\n]+/
|
|
61
|
-
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d
|
|
61
|
+
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
|
|
62
62
|
const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
|
|
63
63
|
const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
|
|
64
64
|
const RE_BLOCK_COMMENT_END = /^-->/
|
|
65
65
|
const RE_BLOCK_COMMENT_START = /^<!--/
|
|
66
|
+
const RE_DOCTYPE = /^<!(?=\w)/
|
|
66
67
|
const RE_DASH_DASH = /^\-\-/
|
|
67
68
|
const RE_DOUBLE_QUOTE = /^"/
|
|
68
69
|
const RE_EQUAL_SIGN = /^=/
|
|
@@ -124,9 +125,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
124
125
|
} else if ((next = part.match(RE_TEXT))) {
|
|
125
126
|
token = TokenType.Text
|
|
126
127
|
state = State.TopLevelContent
|
|
128
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
129
|
+
token = TokenType.Comment
|
|
130
|
+
state = State.InsideBlockComment
|
|
127
131
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
128
132
|
token = TokenType.Text
|
|
129
133
|
state = State.TopLevelContent
|
|
134
|
+
} else if ((next = part.match(RE_DOCTYPE))) {
|
|
135
|
+
token = TokenType.PunctuationTag
|
|
136
|
+
state = State.AfterOpeningAngleBracket
|
|
130
137
|
} else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
|
|
131
138
|
token = TokenType.Text
|
|
132
139
|
state = State.TopLevelContent
|
|
@@ -52,6 +52,7 @@ export const TokenType = {
|
|
|
52
52
|
FunctionName: 885,
|
|
53
53
|
KeywordThis: 886,
|
|
54
54
|
KeywordOperator: 887,
|
|
55
|
+
KeywordFunction: 889,
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
export const TokenMap = {
|
|
@@ -80,10 +81,11 @@ export const TokenMap = {
|
|
|
80
81
|
[TokenType.FunctionName]: 'Function',
|
|
81
82
|
[TokenType.KeywordThis]: 'KeywordThis',
|
|
82
83
|
[TokenType.KeywordOperator]: 'KeywordOperator',
|
|
84
|
+
[TokenType.KeywordFunction]: 'KeywordFunction',
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
const RE_KEYWORD =
|
|
86
|
-
/^(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|var|void|while|with|yield)\b/
|
|
88
|
+
/^(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|if|implements|import|in|Infinity|instanceof|interface|let|new|null|of|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|undefined|var|void|while|with|yield)\b/
|
|
87
89
|
const RE_CURLY_OPEN = /^\{/
|
|
88
90
|
const RE_CURLY_CLOSE = /^\}/
|
|
89
91
|
const RE_SQUARE_OPEN = /^\[/
|
|
@@ -118,20 +120,29 @@ const RE_QUOTE_DOUBLE = /^"/
|
|
|
118
120
|
const RE_QUOTE_BACKTICK = /^`/
|
|
119
121
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
120
122
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
121
|
-
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[
|
|
123
|
+
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`\\\$]+/
|
|
122
124
|
const RE_STRING_ESCAPE = /^\\./
|
|
123
125
|
const RE_SHEBANG = /^#!.*/
|
|
124
126
|
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*(\(|\=\s*function|\=\s*\())/
|
|
125
127
|
const RE_DECORATOR = /^@\w+/
|
|
128
|
+
const RE_BACKSLASH = /^\\/
|
|
129
|
+
const RE_DOLLAR_CURLY_OPEN = /^\$\{/
|
|
130
|
+
const RE_DOLLAR = /^\$/
|
|
131
|
+
const RE_ANYTHING = /^.+/u
|
|
126
132
|
|
|
127
133
|
// copied from https://github.com/PrismJS/prism/blob/master/components/prism-javascript.js#L57
|
|
128
134
|
const RE_REGEX =
|
|
129
135
|
/^((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/
|
|
130
136
|
|
|
131
137
|
const RE_VARIABLE_NAME_SPECIAL = /\p{L}/u
|
|
138
|
+
const RE_VARIABLE_NAME_SPECIAL_2 = /./u
|
|
132
139
|
|
|
133
140
|
export const initialLineState = {
|
|
134
141
|
state: State.TopLevelContent,
|
|
142
|
+
/**
|
|
143
|
+
* @type {any[]}
|
|
144
|
+
*/
|
|
145
|
+
stack: [],
|
|
135
146
|
}
|
|
136
147
|
|
|
137
148
|
export const hasArrayReturn = true
|
|
@@ -148,6 +159,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
148
159
|
let tokens = []
|
|
149
160
|
let token = TokenType.None
|
|
150
161
|
let state = lineState.state
|
|
162
|
+
let stack = [...lineState.stack]
|
|
151
163
|
while (index < line.length) {
|
|
152
164
|
const part = line.slice(index)
|
|
153
165
|
switch (state) {
|
|
@@ -160,6 +172,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
160
172
|
case 'true':
|
|
161
173
|
case 'false':
|
|
162
174
|
case 'null':
|
|
175
|
+
case 'undefined':
|
|
163
176
|
token = TokenType.LanguageConstant
|
|
164
177
|
break
|
|
165
178
|
case 'import':
|
|
@@ -201,6 +214,16 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
201
214
|
case 'in':
|
|
202
215
|
token = TokenType.KeywordOperator
|
|
203
216
|
break
|
|
217
|
+
case 'function':
|
|
218
|
+
token = TokenType.KeywordFunction
|
|
219
|
+
break
|
|
220
|
+
case 'Infinity':
|
|
221
|
+
token = TokenType.Numeric
|
|
222
|
+
state = State.TopLevelContent
|
|
223
|
+
break
|
|
224
|
+
case 'of':
|
|
225
|
+
token = TokenType.KeywordOperator
|
|
226
|
+
break
|
|
204
227
|
default:
|
|
205
228
|
token = TokenType.Keyword
|
|
206
229
|
break
|
|
@@ -219,6 +242,8 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
219
242
|
token = TokenType.Punctuation
|
|
220
243
|
if (next[0] === '.') {
|
|
221
244
|
state = State.AfterPropertyDot
|
|
245
|
+
} else if (next[0] === '}') {
|
|
246
|
+
state = stack.pop() || State.TopLevelContent
|
|
222
247
|
} else {
|
|
223
248
|
state = State.TopLevelContent
|
|
224
249
|
}
|
|
@@ -258,6 +283,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
258
283
|
} else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL))) {
|
|
259
284
|
token = TokenType.VariableName
|
|
260
285
|
state = State.TopLevelContent
|
|
286
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
287
|
+
token = TokenType.Text
|
|
288
|
+
state = State.TopLevelContent
|
|
261
289
|
} else {
|
|
262
290
|
throw new Error('no')
|
|
263
291
|
}
|
|
@@ -306,7 +334,11 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
306
334
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
307
335
|
token = TokenType.String
|
|
308
336
|
state = State.InsideSingleQuoteString
|
|
337
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
338
|
+
token = TokenType.String
|
|
339
|
+
state = State.InsideSingleQuoteString
|
|
309
340
|
} else {
|
|
341
|
+
part
|
|
310
342
|
throw new Error('no')
|
|
311
343
|
}
|
|
312
344
|
break
|
|
@@ -320,6 +352,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
320
352
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
321
353
|
token = TokenType.String
|
|
322
354
|
state = State.InsideDoubleQuoteString
|
|
355
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
356
|
+
token = TokenType.String
|
|
357
|
+
state = State.InsideDoubleQuoteString
|
|
323
358
|
} else {
|
|
324
359
|
throw new Error('no')
|
|
325
360
|
}
|
|
@@ -331,9 +366,19 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
331
366
|
} else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
|
|
332
367
|
token = TokenType.String
|
|
333
368
|
state = State.InsideBacktickString
|
|
369
|
+
} else if ((next = part.match(RE_DOLLAR_CURLY_OPEN))) {
|
|
370
|
+
token = TokenType.Punctuation
|
|
371
|
+
state = State.TopLevelContent
|
|
372
|
+
stack.push(State.InsideBacktickString)
|
|
334
373
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
335
374
|
token = TokenType.String
|
|
336
375
|
state = State.InsideBacktickString
|
|
376
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
377
|
+
token = TokenType.String
|
|
378
|
+
state = State.InsideDoubleQuoteString
|
|
379
|
+
} else if ((next = part.match(RE_DOLLAR))) {
|
|
380
|
+
token = TokenType.String
|
|
381
|
+
state = State.InsideBacktickString
|
|
337
382
|
} else {
|
|
338
383
|
throw new Error('no')
|
|
339
384
|
}
|
|
@@ -357,6 +402,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
357
402
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
358
403
|
token = TokenType.Punctuation
|
|
359
404
|
state = State.TopLevelContent
|
|
405
|
+
} else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL_2))) {
|
|
406
|
+
token = TokenType.VariableName
|
|
407
|
+
state = State.TopLevelContent
|
|
360
408
|
} else {
|
|
361
409
|
throw new Error('no')
|
|
362
410
|
}
|
|
@@ -372,8 +420,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
372
420
|
if (state === State.InsideLineComment) {
|
|
373
421
|
state = State.TopLevelContent
|
|
374
422
|
}
|
|
423
|
+
if (state === State.InsideSingleQuoteString && !line.endsWith('\\')) {
|
|
424
|
+
state = State.TopLevelContent
|
|
425
|
+
}
|
|
375
426
|
return {
|
|
376
427
|
state,
|
|
377
428
|
tokens,
|
|
429
|
+
stack,
|
|
378
430
|
}
|
|
379
431
|
}
|
|
@@ -11,6 +11,7 @@ export const State = {
|
|
|
11
11
|
JsonPropertyKey: 7,
|
|
12
12
|
InsideLineComment: 8,
|
|
13
13
|
InsidePropertyNameString: 9,
|
|
14
|
+
InsideBlockComment: 10,
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export const StateMap = {
|
|
@@ -97,6 +98,10 @@ const RE_TEXT = /^[^\s\{\}\[\]]+/
|
|
|
97
98
|
// const RE_BACK_SLASH = /^\\/
|
|
98
99
|
const RE_STRING_ESCAPE = /^\\.?/
|
|
99
100
|
const RE_WORD = /^\w+/
|
|
101
|
+
const RE_BLOCK_COMMENT_START = /^\/\*/
|
|
102
|
+
const RE_BLOCK_COMMENT_CONTENT = /^.+?(?=\*\/)/
|
|
103
|
+
const RE_BLOCK_COMMENT_END = /^\*\//
|
|
104
|
+
const RE_ANYTHING_UNTIL_END = /^.+/s
|
|
100
105
|
|
|
101
106
|
export const initialLineState = {
|
|
102
107
|
state: State.TopLevelContent,
|
|
@@ -158,6 +163,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
158
163
|
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
159
164
|
token = TokenType.CurlyClose
|
|
160
165
|
state = stack.pop()
|
|
166
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
167
|
+
token = TokenType.Comment
|
|
168
|
+
state = State.InsideBlockComment
|
|
169
|
+
stack.push(State.TopLevelContent)
|
|
161
170
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
162
171
|
token = TokenType.Text
|
|
163
172
|
state = State.TopLevelContent
|
|
@@ -186,6 +195,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
186
195
|
} else if ((next = part.match(RE_WORD))) {
|
|
187
196
|
token = TokenType.Text
|
|
188
197
|
state = State.AfterPropertyName
|
|
198
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
199
|
+
token = TokenType.Comment
|
|
200
|
+
state = State.InsideBlockComment
|
|
201
|
+
stack.push(State.AfterCurlyOpen)
|
|
189
202
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
190
203
|
token = TokenType.Text
|
|
191
204
|
state = State.AfterCurlyOpen
|
|
@@ -298,6 +311,20 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
298
311
|
throw new Error('no')
|
|
299
312
|
}
|
|
300
313
|
break
|
|
314
|
+
case State.InsideBlockComment:
|
|
315
|
+
if ((next = part.match(RE_BLOCK_COMMENT_END))) {
|
|
316
|
+
token = TokenType.Comment
|
|
317
|
+
state = stack.pop() || State.TopLevelContent
|
|
318
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_CONTENT))) {
|
|
319
|
+
token = TokenType.Comment
|
|
320
|
+
state = State.InsideBlockComment
|
|
321
|
+
} else if ((next = part.match(RE_ANYTHING_UNTIL_END))) {
|
|
322
|
+
token = TokenType.Comment
|
|
323
|
+
state = State.InsideBlockComment
|
|
324
|
+
} else {
|
|
325
|
+
throw new Error('no')
|
|
326
|
+
}
|
|
327
|
+
break
|
|
301
328
|
default:
|
|
302
329
|
state
|
|
303
330
|
throw new Error('no')
|
|
@@ -17,6 +17,7 @@ const State = {
|
|
|
17
17
|
InsideSingleQuoteString: 13,
|
|
18
18
|
AfterTripleBackTick: 14,
|
|
19
19
|
AfterTripleBackTickAfterLanguageId: 15,
|
|
20
|
+
InsideBackTickString: 16,
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export const StateMap = {}
|
|
@@ -39,6 +40,7 @@ export const TokenType = {
|
|
|
39
40
|
PunctuationString: 11,
|
|
40
41
|
NewLine: 891,
|
|
41
42
|
Heading: 13,
|
|
43
|
+
MarkdownString: 18,
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
export const TokenMap = {
|
|
@@ -55,6 +57,7 @@ export const TokenMap = {
|
|
|
55
57
|
[TokenType.Error]: 'Error',
|
|
56
58
|
[TokenType.PunctuationString]: 'PunctuationString',
|
|
57
59
|
[TokenType.Heading]: 'Heading',
|
|
60
|
+
[TokenType.MarkdownString]: 'MarkdownString',
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
const RE_ANGLE_BRACKET_CLOSE = /^>/
|
|
@@ -79,17 +82,20 @@ const RE_PUNCTUATION = /^[<;'".,]/
|
|
|
79
82
|
const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
|
|
80
83
|
const RE_SELF_CLOSING = /^\/>/
|
|
81
84
|
const RE_SINGLE_QUOTE = /^'/
|
|
85
|
+
const RE_QUOTE_BACKTICK = /^`/
|
|
82
86
|
const RE_SLASH = /^\//
|
|
87
|
+
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
|
|
83
88
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
84
89
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
85
90
|
const RE_TAG_TEXT = /^[^\s>]+/
|
|
86
91
|
const RE_TAGNAME = /^[!\w]+/
|
|
87
|
-
const RE_TEXT = /^[^<>\n]+/
|
|
92
|
+
const RE_TEXT = /^[^<>\n\`]+/
|
|
88
93
|
const RE_WHITESPACE = /^\s+/
|
|
89
94
|
const RE_WORD = /^[^\s]+/
|
|
90
95
|
const RE_HEADING = /^\#.*/s
|
|
91
96
|
const RE_TRIPLE_BACKTICK = /^`{3,}/
|
|
92
|
-
const RE_TRIPLE_QUOTED_STRING_CONTENT =
|
|
97
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT = /[^`]/s
|
|
98
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
93
99
|
|
|
94
100
|
export const initialLineState = {
|
|
95
101
|
state: State.TopLevelContent,
|
|
@@ -137,6 +143,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
137
143
|
} else if ((next = part.match(RE_TEXT))) {
|
|
138
144
|
token = TokenType.Text
|
|
139
145
|
state = State.TopLevelContent
|
|
146
|
+
} else if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
147
|
+
token = TokenType.Punctuation
|
|
148
|
+
state = State.InsideBackTickString
|
|
140
149
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
141
150
|
token = TokenType.Text
|
|
142
151
|
state = State.TopLevelContent
|
|
@@ -323,6 +332,20 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
323
332
|
throw new Error('no')
|
|
324
333
|
}
|
|
325
334
|
break
|
|
335
|
+
case State.InsideBackTickString:
|
|
336
|
+
if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
337
|
+
token = TokenType.Punctuation
|
|
338
|
+
state = State.TopLevelContent
|
|
339
|
+
} else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
|
|
340
|
+
token = TokenType.MarkdownString
|
|
341
|
+
state = State.InsideBackTickString
|
|
342
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
343
|
+
token = TokenType.String
|
|
344
|
+
state = State.InsideBackTickString
|
|
345
|
+
} else {
|
|
346
|
+
throw new Error('no')
|
|
347
|
+
}
|
|
348
|
+
break
|
|
326
349
|
default:
|
|
327
350
|
state
|
|
328
351
|
throw new Error('no')
|
|
@@ -72,7 +72,7 @@ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
|
72
72
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
73
73
|
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
|
|
74
74
|
const RE_KEYWORD =
|
|
75
|
-
/^(?:7z|7za|7zr|alias|apk|apt-get|ar|asciidoctor|awk|basename|bash|bg|bind|blkid|break|brew|brotli|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|cmp|command|compgen|complete|continue|cp|cryptsetup|curl|curl|cut|cygstart|dde-open|defaults|diff|dirname|dirs|disown|do|docker|done|done|dpkg|du|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|find|for|free|function|fzf|g\+\+|gcc|gcloud|gdbus|getopts|gio|git|gnome-open|grep|grub-mount|gs|gulp|gvfs-open|gzip|hash|head|help|hexdump|history|identity|if|in|install|ip|jobs|kde-open|kfmclient|kill|killall|less|let|lha|local|logout|ls|ls|lunzip|lzip|lzma|makepkg|miniunz|miniunzip|mkdir|mktemp|mount|mpicc|mv|node|npm|npx|open|pacman|pcmanfm|pdftotext|pkg|plutil|popd|prezip-bin|printf|println|ps|pushd|pwd|python3|rar|read|readlink|readonly|return|rm|rpm|rsync|sed|set|sha256sum|shift|shopt|sleep|snap|sort|source|stty|sudo|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|tune2fs|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unmount|unrar|unset|unwrapdiff|unzip|unzoo|vim|wait|wc|wget|which|while|xargs|xprop|xz|yarn|yum|zip|zoo|zsh|zstd)\b/
|
|
75
|
+
/^(?:7z|7za|7zr|alias|apk|apt-get|ar|asciidoctor|awk|basename|bash|bg|bind|blkid|break|brew|brotli|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|cmp|command|compgen|complete|continue|cp|cryptsetup|curl|curl|cut|cygstart|dde-open|defaults|diff|dirname|dirs|disown|do|docker|done|done|dpkg|du|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|find|for|free|function|fzf|g\+\+|gcc|gcloud|gdbus|getopts|gio|git|gnome-open|grep|grub-mount|gs|gulp|gvfs-open|gzip|hash|head|help|hexdump|history|identity|if|in|install|ip|jobs|kde-open|kfmclient|kill|killall|less|let|lha|ln|local|logout|ls|ls|lunzip|lzip|lzma|makepkg|miniunz|miniunzip|mkdir|mktemp|mount|mpicc|mv|node|npm|npx|open|pacman|pcmanfm|pdftotext|pkg|plutil|popd|prezip-bin|printf|println|ps|pushd|pwd|python3|rar|read|readlink|readonly|return|rm|rpm|rsync|sed|set|sha256sum|shift|shopt|sleep|snap|sort|source|stty|sudo|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|tune2fs|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unmount|unrar|unset|unwrapdiff|unzip|unzoo|update-alternatives|vim|wait|wc|wget|which|while|xargs|xprop|xz|yarn|yum|zip|zoo|zsh|zstd)\b/
|
|
76
76
|
const RE_VARIABLE_NAME = /^[a-zA-Z\_\/\-\$][a-zA-Z\_\/\-\$#\d\-]*/
|
|
77
77
|
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\!\|\+\&\>\)]/
|
|
78
78
|
const RE_NUMERIC = /^\d+(?=\s|$)/
|
|
@@ -147,10 +147,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
147
147
|
case 'apk':
|
|
148
148
|
case 'apt-get':
|
|
149
149
|
case 'ar':
|
|
150
|
+
case 'asciidoctor':
|
|
150
151
|
case 'awk':
|
|
152
|
+
case 'basename':
|
|
153
|
+
case 'bash':
|
|
151
154
|
case 'bg':
|
|
152
155
|
case 'bind':
|
|
153
156
|
case 'blkid':
|
|
157
|
+
case 'brew':
|
|
158
|
+
case 'brotli':
|
|
154
159
|
case 'builtin':
|
|
155
160
|
case 'bunzip':
|
|
156
161
|
case 'bunzip2':
|
|
@@ -172,10 +177,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
172
177
|
case 'cut':
|
|
173
178
|
case 'cygstart':
|
|
174
179
|
case 'dde-open':
|
|
180
|
+
case 'defaults':
|
|
175
181
|
case 'diff':
|
|
176
182
|
case 'dirname':
|
|
177
183
|
case 'dirs':
|
|
178
184
|
case 'disown':
|
|
185
|
+
case 'docker':
|
|
179
186
|
case 'dpkg':
|
|
180
187
|
case 'du':
|
|
181
188
|
case 'echo':
|
|
@@ -194,6 +201,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
194
201
|
case 'fzf':
|
|
195
202
|
case 'g++':
|
|
196
203
|
case 'gcc':
|
|
204
|
+
case 'gcloud':
|
|
197
205
|
case 'gdbus':
|
|
198
206
|
case 'getopts':
|
|
199
207
|
case 'gio':
|
|
@@ -220,6 +228,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
220
228
|
case 'killall':
|
|
221
229
|
case 'less':
|
|
222
230
|
case 'lha':
|
|
231
|
+
case 'ln':
|
|
223
232
|
case 'logout':
|
|
224
233
|
case 'ls':
|
|
225
234
|
case 'ls':
|
|
@@ -236,17 +245,21 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
236
245
|
case 'mv':
|
|
237
246
|
case 'node':
|
|
238
247
|
case 'npm':
|
|
248
|
+
case 'npx':
|
|
239
249
|
case 'open':
|
|
240
250
|
case 'pacman':
|
|
241
251
|
case 'pcmanfm':
|
|
242
252
|
case 'pdftotext':
|
|
243
253
|
case 'pkg':
|
|
254
|
+
case 'plutil':
|
|
244
255
|
case 'popd':
|
|
245
256
|
case 'prezip-bin':
|
|
246
257
|
case 'printf':
|
|
258
|
+
case 'println':
|
|
247
259
|
case 'ps':
|
|
248
260
|
case 'pushd':
|
|
249
261
|
case 'pwd':
|
|
262
|
+
case 'python3':
|
|
250
263
|
case 'rar':
|
|
251
264
|
case 'read':
|
|
252
265
|
case 'readlink':
|
|
@@ -255,6 +268,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
255
268
|
case 'rsync':
|
|
256
269
|
case 'sed':
|
|
257
270
|
case 'set':
|
|
271
|
+
case 'sha256sum':
|
|
258
272
|
case 'shift':
|
|
259
273
|
case 'shopt':
|
|
260
274
|
case 'sleep':
|
|
@@ -287,6 +301,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
287
301
|
case 'unwrapdiff':
|
|
288
302
|
case 'unzip':
|
|
289
303
|
case 'unzoo':
|
|
304
|
+
case 'update-alternatives':
|
|
290
305
|
case 'vim':
|
|
291
306
|
case 'wait':
|
|
292
307
|
case 'wc':
|
|
@@ -299,21 +314,8 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
299
314
|
case 'yum':
|
|
300
315
|
case 'zip':
|
|
301
316
|
case 'zoo':
|
|
302
|
-
case 'zstd':
|
|
303
|
-
case 'basename':
|
|
304
|
-
case 'brew':
|
|
305
|
-
case 'sha256sum':
|
|
306
|
-
case 'brotli':
|
|
307
317
|
case 'zsh':
|
|
308
|
-
case '
|
|
309
|
-
case 'docker':
|
|
310
|
-
case 'python3':
|
|
311
|
-
case 'bash':
|
|
312
|
-
case 'npx':
|
|
313
|
-
case 'gcloud':
|
|
314
|
-
case 'println':
|
|
315
|
-
case 'plutil':
|
|
316
|
-
case 'defaults':
|
|
318
|
+
case 'zstd':
|
|
317
319
|
token = TokenType.Function
|
|
318
320
|
break
|
|
319
321
|
case 'true':
|
|
@@ -33,6 +33,7 @@ const State = {
|
|
|
33
33
|
InsideMethodParameters: 30,
|
|
34
34
|
InsideMethodParametersAfterVariableName: 31,
|
|
35
35
|
AfterMethodParameters: 32,
|
|
36
|
+
AfterPropertyDot: 33,
|
|
36
37
|
// AfterKeywordImport: 27,
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -63,6 +64,7 @@ export const TokenType = {
|
|
|
63
64
|
StorageModifier: 18,
|
|
64
65
|
KeywordVoid: 19,
|
|
65
66
|
Function: 20,
|
|
67
|
+
FunctionName: 21,
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
export const TokenMap = {
|
|
@@ -89,6 +91,7 @@ export const TokenMap = {
|
|
|
89
91
|
[TokenType.StorageModifier]: 'StorageModifier',
|
|
90
92
|
[TokenType.KeywordVoid]: 'KeywordVoid',
|
|
91
93
|
[TokenType.Function]: 'Function',
|
|
94
|
+
[TokenType.FunctionName]: 'Function',
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
export const initialLineState = {
|
|
@@ -99,8 +102,9 @@ export const initialLineState = {
|
|
|
99
102
|
stack: [],
|
|
100
103
|
}
|
|
101
104
|
|
|
105
|
+
const RE_LINE_COMMENT = /^\/\/[^\n]*/
|
|
102
106
|
const RE_KEYWORD =
|
|
103
|
-
/^(?:yield|with|while|void|var|typeof|type|true|try|throw|this|static|switch|super|return|public|protected|private|package|null|new|let|interface|instanceof|in|import|implements|if|function|for|finally|from|false|extends|export|enum|else|do|delete|default|debugger|declare|continue|const|class|catch|case|break|await|async)\b/
|
|
107
|
+
/^(?:yield|with|while|void|var|typeof|type|true|try|throw|this|static|switch|super|readonly|return|public|protected|private|package|null|new|let|interface|instanceof|in|import|implements|if|function|for|finally|from|false|extends|export|enum|else|do|delete|default|debugger|declare|continue|const|constructor|class|catch|case|break|await|async|abstract)\b/
|
|
104
108
|
const RE_WHITESPACE = /^\s+/
|
|
105
109
|
const RE_VARIABLE_NAME = /^[\$a-zA-Z\_][\$a-zA-Z\_\d]*/
|
|
106
110
|
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)>\+]/
|
|
@@ -151,6 +155,12 @@ const RE_ANGLE_OPEN = /^</
|
|
|
151
155
|
const RE_ANGLE_CLOSE = /^>/
|
|
152
156
|
const RE_OPERATOR = /^[!\*\?\.\:\|\%\&\^@]/
|
|
153
157
|
const RE_METHOD_NAME = /^[\w\d]+(?=\s*(\(|\:\s*function|\:\s*\())/
|
|
158
|
+
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*(\(|\=\s*function|\=\s*\())/
|
|
159
|
+
const RE_NUMERIC_2 =
|
|
160
|
+
/^(?:(?:[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)(n)?\B)|(?:(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(n)?\b(?!\.))|(?:0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b)|(?:0(?:b|B)[01][01_]*(n)?\b)|(?:0(?:o|O)?[0-7][0-7_]*(n)?\b))/ // 1.1E+3
|
|
161
|
+
const RE_NUMERIC_HEX = /0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b/
|
|
162
|
+
const RE_NUMERIC_BINARY = /0(?:b|B)[01][01_]*(n)?\b/
|
|
163
|
+
const RE_NUMERIC_OCTAL = /0(?:o|O)?[0-7][0-7_]*(n)?\b/
|
|
154
164
|
|
|
155
165
|
export const hasArrayReturn = true
|
|
156
166
|
|
|
@@ -237,6 +247,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
237
247
|
token = TokenType.Keyword
|
|
238
248
|
state = State.AfterKeywordInterface
|
|
239
249
|
break
|
|
250
|
+
case 'private':
|
|
251
|
+
case 'protected':
|
|
252
|
+
case 'readonly':
|
|
253
|
+
case 'public':
|
|
254
|
+
case 'override':
|
|
255
|
+
case 'abstract':
|
|
256
|
+
token = TokenType.KeywordModifier
|
|
257
|
+
state = State.TopLevelContent
|
|
258
|
+
break
|
|
240
259
|
default:
|
|
241
260
|
token = TokenType.Keyword
|
|
242
261
|
state = State.TopLevelContent
|
|
@@ -245,9 +264,6 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
245
264
|
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
246
265
|
token = TokenType.VariableName
|
|
247
266
|
state = State.TopLevelContent
|
|
248
|
-
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
249
|
-
token = TokenType.Punctuation
|
|
250
|
-
state = State.TopLevelContent
|
|
251
267
|
} else if ((next = part.match(RE_SLASH))) {
|
|
252
268
|
if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
253
269
|
token = TokenType.Comment
|
|
@@ -263,9 +279,20 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
263
279
|
token = TokenType.Punctuation
|
|
264
280
|
state = State.TopLevelContent
|
|
265
281
|
}
|
|
266
|
-
}
|
|
282
|
+
}
|
|
283
|
+
// else if ((next = part.match(RE_NUMERIC))) {
|
|
284
|
+
// token = TokenType.Numeric
|
|
285
|
+
// state = State.TopLevelContent
|
|
286
|
+
// }
|
|
287
|
+
else if ((next = part.match(RE_NUMERIC_2))) {
|
|
267
288
|
token = TokenType.Numeric
|
|
268
289
|
state = State.TopLevelContent
|
|
290
|
+
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
291
|
+
token = TokenType.Punctuation
|
|
292
|
+
state = State.TopLevelContent
|
|
293
|
+
if (next[0] === '.') {
|
|
294
|
+
state = State.AfterPropertyDot
|
|
295
|
+
}
|
|
269
296
|
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
270
297
|
token = TokenType.Punctuation
|
|
271
298
|
state = State.InsideSingleQuoteString
|
|
@@ -767,6 +794,29 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
767
794
|
throw new Error('no')
|
|
768
795
|
}
|
|
769
796
|
break
|
|
797
|
+
case State.AfterPropertyDot:
|
|
798
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
799
|
+
token = TokenType.Whitespace
|
|
800
|
+
state = State.AfterPropertyDot
|
|
801
|
+
} else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
|
|
802
|
+
token = TokenType.FunctionName
|
|
803
|
+
state = State.TopLevelContent
|
|
804
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
805
|
+
token = TokenType.VariableName
|
|
806
|
+
state = State.TopLevelContent
|
|
807
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
808
|
+
token = TokenType.Comment
|
|
809
|
+
state = State.InsideLineComment
|
|
810
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
811
|
+
token = TokenType.Comment
|
|
812
|
+
state = State.InsideBlockComment
|
|
813
|
+
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
814
|
+
token = TokenType.Punctuation
|
|
815
|
+
state = State.TopLevelContent
|
|
816
|
+
} else {
|
|
817
|
+
throw new Error('no')
|
|
818
|
+
}
|
|
819
|
+
break
|
|
770
820
|
default:
|
|
771
821
|
state
|
|
772
822
|
throw new Error('no')
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Language Basics Vue
|
|
2
|
+
|
|
3
|
+
## Contributing
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
git clone git@github.com:lvce-editor/language-basics-vue.git &&
|
|
7
|
+
cd language-basics-vue &&
|
|
8
|
+
npm ci &&
|
|
9
|
+
npm test
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Gitpod
|
|
13
|
+
|
|
14
|
+
[](https://gitpod.io/#https://github.com/lvce-editor/language-basics-vue)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "builtin.language-basics-vue",
|
|
3
|
+
"name": "Language Basics Vue",
|
|
4
|
+
"description": "Provides syntax highlighting and bracket matching in Vue files.",
|
|
5
|
+
"languages": [
|
|
6
|
+
{
|
|
7
|
+
"id": "vue",
|
|
8
|
+
"extensions": [".vue"],
|
|
9
|
+
"tokenize": "src/tokenizeVue.js",
|
|
10
|
+
"configuration": "./languageConfiguration.json"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enum number
|
|
3
|
+
*/
|
|
4
|
+
const State = {
|
|
5
|
+
TopLevelContent: 1,
|
|
6
|
+
AfterOpeningAngleBracket: 2,
|
|
7
|
+
InsideOpeningTag: 3,
|
|
8
|
+
InsideOpeningTagAndHasSeenWhitespace: 4,
|
|
9
|
+
AfterClosingTagAngleBrackets: 5,
|
|
10
|
+
AfterClosingTagName: 6,
|
|
11
|
+
AfterAttributeName: 7,
|
|
12
|
+
AfterAttributeEqualSign: 8,
|
|
13
|
+
InsideAttributeDoubleQuote: 9,
|
|
14
|
+
InsideBlockComment: 10,
|
|
15
|
+
None: 11,
|
|
16
|
+
InsideDoubleQuoteString: 12,
|
|
17
|
+
InsideSingleQuoteString: 13,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const StateMap = {}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @enum number
|
|
24
|
+
*/
|
|
25
|
+
export const TokenType = {
|
|
26
|
+
None: 99999999,
|
|
27
|
+
Numeric: 30,
|
|
28
|
+
String: 50,
|
|
29
|
+
Whitespace: 0,
|
|
30
|
+
Comment: 60,
|
|
31
|
+
Text: 117,
|
|
32
|
+
PunctuationTag: 228,
|
|
33
|
+
TagName: 118,
|
|
34
|
+
AttributeName: 119,
|
|
35
|
+
Punctuation: 10,
|
|
36
|
+
Error: 141,
|
|
37
|
+
PunctuationString: 11,
|
|
38
|
+
NewLine: 891,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const TokenMap = {
|
|
42
|
+
[TokenType.None]: 'None',
|
|
43
|
+
[TokenType.Numeric]: 'Numeric',
|
|
44
|
+
[TokenType.String]: 'String',
|
|
45
|
+
[TokenType.Whitespace]: 'Whitespace',
|
|
46
|
+
[TokenType.Comment]: 'Comment',
|
|
47
|
+
[TokenType.Text]: 'Text',
|
|
48
|
+
[TokenType.PunctuationTag]: 'PunctuationTag',
|
|
49
|
+
[TokenType.TagName]: 'TagName',
|
|
50
|
+
[TokenType.AttributeName]: 'AttributeName',
|
|
51
|
+
[TokenType.Punctuation]: 'Punctuation',
|
|
52
|
+
[TokenType.Error]: 'Error',
|
|
53
|
+
[TokenType.PunctuationString]: 'PunctuationString',
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const RE_ANGLE_BRACKET_CLOSE = /^>/
|
|
57
|
+
const RE_ANGLE_BRACKET_ONLY = /^</
|
|
58
|
+
const RE_ANGLE_BRACKET_OPEN = /^</
|
|
59
|
+
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!])/
|
|
60
|
+
const RE_ANY_TEXT = /^[^\n]+/
|
|
61
|
+
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
|
|
62
|
+
const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
|
|
63
|
+
const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
|
|
64
|
+
const RE_BLOCK_COMMENT_END = /^-->/
|
|
65
|
+
const RE_BLOCK_COMMENT_START = /^<!--/
|
|
66
|
+
const RE_DOCTYPE = /^<!(?=\w)/
|
|
67
|
+
const RE_DASH_DASH = /^\-\-/
|
|
68
|
+
const RE_DOUBLE_QUOTE = /^"/
|
|
69
|
+
const RE_EQUAL_SIGN = /^=/
|
|
70
|
+
const RE_EXCLAMATION_MARK = /^!/
|
|
71
|
+
const RE_INVALID_INSIDE_ClOSING_TAG = /^[^a-zA-Z>]/
|
|
72
|
+
const RE_INVALID_INSIDE_OPENING_TAG = /^[^a-zA-Z>]/
|
|
73
|
+
const RE_NEWLINE = /^\n/
|
|
74
|
+
const RE_NEWLINE_WHITESPACE = /^\n\s*/
|
|
75
|
+
const RE_NOT_TAGNAME = /^[^a-zA-Z\d]+/
|
|
76
|
+
const RE_PUNCTUATION = /^[<;'".,]/
|
|
77
|
+
const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
|
|
78
|
+
const RE_SELF_CLOSING = /^\/>/
|
|
79
|
+
const RE_SINGLE_QUOTE = /^'/
|
|
80
|
+
const RE_SLASH = /^\//
|
|
81
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
82
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
83
|
+
const RE_TAG_TEXT = /^[^\s>]+/
|
|
84
|
+
const RE_TAGNAME = /^[!\w]+/
|
|
85
|
+
const RE_TEXT = /^[^<>\n]+/
|
|
86
|
+
const RE_WHITESPACE = /^\s+/
|
|
87
|
+
const RE_WORD = /^[^\s]+/
|
|
88
|
+
const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[^<>]+/
|
|
89
|
+
|
|
90
|
+
export const initialLineState = {
|
|
91
|
+
state: State.TopLevelContent,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
* @param {any} lineStateA
|
|
97
|
+
* @param {any} lineStateB
|
|
98
|
+
* @returns
|
|
99
|
+
*/
|
|
100
|
+
export const isLineStateEqual = (lineStateA, lineStateB) => {
|
|
101
|
+
return lineStateA.state === lineStateB.state
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const hasArrayReturn = true
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
*
|
|
108
|
+
* @param {string} line
|
|
109
|
+
* @param {any} lineState
|
|
110
|
+
* @returns
|
|
111
|
+
*/
|
|
112
|
+
export const tokenizeLine = (line, lineState) => {
|
|
113
|
+
let next = null
|
|
114
|
+
let index = 0
|
|
115
|
+
let tokens = []
|
|
116
|
+
let token = TokenType.None
|
|
117
|
+
let state = lineState.state
|
|
118
|
+
while (index < line.length) {
|
|
119
|
+
const part = line.slice(index)
|
|
120
|
+
switch (state) {
|
|
121
|
+
case State.TopLevelContent:
|
|
122
|
+
if ((next = part.match(RE_ANGLE_BRACKET_OPEN_TAG))) {
|
|
123
|
+
token = TokenType.PunctuationTag
|
|
124
|
+
state = State.AfterOpeningAngleBracket
|
|
125
|
+
} else if ((next = part.match(RE_TEXT))) {
|
|
126
|
+
token = TokenType.Text
|
|
127
|
+
state = State.TopLevelContent
|
|
128
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
129
|
+
token = TokenType.Comment
|
|
130
|
+
state = State.InsideBlockComment
|
|
131
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
132
|
+
token = TokenType.Text
|
|
133
|
+
state = State.TopLevelContent
|
|
134
|
+
} else if ((next = part.match(RE_DOCTYPE))) {
|
|
135
|
+
token = TokenType.PunctuationTag
|
|
136
|
+
state = State.AfterOpeningAngleBracket
|
|
137
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
|
|
138
|
+
token = TokenType.Text
|
|
139
|
+
state = State.TopLevelContent
|
|
140
|
+
} else {
|
|
141
|
+
part //?
|
|
142
|
+
throw new Error('no')
|
|
143
|
+
}
|
|
144
|
+
break
|
|
145
|
+
case State.AfterOpeningAngleBracket:
|
|
146
|
+
if ((next = part.match(RE_TAGNAME))) {
|
|
147
|
+
token = TokenType.TagName
|
|
148
|
+
state = State.InsideOpeningTag
|
|
149
|
+
} else if ((next = part.match(RE_SLASH))) {
|
|
150
|
+
token = TokenType.PunctuationTag
|
|
151
|
+
state = State.AfterClosingTagAngleBrackets
|
|
152
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
153
|
+
token = TokenType.PunctuationTag
|
|
154
|
+
state = State.TopLevelContent
|
|
155
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
|
|
156
|
+
token = TokenType.PunctuationTag
|
|
157
|
+
state = State.AfterOpeningAngleBracket
|
|
158
|
+
} else if ((next = part.match(RE_ANY_TEXT))) {
|
|
159
|
+
token = TokenType.Text
|
|
160
|
+
state = State.TopLevelContent
|
|
161
|
+
} else {
|
|
162
|
+
part //?
|
|
163
|
+
throw new Error('no')
|
|
164
|
+
}
|
|
165
|
+
break
|
|
166
|
+
case State.InsideOpeningTag:
|
|
167
|
+
if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
168
|
+
token = TokenType.PunctuationTag
|
|
169
|
+
state = State.TopLevelContent
|
|
170
|
+
} else if ((next = part.match(RE_EXCLAMATION_MARK))) {
|
|
171
|
+
token = TokenType.PunctuationTag
|
|
172
|
+
state = State.InsideOpeningTag
|
|
173
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
174
|
+
token = TokenType.Whitespace
|
|
175
|
+
state = State.InsideOpeningTagAndHasSeenWhitespace
|
|
176
|
+
} else if ((next = part.match(RE_DASH_DASH))) {
|
|
177
|
+
token = TokenType.Comment
|
|
178
|
+
state = State.InsideBlockComment
|
|
179
|
+
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
180
|
+
token = TokenType.Text
|
|
181
|
+
state = State.InsideOpeningTag
|
|
182
|
+
} else {
|
|
183
|
+
part //?
|
|
184
|
+
throw new Error('no')
|
|
185
|
+
}
|
|
186
|
+
break
|
|
187
|
+
case State.AfterClosingTagAngleBrackets:
|
|
188
|
+
if ((next = part.match(RE_TAGNAME))) {
|
|
189
|
+
token = TokenType.TagName
|
|
190
|
+
state = State.AfterClosingTagName
|
|
191
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
192
|
+
token = TokenType.Whitespace
|
|
193
|
+
state = State.TopLevelContent
|
|
194
|
+
} else if ((next = part.match(RE_ANY_TEXT))) {
|
|
195
|
+
token = TokenType.Text
|
|
196
|
+
state = State.TopLevelContent
|
|
197
|
+
} else {
|
|
198
|
+
part //?
|
|
199
|
+
throw new Error('no')
|
|
200
|
+
}
|
|
201
|
+
break
|
|
202
|
+
case State.AfterClosingTagName:
|
|
203
|
+
if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
204
|
+
token = TokenType.PunctuationTag
|
|
205
|
+
state = State.TopLevelContent
|
|
206
|
+
} else if ((next = part.match(RE_TEXT))) {
|
|
207
|
+
token = TokenType.Text
|
|
208
|
+
state = State.TopLevelContent
|
|
209
|
+
} else {
|
|
210
|
+
throw new Error('no')
|
|
211
|
+
}
|
|
212
|
+
break
|
|
213
|
+
case State.InsideOpeningTagAndHasSeenWhitespace:
|
|
214
|
+
if ((next = part.match(RE_ATTRIBUTE_NAME))) {
|
|
215
|
+
token = TokenType.AttributeName
|
|
216
|
+
state = State.AfterAttributeName
|
|
217
|
+
} else if ((next = part.match(RE_SELF_CLOSING))) {
|
|
218
|
+
token = TokenType.PunctuationTag
|
|
219
|
+
state = State.TopLevelContent
|
|
220
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
221
|
+
token = TokenType.PunctuationTag
|
|
222
|
+
state = State.TopLevelContent
|
|
223
|
+
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
224
|
+
token = TokenType.Text
|
|
225
|
+
state = State.TopLevelContent
|
|
226
|
+
} else {
|
|
227
|
+
part //?
|
|
228
|
+
throw new Error('no')
|
|
229
|
+
}
|
|
230
|
+
break
|
|
231
|
+
case State.AfterAttributeName:
|
|
232
|
+
if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
233
|
+
token = TokenType.PunctuationTag
|
|
234
|
+
state = State.TopLevelContent
|
|
235
|
+
} else if ((next = part.match(RE_EQUAL_SIGN))) {
|
|
236
|
+
token = TokenType.Punctuation
|
|
237
|
+
state = State.AfterAttributeEqualSign
|
|
238
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
239
|
+
token = TokenType.PunctuationString
|
|
240
|
+
state = State.InsideDoubleQuoteString
|
|
241
|
+
} else if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
242
|
+
token = TokenType.PunctuationString
|
|
243
|
+
state = State.InsideSingleQuoteString
|
|
244
|
+
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
245
|
+
token = TokenType.Text
|
|
246
|
+
state = State.InsideOpeningTag
|
|
247
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
248
|
+
token = TokenType.Whitespace
|
|
249
|
+
state = State.InsideOpeningTagAndHasSeenWhitespace
|
|
250
|
+
} else {
|
|
251
|
+
// TODO check quotation mark
|
|
252
|
+
part //?
|
|
253
|
+
throw new Error('no')
|
|
254
|
+
}
|
|
255
|
+
break
|
|
256
|
+
case State.AfterAttributeEqualSign:
|
|
257
|
+
if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
258
|
+
token = TokenType.PunctuationString
|
|
259
|
+
state = State.InsideDoubleQuoteString
|
|
260
|
+
} else if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
261
|
+
token = TokenType.PunctuationString
|
|
262
|
+
state = State.InsideSingleQuoteString
|
|
263
|
+
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
264
|
+
token = TokenType.PunctuationTag
|
|
265
|
+
state = State.TopLevelContent
|
|
266
|
+
} else if ((next = part.match(RE_ATTRIBUTE_VALUE_UNQUOTED))) {
|
|
267
|
+
token = TokenType.String
|
|
268
|
+
state = State.InsideOpeningTag
|
|
269
|
+
} else {
|
|
270
|
+
part
|
|
271
|
+
throw new Error('no')
|
|
272
|
+
}
|
|
273
|
+
break
|
|
274
|
+
case State.InsideDoubleQuoteString:
|
|
275
|
+
if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
276
|
+
token = TokenType.PunctuationString
|
|
277
|
+
state = State.InsideOpeningTag
|
|
278
|
+
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
279
|
+
token = TokenType.String
|
|
280
|
+
state = State.InsideDoubleQuoteString
|
|
281
|
+
} else {
|
|
282
|
+
throw new Error('no')
|
|
283
|
+
}
|
|
284
|
+
break
|
|
285
|
+
case State.InsideSingleQuoteString:
|
|
286
|
+
if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
287
|
+
token = TokenType.PunctuationString
|
|
288
|
+
state = State.InsideOpeningTag
|
|
289
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
290
|
+
token = TokenType.String
|
|
291
|
+
state = State.InsideSingleQuoteString
|
|
292
|
+
} else {
|
|
293
|
+
throw new Error('no')
|
|
294
|
+
}
|
|
295
|
+
break
|
|
296
|
+
case State.InsideBlockComment:
|
|
297
|
+
part
|
|
298
|
+
if ((next = part.match(RE_BLOCK_COMMENT_CONTENT_1))) {
|
|
299
|
+
token = TokenType.Comment
|
|
300
|
+
state = State.InsideBlockComment
|
|
301
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_END))) {
|
|
302
|
+
token = TokenType.Comment
|
|
303
|
+
state = State.TopLevelContent
|
|
304
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_CONTENT_2))) {
|
|
305
|
+
token = TokenType.Comment
|
|
306
|
+
state = State.InsideBlockComment
|
|
307
|
+
} else {
|
|
308
|
+
throw new Error('no')
|
|
309
|
+
}
|
|
310
|
+
break
|
|
311
|
+
default:
|
|
312
|
+
state
|
|
313
|
+
throw new Error('no')
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const tokenLength = next[0].length
|
|
317
|
+
index += tokenLength
|
|
318
|
+
tokens.push(token, tokenLength)
|
|
319
|
+
}
|
|
320
|
+
if (state === State.AfterClosingTagAngleBrackets) {
|
|
321
|
+
state = State.TopLevelContent
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
state,
|
|
325
|
+
tokens,
|
|
326
|
+
}
|
|
327
|
+
}
|
|
@@ -74,7 +74,8 @@ const RE_SEMICOLON = /^;/
|
|
|
74
74
|
const RE_COMMA = /^,/
|
|
75
75
|
const RE_ANYTHING = /^.+/s
|
|
76
76
|
const RE_ANYTHING_BUT_COMMENT = /^[^#]+/
|
|
77
|
-
const RE_NUMERIC =
|
|
77
|
+
const RE_NUMERIC =
|
|
78
|
+
/^\-?(([0-9]+\.?[0-9]*)|(\.[0-9]+))(?=\s*$|\s+#|\s*[\[\]\{\}])/
|
|
78
79
|
const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
|
|
79
80
|
const RE_BLOCK_COMMENT_START = /^\/\*/
|
|
80
81
|
const RE_BLOCK_COMMENT_END = /^\*\//
|
|
@@ -172,6 +172,22 @@
|
|
|
172
172
|
{
|
|
173
173
|
"name": "KeywordThis",
|
|
174
174
|
"foreground": "#E06C75"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "KeywordFunction",
|
|
178
|
+
"foreground": "#C678DD"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "MarkdownLinkName",
|
|
182
|
+
"foreground": "#61AFEF"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"name": "MarkdownLinkUrl",
|
|
186
|
+
"foreground": "#C678DD"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "MarkdownString",
|
|
190
|
+
"foreground": "#ABB2BF"
|
|
175
191
|
}
|
|
176
192
|
]
|
|
177
193
|
}
|
|
@@ -65,7 +65,8 @@
|
|
|
65
65
|
"TitleBarColorInactive": "",
|
|
66
66
|
"TitleBarItemHoverForeground": "rgba(0, 0, 0, 0.1)",
|
|
67
67
|
|
|
68
|
-
"TreeItemForeground": "#8a9199"
|
|
68
|
+
"TreeItemForeground": "#8a9199",
|
|
69
|
+
"TreeItemActiveBackground": "rgba(86, 114, 143, 0.12)"
|
|
69
70
|
},
|
|
70
71
|
"tokenColors": [
|
|
71
72
|
{
|
|
@@ -183,6 +184,14 @@
|
|
|
183
184
|
{
|
|
184
185
|
"name": "KeywordThis",
|
|
185
186
|
"foreground": "#55B4D4"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "MarkdownLinkName",
|
|
190
|
+
"foreground": "#55B4D4"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"name": "MarkdownLinkUrl",
|
|
194
|
+
"foreground": "#55B4D4"
|
|
186
195
|
}
|
|
187
196
|
]
|
|
188
197
|
}
|
|
@@ -155,6 +155,22 @@
|
|
|
155
155
|
{
|
|
156
156
|
"name": "KeywordOperator",
|
|
157
157
|
"foreground": "#FF9D00"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"name": "KeywordFunction",
|
|
161
|
+
"foreground": "#FB94FF"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "MarkdownLinkName",
|
|
165
|
+
"foreground": "#A5FF90"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "MarkdownLinkUrl",
|
|
169
|
+
"foreground": "#9EFFFF"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"name": "Heading",
|
|
173
|
+
"foreground": "#FFC600"
|
|
158
174
|
}
|
|
159
175
|
]
|
|
160
176
|
}
|
|
@@ -192,6 +192,22 @@
|
|
|
192
192
|
{
|
|
193
193
|
"name": "KeywordThis",
|
|
194
194
|
"foreground": "#D3869B"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"name": "KeywordFunction",
|
|
198
|
+
"foreground": "#EA6962"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"name": "MarkdownLinkName",
|
|
202
|
+
"foreground": "#D3869B"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "MarkdownLinkUrl",
|
|
206
|
+
"foreground": "#A9B665"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"name": "MarkdownString",
|
|
210
|
+
"foreground": "#A9B665"
|
|
195
211
|
}
|
|
196
212
|
]
|
|
197
213
|
}
|
|
@@ -179,6 +179,26 @@
|
|
|
179
179
|
{
|
|
180
180
|
"name": "KeywordThis",
|
|
181
181
|
"foreground": "#E66533"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "KeywordFunction",
|
|
185
|
+
"foreground": "#E66533"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "MarkdownLinkName",
|
|
189
|
+
"foreground": "#16A3B6"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "MarkdownLinkUrl",
|
|
193
|
+
"foreground": "#49D6E9"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"name": "Heading",
|
|
197
|
+
"foreground": "#DF769B"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "KeywordImport",
|
|
201
|
+
"foreground": "#DF769B"
|
|
182
202
|
}
|
|
183
203
|
]
|
|
184
204
|
}
|
|
@@ -238,6 +238,22 @@
|
|
|
238
238
|
{
|
|
239
239
|
"name": "KeywordOperator",
|
|
240
240
|
"foreground": "#B4B4B4"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"name": "MarkdownString",
|
|
244
|
+
"foreground": "#C6DD88"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"name": "KeywordFunction",
|
|
248
|
+
"foreground": "#D88F56"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"name": "MarkdownLinkName",
|
|
252
|
+
"foreground": "#BF616A"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"name": "MarkdownLinkUrl",
|
|
256
|
+
"foreground": "#B2885F"
|
|
241
257
|
}
|
|
242
258
|
]
|
|
243
259
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lvce-editor/shared-process",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Utility package for @lvce-editor/server",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@babel/code-frame": "^7.18.6",
|
|
20
|
-
"@lvce-editor/extension-host": "0.
|
|
21
|
-
"@lvce-editor/extension-host-helper-process": "0.
|
|
22
|
-
"@lvce-editor/pty-host": "0.
|
|
20
|
+
"@lvce-editor/extension-host": "0.12.0",
|
|
21
|
+
"@lvce-editor/extension-host-helper-process": "0.12.0",
|
|
22
|
+
"@lvce-editor/pty-host": "0.12.0",
|
|
23
23
|
"debug": "^4.3.4",
|
|
24
24
|
"execa": "^6.1.0",
|
|
25
|
-
"exit-hook": "^3.
|
|
25
|
+
"exit-hook": "^3.2.0",
|
|
26
26
|
"got": "^12.5.3",
|
|
27
27
|
"is-object": "^1.0.2",
|
|
28
28
|
"lines-and-columns": "^2.0.3",
|
|
29
29
|
"open": "^8.4.0",
|
|
30
30
|
"p-queue": "^7.3.0",
|
|
31
31
|
"parse-json": "^6.0.2",
|
|
32
|
-
"tail": "^2.2.
|
|
32
|
+
"tail": "^2.2.6",
|
|
33
33
|
"tar-fs": "^2.1.1",
|
|
34
34
|
"tmp-promise": "^3.0.3",
|
|
35
35
|
"trash": "^8.1.0",
|
|
@@ -171,7 +171,6 @@ const toPrettyDirent = (dirent) => {
|
|
|
171
171
|
export const readDirWithFileTypes = async (path) => {
|
|
172
172
|
try {
|
|
173
173
|
const dirents = await fs.readdir(path, { withFileTypes: true })
|
|
174
|
-
console.log({ dirents: dirents.filter((x) => getType(x) === DirentType.Unknown) })
|
|
175
174
|
const prettyDirents = dirents.map(toPrettyDirent)
|
|
176
175
|
return prettyDirents
|
|
177
176
|
} catch (error) {
|