chore: import upstream snapshot with attribution
Basic checks / Compilation, Unit and Integration Tests (push) Has been cancelled
Basic checks / Hygiene and Layering (push) Has been cancelled
Basic checks / Warm up node modules cache (push) Has been cancelled
Check Format and Lint / lint-and-format (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 12:36:35 +08:00
commit fdedcf53bb
7835 changed files with 2504928 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
test/**
src/**/*.ts
syntaxes/Readme.md
tsconfig.json
cgmanifest.json
+45
View File
@@ -0,0 +1,45 @@
{
"registrations": [
{
"component": {
"type": "git",
"git": {
"name": "microsoft/TypeScript-TmLanguage",
"repositoryUrl": "https://github.com/microsoft/TypeScript-TmLanguage",
"commitHash": "3133e3d914db9a2bb8812119f9273727a305f16b"
}
},
"license": "MIT",
"version": "0.0.1",
"description": "The file syntaxes/JavaScript.tmLanguage.json was derived from TypeScriptReact.tmLanguage in https://github.com/microsoft/TypeScript-TmLanguage."
},
{
"component": {
"type": "git",
"git": {
"name": "textmate/javascript.tmbundle",
"repositoryUrl": "https://github.com/textmate/javascript.tmbundle",
"commitHash": "fccf0af0c95430a42e1bf98f0c7a4723a53283e7"
}
},
"licenseDetail": [
"Copyright (c) textmate-javascript.tmbundle project authors",
"",
"If not otherwise specified (see below), files in this repository fall under the following license:",
"",
"Permission to copy, use, modify, sell and distribute this",
"software is granted. This software is provided \"as is\" without",
"express or implied warranty, and with no claim as to its",
"suitability for any purpose.",
"",
"An exception is made for files in readable text which contain their own license information,",
"or files where an accompanying file exists (in the same directory) with a \"-license\" suffix added",
"to the base-name name of the original file, and an extension of txt, html, or similar. For example",
"\"tidy\" is accompanied by \"tidy-license.txt\"."
],
"license": "TextMate Bundle License",
"version": "0.0.0"
}
],
"version": 1
}
@@ -0,0 +1,245 @@
{
// Note that this file should stay in sync with 'typescript-language-basics/language-configuration.json'
"comments": {
"lineComment": "//",
"blockComment": [
"/*",
"*/"
]
},
"brackets": [
[
"${",
"}"
],
[
"{",
"}"
],
[
"[",
"]"
],
[
"(",
")"
]
],
"autoClosingPairs": [
{
"open": "{",
"close": "}"
},
{
"open": "[",
"close": "]"
},
{
"open": "(",
"close": ")"
},
{
"open": "'",
"close": "'",
"notIn": [
"string",
"comment"
]
},
{
"open": "\"",
"close": "\"",
"notIn": [
"string"
]
},
{
"open": "`",
"close": "`",
"notIn": [
"string",
"comment"
]
},
{
"open": "/**",
"close": " */",
"notIn": [
"string"
]
}
],
"surroundingPairs": [
[
"{",
"}"
],
[
"[",
"]"
],
[
"(",
")"
],
[
"'",
"'"
],
[
"\"",
"\""
],
[
"`",
"`"
],
[
"<",
">"
]
],
"autoCloseBefore": ";:.,=}])>` \n\t",
"folding": {
"markers": {
"start": "^\\s*//\\s*#?region\\b",
"end": "^\\s*//\\s*#?endregion\\b"
}
},
"wordPattern": {
"pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\@\\!\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)",
},
"indentationRules": {
"decreaseIndentPattern": {
"pattern": "^\\s*[\\}\\]\\)].*$"
},
"increaseIndentPattern": {
"pattern": "^.*(\\{[^}]*|\\([^)]*|\\[[^\\]]*)$"
},
// e.g. * ...| or */| or *-----*/|
"unIndentedLinePattern": {
"pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$|^(\\t|[ ])*[ ]\\*/\\s*$|^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$"
},
"indentNextLinePattern": {
"pattern": "^((.*=>\\s*)|((.*[^\\w]+|\\s*)(if|while|for)\\s*\\(.*\\)\\s*))$"
}
},
"onEnterRules": [
{
// e.g. /** | */
"beforeText": {
"pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$"
},
"afterText": {
"pattern": "^\\s*\\*/$"
},
"action": {
"indent": "indentOutdent",
"appendText": " * "
}
},
{
// e.g. /** ...|
"beforeText": {
"pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$"
},
"action": {
"indent": "none",
"appendText": " * "
}
},
{
// e.g. * ...|
"beforeText": {
"pattern": "^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$"
},
"previousLineText": {
"pattern": "(?=^(\\s*(/\\*\\*|\\*)).*)(?=(?!(\\s*\\*/)))"
},
"action": {
"indent": "none",
"appendText": "* "
}
},
{
// e.g. */|
"beforeText": {
"pattern": "^(\\t|[ ])*[ ]\\*/\\s*$"
},
"action": {
"indent": "none",
"removeText": 1
},
},
{
// e.g. *-----*/|
"beforeText": {
"pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$"
},
"action": {
"indent": "none",
"removeText": 1
},
},
{
"beforeText": {
"pattern": "^\\s*(\\bcase\\s.+:|\\bdefault:)$"
},
"afterText": {
"pattern": "^(?!\\s*(\\bcase\\b|\\bdefault\\b))"
},
"action": {
"indent": "indent"
}
},
{
// Decrease indentation after single line if/else if/else, for, or while
"previousLineText": "^\\s*(((else ?)?if|for|while)\\s*\\(.*\\)\\s*|else\\s*)$",
// But make sure line doesn't have braces or is not another if statement
"beforeText": "^\\s+([^{i\\s]|i(?!f\\b))",
"action": {
"indent": "outdent"
}
},
// Indent when pressing enter from inside ()
{
"beforeText": "^.*\\([^\\)]*$",
"afterText": "^\\s*\\).*$",
"action": {
"indent": "indentOutdent",
"appendText": "\t",
}
},
// Indent when pressing enter from inside {}
{
"beforeText": "^.*\\{[^\\}]*$",
"afterText": "^\\s*\\}.*$",
"action": {
"indent": "indentOutdent",
"appendText": "\t",
}
},
// Indent when pressing enter from inside []
{
"beforeText": "^.*\\[[^\\]]*$",
"afterText": "^\\s*\\].*$",
"action": {
"indent": "indentOutdent",
"appendText": "\t",
}
},
// Add // when pressing enter from inside line comment
{
"beforeText": {
"pattern": "\/\/.*"
},
"afterText": {
"pattern": "^(?!\\s*$).+"
},
"action": {
"indent": "none",
"appendText": "// "
}
},
]
}
+181
View File
@@ -0,0 +1,181 @@
{
"name": "javascript",
"displayName": "%displayName%",
"description": "%description%",
"version": "1.0.0",
"publisher": "vscode",
"license": "MIT",
"engines": {
"vscode": "0.10.x"
},
"categories": ["Programming Languages"],
"contributes": {
"configurationDefaults": {
"[javascript]": {
"editor.maxTokenizationLineLength": 2500
}
},
"languages": [
{
"id": "javascriptreact",
"aliases": [
"JavaScript JSX",
"JavaScript React",
"jsx"
],
"extensions": [
".jsx"
],
"configuration": "./javascript-language-configuration.json"
},
{
"id": "javascript",
"aliases": [
"JavaScript",
"javascript",
"js"
],
"extensions": [
".js",
".es6",
".mjs",
".cjs",
".pac"
],
"filenames": [
"jakefile"
],
"firstLine": "^#!.*\\bnode",
"mimetypes": [
"text/javascript"
],
"configuration": "./javascript-language-configuration.json"
},
{
"id": "jsx-tags",
"aliases": [],
"configuration": "./tags-language-configuration.json"
}
],
"grammars": [
{
"language": "javascriptreact",
"scopeName": "source.js.jsx",
"path": "./syntaxes/JavaScriptReact.tmLanguage.json",
"embeddedLanguages": {
"meta.tag.js": "jsx-tags",
"meta.tag.without-attributes.js": "jsx-tags",
"meta.tag.attributes.js.jsx": "javascriptreact",
"meta.embedded.expression.js": "javascriptreact"
},
"tokenTypes": {
"meta.template.expression": "other",
"meta.template.expression string": "string",
"meta.template.expression comment": "comment",
"entity.name.type.instance.jsdoc": "other",
"entity.name.function.tagged-template": "other",
"meta.import string.quoted": "other",
"variable.other.jsdoc": "other"
}
},
{
"language": "javascript",
"scopeName": "source.js",
"path": "./syntaxes/JavaScript.tmLanguage.json",
"embeddedLanguages": {
"meta.tag.js": "jsx-tags",
"meta.tag.without-attributes.js": "jsx-tags",
"meta.tag.attributes.js": "javascript",
"meta.embedded.expression.js": "javascript"
},
"tokenTypes": {
"meta.template.expression": "other",
"meta.template.expression string": "string",
"meta.template.expression comment": "comment",
"entity.name.type.instance.jsdoc": "other",
"entity.name.function.tagged-template": "other",
"meta.import string.quoted": "other",
"variable.other.jsdoc": "other"
}
},
{
"scopeName": "source.js.regexp",
"path": "./syntaxes/Regular Expressions (JavaScript).tmLanguage"
}
],
"semanticTokenScopes": [
{
"language": "javascript",
"scopes": {
"property": [
"variable.other.property.js"
],
"property.readonly": [
"variable.other.constant.property.js"
],
"variable": [
"variable.other.readwrite.js"
],
"variable.readonly": [
"variable.other.constant.object.js"
],
"function": [
"entity.name.function.js"
],
"namespace": [
"entity.name.type.module.js"
],
"variable.defaultLibrary": [
"support.variable.js"
],
"function.defaultLibrary": [
"support.function.js"
]
}
},
{
"language": "javascriptreact",
"scopes": {
"property": [
"variable.other.property.jsx"
],
"property.readonly": [
"variable.other.constant.property.jsx"
],
"variable": [
"variable.other.readwrite.jsx"
],
"variable.readonly": [
"variable.other.constant.object.jsx"
],
"function": [
"entity.name.function.jsx"
],
"namespace": [
"entity.name.type.module.jsx"
],
"variable.defaultLibrary": [
"support.variable.js"
],
"function.defaultLibrary": [
"support.function.js"
]
}
}
],
"snippets": [
{
"language": "javascript",
"path": "./snippets/javascript.code-snippets"
},
{
"language": "javascriptreact",
"path": "./snippets/javascript.code-snippets"
}
]
},
"repository": {
"type": "git",
"url": "https://github.com/microsoft/vscode.git"
}
}
+4
View File
@@ -0,0 +1,4 @@
{
"displayName": "JavaScript Language Basics",
"description": "Provides snippets, syntax highlighting, bracket matching and folding in JavaScript files."
}
@@ -0,0 +1,265 @@
{
"Constructor": {
"prefix": "ctor",
"body": [
"/**",
" *",
" */",
"constructor() {",
"\tsuper();",
"\t$0",
"}"
],
"description": "Constructor"
},
"Class Definition": {
"prefix": "class",
"isFileTemplate": true,
"body": [
"class ${1:name} {",
"\tconstructor(${2:parameters}) {",
"\t\t$0",
"\t}",
"}"
],
"description": "Class Definition"
},
"Method Definition": {
"prefix": "method",
"body": [
"/**",
" * ",
" */",
"${1:name}() {",
"\t$0",
"}"
],
"description": "Method Definition"
},
"Import Statement": {
"prefix": "import",
"body": [
"import { $0 } from \"${1:module}\";"
],
"description": "Import external module"
},
"Log to the console": {
"prefix": "log",
"body": [
"console.log($1);",
"$0"
],
"description": "Log to the console"
},
"Log warning to console": {
"prefix": "warn",
"body": [
"console.warn($1);",
"$0"
],
"description": "Log warning to the console"
},
"Log error to console": {
"prefix": "error",
"body": [
"console.error($1);",
"$0"
],
"description": "Log error to the console"
},
"Throw Exception": {
"prefix": "throw",
"body": [
"throw new Error(\"$1\");",
"$0"
],
"description": "Throw Exception"
},
"For Loop": {
"prefix": "for",
"body": [
"for (let ${1:index} = 0; ${1:index} < ${2:array}.length; ${1:index}++) {",
"\tconst ${3:element} = ${2:array}[${1:index}];",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "For Loop"
},
"For-Each Loop using =>": {
"prefix": "foreach =>",
"body": [
"${1:array}.forEach(${2:element} => {",
"\t$TM_SELECTED_TEXT$0",
"});"
],
"description": "For-Each Loop using =>"
},
"For-In Loop": {
"prefix": "forin",
"body": [
"for (const ${1:key} in ${2:object}) {",
"\tif (Object.prototype.hasOwnProperty.call(${2:object}, ${1:key})) {",
"\t\tconst ${3:element} = ${2:object}[${1:key}];",
"\t\t$TM_SELECTED_TEXT$0",
"\t}",
"}"
],
"description": "For-In Loop"
},
"For-Of Loop": {
"prefix": "forof",
"body": [
"for (const ${1:element} of ${2:object}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "For-Of Loop"
},
"For-Await-Of Loop": {
"prefix": "forawaitof",
"body": [
"for await (const ${1:element} of ${2:object}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "For-Await-Of Loop"
},
"Function Statement": {
"prefix": "function",
"body": [
"function ${1:name}(${2:params}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "Function Statement"
},
"If Statement": {
"prefix": "if",
"body": [
"if (${1:condition}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "If Statement"
},
"If-Else Statement": {
"prefix": "ifelse",
"body": [
"if (${1:condition}) {",
"\t$TM_SELECTED_TEXT$0",
"} else {",
"\t",
"}"
],
"description": "If-Else Statement"
},
"New Statement": {
"prefix": "new",
"body": [
"const ${1:name} = new ${2:type}(${3:arguments});$0"
],
"description": "New Statement"
},
"Switch Statement": {
"prefix": "switch",
"body": [
"switch (${1:key}) {",
"\tcase ${2:value}:",
"\t\t$0",
"\t\tbreak;",
"",
"\tdefault:",
"\t\tbreak;",
"}"
],
"description": "Switch Statement"
},
"While Statement": {
"prefix": "while",
"body": [
"while (${1:condition}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "While Statement"
},
"Do-While Statement": {
"prefix": "dowhile",
"body": [
"do {",
"\t$TM_SELECTED_TEXT$0",
"} while (${1:condition});"
],
"description": "Do-While Statement"
},
"Try-Catch Statement": {
"prefix": "trycatch",
"body": [
"try {",
"\t$TM_SELECTED_TEXT$0",
"} catch (${1:error}) {",
"\t",
"}"
],
"description": "Try-Catch Statement"
},
"Set Timeout Function": {
"prefix": "settimeout",
"body": [
"setTimeout(() => {",
"\t$TM_SELECTED_TEXT$0",
"}, ${1:timeout});"
],
"description": "Set Timeout Function"
},
"Set Interval Function": {
"prefix": "setinterval",
"body": [
"setInterval(() => {",
"\t$TM_SELECTED_TEXT$0",
"}, ${1:interval});"
],
"description": "Set Interval Function"
},
"Region Start": {
"prefix": "#region",
"body": [
"//#region $0"
],
"description": "Folding Region Start"
},
"Region End": {
"prefix": "#endregion",
"body": [
"//#endregion"
],
"description": "Folding Region End"
},
"new Promise": {
"prefix": "newpromise",
"body": [
"new Promise((resolve, reject) => {",
"\t$TM_SELECTED_TEXT$0",
"})"
],
"description": "Create a new Promise"
},
"Async Function Statement": {
"prefix": "async function",
"body": [
"async function ${1:name}(${2:params}) {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "Async Function Statement"
},
"Async Function Expression": {
"prefix": "async arrow function",
"body": [
"async (${1:params}) => {",
"\t$TM_SELECTED_TEXT$0",
"}"
],
"description": "Async Function Expression"
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12
View File
@@ -0,0 +1,12 @@
The file `JavaScript.tmLanguage.json` is derived from [TypeScriptReact.tmLanguage](https://github.com/microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage).
To update to the latest version:
- `cd extensions/typescript` and run `npm run update-grammars`
- don't forget to run the integration tests at `./scripts/test-integration.sh`
The script does the following changes:
- fileTypes .tsx -> .js & .jsx
- scopeName scope.tsx -> scope.js
- update all rule names .tsx -> .js
@@ -0,0 +1,237 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array/>
<key>hideFromUser</key>
<true/>
<key>name</key>
<string>Regular Expressions (JavaScript)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#regexp</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>regex-character-class</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\[wWsSdD]|\.</string>
<key>name</key>
<string>constant.character.character-class.regexp</string>
</dict>
<dict>
<key>match</key>
<string>\\([0-7]{3}|x\h\h|u\h\h\h\h)</string>
<key>name</key>
<string>constant.character.numeric.regexp</string>
</dict>
<dict>
<key>match</key>
<string>\\c[A-Z]</string>
<key>name</key>
<string>constant.character.control.regexp</string>
</dict>
<dict>
<key>match</key>
<string>\\.</string>
<key>name</key>
<string>constant.character.escape.backslash.regexp</string>
</dict>
</array>
</dict>
<key>regexp</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\[bB]|\^|\$</string>
<key>name</key>
<string>keyword.control.anchor.regexp</string>
</dict>
<dict>
<key>match</key>
<string>\\[1-9]\d*</string>
<key>name</key>
<string>keyword.other.back-reference.regexp</string>
</dict>
<dict>
<key>match</key>
<string>[?+*]|\{(\d+,\d+|\d+,|,\d+|\d+)\}\??</string>
<key>name</key>
<string>keyword.operator.quantifier.regexp</string>
</dict>
<dict>
<key>match</key>
<string>\|</string>
<key>name</key>
<string>keyword.operator.or.regexp</string>
</dict>
<dict>
<key>begin</key>
<string>(\()((\?=)|(\?!))</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.group.regexp</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>meta.assertion.look-ahead.regexp</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>meta.assertion.negative-look-ahead.regexp</string>
</dict>
</dict>
<key>end</key>
<string>(\))</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.group.regexp</string>
</dict>
</dict>
<key>name</key>
<string>meta.group.assertion.regexp</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#regexp</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\((\?:)?</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.group.regexp</string>
</dict>
</dict>
<key>end</key>
<string>\)</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.group.regexp</string>
</dict>
</dict>
<key>name</key>
<string>meta.group.regexp</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#regexp</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(\[)(\^)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.character-class.regexp</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>keyword.operator.negation.regexp</string>
</dict>
</dict>
<key>end</key>
<string>(\])</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.character-class.regexp</string>
</dict>
</dict>
<key>name</key>
<string>constant.other.character-class.set.regexp</string>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>constant.character.numeric.regexp</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>constant.character.control.regexp</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>constant.character.escape.backslash.regexp</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>constant.character.numeric.regexp</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>constant.character.control.regexp</string>
</dict>
<key>6</key>
<dict>
<key>name</key>
<string>constant.character.escape.backslash.regexp</string>
</dict>
</dict>
<key>match</key>
<string>(?:.|(\\(?:[0-7]{3}|x\h\h|u\h\h\h\h))|(\\c[A-Z])|(\\.))\-(?:[^\]\\]|(\\(?:[0-7]{3}|x\h\h|u\h\h\h\h))|(\\c[A-Z])|(\\.))</string>
<key>name</key>
<string>constant.other.character-class.range.regexp</string>
</dict>
<dict>
<key>include</key>
<string>#regex-character-class</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#regex-character-class</string>
</dict>
</array>
</dict>
</dict>
<key>scopeName</key>
<string>source.js.regexp</string>
<key>uuid</key>
<string>AC8679DE-3AC7-4056-84F9-69A7ADC29DDD</string>
</dict>
</plist>
@@ -0,0 +1,152 @@
{
"comments": {
"blockComment": [
"{/*",
"*/}"
]
},
"brackets": [
[
"{",
"}"
],
[
"[",
"]"
],
[
"(",
")"
],
[
"<",
">"
]
],
"colorizedBracketPairs": [
[
"{",
"}"
],
[
"[",
"]"
],
[
"(",
")"
]
],
"autoClosingPairs": [
{
"open": "{",
"close": "}"
},
{
"open": "[",
"close": "]"
},
{
"open": "(",
"close": ")"
},
{
"open": "'",
"close": "'",
"notIn": [
"string",
"comment"
]
},
{
"open": "\"",
"close": "\"",
"notIn": [
"string"
]
},
{
"open": "/**",
"close": " */",
"notIn": [
"string"
]
}
],
"surroundingPairs": [
[
"{",
"}"
],
[
"[",
"]"
],
[
"(",
")"
],
[
"<",
">"
],
[
"'",
"'"
],
[
"\"",
"\""
]
],
"wordPattern": {
"pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\$\\^\\&\\*\\(\\)\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:'\"\\,\\.\\<\\>\\/\\s]+)"
},
"onEnterRules": [
{
"beforeText": {
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$",
"flags": "i"
},
"afterText": {
"pattern": "^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>$",
"flags": "i"
},
"action": {
"indent": "indentOutdent"
}
},
{
"beforeText": {
"pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$",
"flags": "i"
},
"action": {
"indent": "indent"
}
},
{
// `beforeText` only applies to tokens of a given language. Since we are dealing with jsx-tags,
// make sure we apply to the closing `>` of a tag so that mixed language spans
// such as `<div onclick={1}>` are handled properly.
"beforeText": {
"pattern": "^>$"
},
"afterText": {
"pattern": "^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>$",
"flags": "i"
},
"action": {
"indent": "indentOutdent"
}
},
{
"beforeText": {
"pattern": "^>$"
},
"action": {
"indent": "indent"
}
}
],
}