@lvce-editor/shared-process 0.11.12 → 0.12.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 (115) hide show
  1. package/config/defaultKeyBindings.json +5 -0
  2. package/config/defaultSettings.json +4 -0
  3. package/config/fileMap.json +1 -2
  4. package/extensions/builtin.language-basics-css/README.md +2 -0
  5. package/extensions/builtin.language-basics-css/src/tokenizeCss.js +7 -0
  6. package/extensions/builtin.language-basics-dotenv/extension.json +7 -1
  7. package/extensions/builtin.language-basics-graphql/extension.json +1 -1
  8. package/extensions/builtin.language-basics-graphql/src/tokenizeGraphql.js +408 -4
  9. package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +99 -4
  10. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +61 -2
  11. package/extensions/builtin.language-basics-json/extension.json +6 -1
  12. package/extensions/builtin.language-basics-json/src/tokenizeJson.js +27 -0
  13. package/extensions/builtin.language-basics-jsx/README.md +14 -0
  14. package/extensions/builtin.language-basics-jsx/extension.json +13 -0
  15. package/extensions/builtin.language-basics-jsx/src/tokenizeJsx.js +648 -0
  16. package/extensions/builtin.language-basics-julia/src/tokenizeJulia.js +52 -1
  17. package/extensions/builtin.language-basics-markdown/src/tokenizeMarkdown.js +105 -2
  18. package/extensions/builtin.language-basics-mdx/README.md +14 -0
  19. package/extensions/builtin.language-basics-mdx/extension.json +12 -0
  20. package/extensions/builtin.language-basics-mdx/src/tokenizeMdx.js +395 -0
  21. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +38 -15
  22. package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +29 -1
  23. package/extensions/builtin.language-basics-typescript/extension.json +1 -1
  24. package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +177 -11
  25. package/extensions/builtin.language-basics-vue/README.md +14 -0
  26. package/extensions/builtin.language-basics-vue/extension.json +13 -0
  27. package/extensions/builtin.language-basics-vue/src/tokenizeVue.js +327 -0
  28. package/extensions/builtin.language-basics-xml/extension.json +3 -2
  29. package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +26 -3
  30. package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +9 -2
  31. package/extensions/builtin.theme-atom-one-dark/color-theme.json +20 -0
  32. package/extensions/builtin.theme-ayu/color-theme.json +10 -1
  33. package/extensions/builtin.theme-cobalt2/color-theme.json +20 -0
  34. package/extensions/builtin.theme-gruvbox/color-theme.json +20 -0
  35. package/extensions/builtin.theme-noctis-uva/color-theme.json +20 -0
  36. package/extensions/builtin.theme-palenight/color-theme.json +8 -0
  37. package/extensions/builtin.theme-slime/color-theme.json +16 -0
  38. package/extensions/builtin.vscode-icons/icon-theme.json +40 -2
  39. package/extensions/builtin.vscode-icons/icons/file_type_bazel_ignore.svg +1 -0
  40. package/extensions/builtin.vscode-icons/icons/file_type_bazel_version.svg +1 -0
  41. package/extensions/builtin.vscode-icons/icons/file_type_eleventy.svg +1 -0
  42. package/extensions/builtin.vscode-icons/icons/file_type_eleventy2.svg +1 -0
  43. package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy.svg +1 -0
  44. package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy2.svg +1 -0
  45. package/extensions/builtin.vscode-icons/icons/file_type_light_rome.svg +1 -0
  46. package/extensions/builtin.vscode-icons/icons/file_type_light_tree.svg +1 -0
  47. package/extensions/builtin.vscode-icons/icons/file_type_mondoo.svg +1 -0
  48. package/extensions/builtin.vscode-icons/icons/file_type_nuxt.svg +1 -1
  49. package/extensions/builtin.vscode-icons/icons/file_type_rome.svg +1 -0
  50. package/extensions/builtin.vscode-icons/icons/file_type_sapphire_framework_cli.svg +1 -0
  51. package/extensions/builtin.vscode-icons/icons/file_type_shellcheck.svg +91 -0
  52. package/extensions/builtin.vscode-icons/icons/file_type_shuttle.svg +1 -0
  53. package/extensions/builtin.vscode-icons/icons/file_type_tree.svg +1 -0
  54. package/extensions/builtin.vscode-icons/icons/folder_type_nuxt.svg +1 -1
  55. package/extensions/builtin.vscode-icons/icons/folder_type_nuxt_opened.svg +1 -1
  56. package/package.json +9 -8
  57. package/src/parts/CleanStack/CleanStack.js +5 -0
  58. package/src/parts/Cli/Cli.js +5 -4
  59. package/src/parts/CliCommandType/CliCommandType.js +10 -0
  60. package/src/parts/CliInstall/CliInstall.js +3 -2
  61. package/src/parts/CliLink/CliLink.js +3 -2
  62. package/src/parts/CliList/CliList.js +3 -1
  63. package/src/parts/ClipBoard/ClipBoard.js +3 -2
  64. package/src/parts/ClipBoard/ClipBoardGnome.js +15 -31
  65. package/src/parts/CommandNotFoundError/CommandNotFoundError.js +9 -0
  66. package/src/parts/DesktopType/DesktopType.js +3 -0
  67. package/src/parts/Download/Download.js +1 -1
  68. package/src/parts/DownloadAndExtract/DownloadAndExtract.js +2 -2
  69. package/src/parts/Error/FileSystemError.js +1 -1
  70. package/src/parts/ErrorCodes/ErrorCodes.js +2 -0
  71. package/src/parts/ErrorHandling/ErrorHandling.js +4 -3
  72. package/src/parts/ExecCommand/ExecCommand.js +25 -0
  73. package/src/parts/ExecPromise/ExecPromise.js +4 -0
  74. package/src/parts/ExitCode/ExitCode.js +5 -0
  75. package/src/parts/ExportStatic/ExportStatic.js +2 -2
  76. package/src/parts/ExtensionHost/ExtensionHost.ipc.js +0 -1
  77. package/src/parts/ExtensionHost/ExtensionHost.js +1 -1
  78. package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithChildProcess.js +3 -8
  79. package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithWorker.js +3 -7
  80. package/src/parts/ExtensionInstallFromFile/ExtensionInstallFromFile.js +2 -5
  81. package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -1
  82. package/src/parts/ExtensionInstallFromUrl/ExtensionInstallFromUrl.js +3 -3
  83. package/src/parts/ExtensionLink/ExtensionLink.js +19 -0
  84. package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +1 -1
  85. package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -2
  86. package/src/parts/ExtensionManagement/ExtensionManagementLanguages.js +7 -14
  87. package/src/parts/ExtensionManifest/ExtensionManifest.js +14 -4
  88. package/src/parts/ExtractZip/ExtractZip.js +1 -1
  89. package/src/parts/FileSystem/FileSystem.js +0 -1
  90. package/src/parts/GetResponse/GetResponse.js +2 -1
  91. package/src/parts/GitLsFiles/GitLsFiles.ipc.js +2 -0
  92. package/src/parts/GitLsFiles/GitLsFiles.js +21 -5
  93. package/src/parts/Hash/Hash.js +7 -0
  94. package/src/parts/IpcChild/IpcChild.js +6 -0
  95. package/src/parts/IpcChildModule/IpcChildModule.js +12 -0
  96. package/src/parts/IpcChildType/IpcChildType.js +13 -0
  97. package/src/parts/IpcChildWithNodeForkedProcess/IpcChildWithNodeForkedProcess.js +19 -0
  98. package/src/parts/IpcChildWithNodeWorker/IpcChildWithNodeWorker.js +27 -0
  99. package/src/parts/MergeStacks/MergeStacks.js +19 -0
  100. package/src/parts/ModuleMap/ModuleMap.js +4 -1
  101. package/src/parts/NormalizeErrorLine/NormalizeErrorLine.js +9 -0
  102. package/src/parts/OutputChannel/OutputChannel.ipc.js +1 -1
  103. package/src/parts/ParentIpc/ParentIpc.js +6 -10
  104. package/src/parts/ParseInt/ParseInt.js +3 -0
  105. package/src/parts/Platform/Platform.js +16 -21
  106. package/src/parts/Preferences/Preferences.js +2 -1
  107. package/src/parts/PrettyError/PrettyError.js +12 -23
  108. package/src/parts/PrintPrettyError/PrintPrettyError.js +3 -0
  109. package/src/parts/Process/Process.js +2 -2
  110. package/src/parts/ProtocolType/ProtocolType.js +3 -0
  111. package/src/parts/RecentlyOpened/RecentlyOpened.js +1 -1
  112. package/src/parts/Stats/Stats.js +8 -11
  113. package/src/parts/SymLink/SymLink.js +2 -14
  114. package/src/parts/TextDocument/TextDocument.js +3 -1
  115. package/src/parts/VError/VError.js +5 -22
@@ -15,6 +15,8 @@ const State = {
15
15
  None: 11,
16
16
  InsideDoubleQuoteString: 12,
17
17
  InsideSingleQuoteString: 13,
18
+ InsideScriptContent: 14,
19
+ InsideStyleContent: 15,
18
20
  }
19
21
 
20
22
  export const StateMap = {}
@@ -36,6 +38,7 @@ export const TokenType = {
36
38
  Error: 141,
37
39
  PunctuationString: 11,
38
40
  NewLine: 891,
41
+ Embedded: 999,
39
42
  }
40
43
 
41
44
  export const TokenMap = {
@@ -51,18 +54,20 @@ export const TokenMap = {
51
54
  [TokenType.Punctuation]: 'Punctuation',
52
55
  [TokenType.Error]: 'Error',
53
56
  [TokenType.PunctuationString]: 'PunctuationString',
57
+ [TokenType.Embedded]: 'Embedded',
54
58
  }
55
59
 
56
60
  const RE_ANGLE_BRACKET_CLOSE = /^>/
57
61
  const RE_ANGLE_BRACKET_ONLY = /^</
58
62
  const RE_ANGLE_BRACKET_OPEN = /^</
59
- const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?!\s)/
63
+ const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!\%])/
60
64
  const RE_ANY_TEXT = /^[^\n]+/
61
- const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-]+/
65
+ const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
62
66
  const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
63
67
  const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
64
68
  const RE_BLOCK_COMMENT_END = /^-->/
65
69
  const RE_BLOCK_COMMENT_START = /^<!--/
70
+ const RE_DOCTYPE = /^<!(?=\w)/
66
71
  const RE_DASH_DASH = /^\-\-/
67
72
  const RE_DOUBLE_QUOTE = /^"/
68
73
  const RE_EQUAL_SIGN = /^=/
@@ -80,14 +85,24 @@ const RE_SLASH = /^\//
80
85
  const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
81
86
  const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
82
87
  const RE_TAG_TEXT = /^[^\s>]+/
83
- const RE_TAGNAME = /^[!\w]+/
88
+ const RE_TAGNAME = /^[!\w\:]+/
84
89
  const RE_TEXT = /^[^<>\n]+/
85
90
  const RE_WHITESPACE = /^\s+/
86
91
  const RE_WORD = /^[^\s]+/
87
- const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[^<>]+/
92
+ const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[^<>\s]+/
93
+ const RE_SCRIPT_CONTENT = /^..*?(?=(?:<\/script)|$)/s
94
+ const RE_SCRIPT_CONTENT_END = /^<\/script/
95
+ const RE_STYLE_CONTENT = /^..*?(?=(?:<\/style)|$)/s
96
+ const RE_STYLE_CONTENT_END = /^<\/style/
88
97
 
89
98
  export const initialLineState = {
90
99
  state: State.TopLevelContent,
100
+ tag: '',
101
+ stack: [],
102
+ embeddedLanguage: '',
103
+ embeddedLanguageStart: 0,
104
+ embeddedLanguageEnd: 0,
105
+ embeddedState: undefined,
91
106
  }
92
107
 
93
108
  /**
@@ -102,6 +117,14 @@ export const isLineStateEqual = (lineStateA, lineStateB) => {
102
117
 
103
118
  export const hasArrayReturn = true
104
119
 
120
+ const getEmbeddedScriptLanguageId = () => {
121
+ return 'javascript'
122
+ }
123
+
124
+ const getEmbeddedStyleLanguageId = () => {
125
+ return 'css'
126
+ }
127
+
105
128
  /**
106
129
  *
107
130
  * @param {string} line
@@ -114,6 +137,10 @@ export const tokenizeLine = (line, lineState) => {
114
137
  let tokens = []
115
138
  let token = TokenType.None
116
139
  let state = lineState.state
140
+ let tag = lineState.tag
141
+ let embeddedLanguage = lineState.embeddedLanguage
142
+ let embeddedLanguageStart = lineState.embeddedLanguageStart
143
+ let embeddedLanguageEnd = lineState.embeddedLanguageEnd
117
144
  while (index < line.length) {
118
145
  const part = line.slice(index)
119
146
  switch (state) {
@@ -124,9 +151,15 @@ export const tokenizeLine = (line, lineState) => {
124
151
  } else if ((next = part.match(RE_TEXT))) {
125
152
  token = TokenType.Text
126
153
  state = State.TopLevelContent
154
+ } else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
155
+ token = TokenType.Comment
156
+ state = State.InsideBlockComment
127
157
  } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
128
158
  token = TokenType.Text
129
159
  state = State.TopLevelContent
160
+ } else if ((next = part.match(RE_DOCTYPE))) {
161
+ token = TokenType.PunctuationTag
162
+ state = State.AfterOpeningAngleBracket
130
163
  } else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
131
164
  token = TokenType.Text
132
165
  state = State.TopLevelContent
@@ -139,6 +172,7 @@ export const tokenizeLine = (line, lineState) => {
139
172
  if ((next = part.match(RE_TAGNAME))) {
140
173
  token = TokenType.TagName
141
174
  state = State.InsideOpeningTag
175
+ tag = next[0]
142
176
  } else if ((next = part.match(RE_SLASH))) {
143
177
  token = TokenType.PunctuationTag
144
178
  state = State.AfterClosingTagAngleBrackets
@@ -160,6 +194,19 @@ export const tokenizeLine = (line, lineState) => {
160
194
  if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
161
195
  token = TokenType.PunctuationTag
162
196
  state = State.TopLevelContent
197
+ switch (tag) {
198
+ case 'script':
199
+ state = State.InsideScriptContent
200
+ embeddedLanguage = getEmbeddedScriptLanguageId()
201
+ embeddedLanguageStart = index + next[0].length
202
+ break
203
+ case 'style':
204
+ state = State.InsideStyleContent
205
+ embeddedLanguage = getEmbeddedStyleLanguageId()
206
+ embeddedLanguageStart = index + next[0].length
207
+ default:
208
+ break
209
+ }
163
210
  } else if ((next = part.match(RE_EXCLAMATION_MARK))) {
164
211
  token = TokenType.PunctuationTag
165
212
  state = State.InsideOpeningTag
@@ -169,6 +216,9 @@ export const tokenizeLine = (line, lineState) => {
169
216
  } else if ((next = part.match(RE_DASH_DASH))) {
170
217
  token = TokenType.Comment
171
218
  state = State.InsideBlockComment
219
+ } else if ((next = part.match(RE_PUNCTUATION_SELF_CLOSING))) {
220
+ token = TokenType.PunctuationTag
221
+ state = State.TopLevelContent
172
222
  } else if ((next = part.match(RE_TAG_TEXT))) {
173
223
  token = TokenType.Text
174
224
  state = State.InsideOpeningTag
@@ -213,6 +263,10 @@ export const tokenizeLine = (line, lineState) => {
213
263
  } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
214
264
  token = TokenType.PunctuationTag
215
265
  state = State.TopLevelContent
266
+ if (tag === 'script') {
267
+ state = State.InsideScriptContent
268
+ embeddedLanguage = 'javascript'
269
+ }
216
270
  } else if ((next = part.match(RE_TAG_TEXT))) {
217
271
  token = TokenType.Text
218
272
  state = State.TopLevelContent
@@ -301,6 +355,43 @@ export const tokenizeLine = (line, lineState) => {
301
355
  throw new Error('no')
302
356
  }
303
357
  break
358
+ case State.InsideScriptContent:
359
+ if ((next = part.match(RE_SCRIPT_CONTENT_END))) {
360
+ token = TokenType.TagName
361
+ state = State.AfterClosingTagName
362
+ tokens.push(TokenType.PunctuationTag, 2, TokenType.TagName, 6)
363
+ index += next[0].length
364
+ embeddedLanguage = ''
365
+ continue
366
+ } else if ((next = part.match(RE_SCRIPT_CONTENT))) {
367
+ token = TokenType.Embedded
368
+ state = State.InsideScriptContent
369
+ embeddedLanguageStart = index
370
+ embeddedLanguageEnd = index + next[0].length
371
+ } else {
372
+ part
373
+ throw new Error('no')
374
+ }
375
+ break
376
+ case State.InsideStyleContent:
377
+ if ((next = part.match(RE_STYLE_CONTENT_END))) {
378
+ token = TokenType.TagName
379
+ state = State.AfterClosingTagName
380
+ tokens.push(TokenType.PunctuationTag, 2, TokenType.TagName, 6)
381
+ embeddedLanguageEnd = index
382
+ index += next[0].length
383
+ embeddedLanguage = ''
384
+ continue
385
+ } else if ((next = part.match(RE_STYLE_CONTENT))) {
386
+ token = TokenType.Embedded
387
+ state = State.InsideStyleContent
388
+ embeddedLanguageStart = index
389
+ embeddedLanguageEnd = index + next[0].length
390
+ } else {
391
+ part
392
+ throw new Error('no')
393
+ }
394
+ break
304
395
  default:
305
396
  state
306
397
  throw new Error('no')
@@ -316,5 +407,9 @@ export const tokenizeLine = (line, lineState) => {
316
407
  return {
317
408
  state,
318
409
  tokens,
410
+ tag,
411
+ embeddedLanguage,
412
+ embeddedLanguageStart,
413
+ embeddedLanguageEnd,
319
414
  }
320
415
  }
@@ -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
@@ -215,10 +238,19 @@ export const tokenizeLine = (line, lineState) => {
215
238
  } else if ((next = part.match(RE_NUMERIC))) {
216
239
  token = TokenType.Numeric
217
240
  state = State.TopLevelContent
241
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
242
+ token = TokenType.Punctuation
243
+ state = stack.pop() || State.TopLevelContent
244
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
245
+ token = TokenType.Punctuation
246
+ stack.push(State.TopLevelContent)
247
+ state = State.TopLevelContent
218
248
  } else if ((next = part.match(RE_PUNCTUATION))) {
219
249
  token = TokenType.Punctuation
220
250
  if (next[0] === '.') {
221
251
  state = State.AfterPropertyDot
252
+ } else if (next[0] === '}') {
253
+ state = stack.pop() || State.TopLevelContent
222
254
  } else {
223
255
  state = State.TopLevelContent
224
256
  }
@@ -258,6 +290,9 @@ export const tokenizeLine = (line, lineState) => {
258
290
  } else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL))) {
259
291
  token = TokenType.VariableName
260
292
  state = State.TopLevelContent
293
+ } else if ((next = part.match(RE_ANYTHING))) {
294
+ token = TokenType.Text
295
+ state = State.TopLevelContent
261
296
  } else {
262
297
  throw new Error('no')
263
298
  }
@@ -306,7 +341,11 @@ export const tokenizeLine = (line, lineState) => {
306
341
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
307
342
  token = TokenType.String
308
343
  state = State.InsideSingleQuoteString
344
+ } else if ((next = part.match(RE_BACKSLASH))) {
345
+ token = TokenType.String
346
+ state = State.InsideSingleQuoteString
309
347
  } else {
348
+ part
310
349
  throw new Error('no')
311
350
  }
312
351
  break
@@ -320,6 +359,9 @@ export const tokenizeLine = (line, lineState) => {
320
359
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
321
360
  token = TokenType.String
322
361
  state = State.InsideDoubleQuoteString
362
+ } else if ((next = part.match(RE_BACKSLASH))) {
363
+ token = TokenType.String
364
+ state = State.InsideDoubleQuoteString
323
365
  } else {
324
366
  throw new Error('no')
325
367
  }
@@ -331,9 +373,19 @@ export const tokenizeLine = (line, lineState) => {
331
373
  } else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
332
374
  token = TokenType.String
333
375
  state = State.InsideBacktickString
376
+ } else if ((next = part.match(RE_DOLLAR_CURLY_OPEN))) {
377
+ token = TokenType.Punctuation
378
+ state = State.TopLevelContent
379
+ stack.push(State.InsideBacktickString)
334
380
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
335
381
  token = TokenType.String
336
382
  state = State.InsideBacktickString
383
+ } else if ((next = part.match(RE_BACKSLASH))) {
384
+ token = TokenType.String
385
+ state = State.InsideDoubleQuoteString
386
+ } else if ((next = part.match(RE_DOLLAR))) {
387
+ token = TokenType.String
388
+ state = State.InsideBacktickString
337
389
  } else {
338
390
  throw new Error('no')
339
391
  }
@@ -357,6 +409,9 @@ export const tokenizeLine = (line, lineState) => {
357
409
  } else if ((next = part.match(RE_PUNCTUATION))) {
358
410
  token = TokenType.Punctuation
359
411
  state = State.TopLevelContent
412
+ } else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL_2))) {
413
+ token = TokenType.VariableName
414
+ state = State.TopLevelContent
360
415
  } else {
361
416
  throw new Error('no')
362
417
  }
@@ -372,8 +427,12 @@ export const tokenizeLine = (line, lineState) => {
372
427
  if (state === State.InsideLineComment) {
373
428
  state = State.TopLevelContent
374
429
  }
430
+ if (state === State.InsideSingleQuoteString && !line.endsWith('\\')) {
431
+ state = State.TopLevelContent
432
+ }
375
433
  return {
376
434
  state,
377
435
  tokens,
436
+ stack,
378
437
  }
379
438
  }
@@ -43,7 +43,12 @@
43
43
  ".publishrc",
44
44
  ".whitesource",
45
45
  ".mention-bot",
46
- "pdfjs.config"
46
+ "pdfjs.config",
47
+ "tsconfig.tsbuildinfo",
48
+ ".gdntsa",
49
+ ".nycrc",
50
+ "manifest.webapp",
51
+ ".alexrc"
47
52
  ],
48
53
  "tokenize": "src/tokenizeJson.js"
49
54
  }
@@ -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')
@@ -0,0 +1,14 @@
1
+ # Language Basics Jsx
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-jsx.git &&
7
+ cd language-basics-jsx &&
8
+ npm ci &&
9
+ npm test
10
+ ```
11
+
12
+ ## Gitpod
13
+
14
+ [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/lvce-editor/language-basics-jsx)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-jsx",
3
+ "name": "Language Basics Jsx",
4
+ "description": "Provides syntax highlighting and bracket matching in Jsx files.",
5
+ "languages": [
6
+ {
7
+ "id": "jsx",
8
+ "extensions": [".jsx"],
9
+ "tokenize": "src/tokenizeJsx.js",
10
+ "configuration": "./languageConfiguration.json"
11
+ }
12
+ ]
13
+ }