From 7fdbf16b844f7c54454e26e04a18ffd87ee8738b Mon Sep 17 00:00:00 2001 From: Deimonn Date: Fri, 26 Apr 2024 12:10:32 -0300 Subject: [PATCH] Initial commit --- .eslintrc.json | 33 + .gitignore | 20 + .vscode/launch.json | 21 + .vscode/settings.json | 11 + .vscode/tasks.json | 23 + .vscodeignore | 9 + CHANGELOG.md | 10 + LICENSE | 19 + README.md | 57 + assets/logo.png | Bin 0 -> 52798 bytes package-lock.json | 1935 +++++++++++++++++++++++++++++++++ package.json | 99 ++ src/extension.ts | 137 +++ syntaxes/re2c.tmLanguage.json | 361 ++++++ tsconfig.json | 15 + 15 files changed, 2750 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/logo.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/extension.ts create mode 100644 syntaxes/re2c.tmLanguage.json create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..8785ba8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": 2020, + "sourceType": "module" + }, + "plugins": [ + "@stylistic", + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/strict-type-checked", + "plugin:@typescript-eslint/stylistic-type-checked" + ], + "rules": { + "@stylistic/quotes": ["error", "double"], + "@stylistic/semi": ["error", "never"], + "@stylistic/indent": ["error", 4], + "@typescript-eslint/consistent-type-definitions": ["error", "type"], + "curly": "error", + "eqeqeq": "error", + "no-throw-literal": "error", + "prefer-const": "error" + }, + "ignorePatterns": [ + "out", + "dist", + "**/*.d.ts" + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e8b08a --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Temporary files created by various text editors. +*~ + +# Merge files created by git. +*.orig +# Reject files created by git. +*.rej + +# Vim swap files. +.*.sw? +.sw? + +# OS X specific files. +.DS_store + +# Build artifacts and outputs. +/out +/dist +/node_modules +/*.vsix diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..392ec1c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "watch" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..30bf8c2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..3259d6f --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,23 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "label": "watch", + "type": "npm", + "script": "watch", + "options": { + "shell": { + "executable": "cmd.exe", + "args": ["/d", "/c"] + } + }, + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + } + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..f18d80e --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,9 @@ +.vscode/** +.vscode-test/** +.gitignore +.yarnrc +src/** +**/tsconfig.json +**/.eslintrc.json +**/*.map +**/*.ts \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..52f0cc1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0](https://github.com/deimonn/code-re2c/releases/tag/v0.1.0) - 2024-04-26 + +- Initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cf19273 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 Deimonn (a.k.a. Nahuel S. Cisterna) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..58eafa1 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Code re2c + +Experimental linting and syntax highlighting for [re2c]! + +## How to use + +### File associations + +`re2c` code blocks will be automatically detected within C, C++, Go and Rust +source files. In addition, this extension also creates the following default +associations: + +Extension | Language +-- | -- +`*.re`, `*.c.re` | C +`*.cc.re`, `*.cpp.re`, `*.cxx.re` | C++ +`*.go.re` | Go +`*.rs.re` | Rust + +If you don't like the default `*.re` being tied to C, you can override it by +just modifying your `files.associations` in your `settings.json` file. For +example, to make the default language C++: + +```JSON +"files.associations": { + "*.re": "cpp" +} +``` + +### Linting + +Linting occurs only when you open a document or save it, as it relies on running +and parsing command output. + +A [re2c] binary somewhere in your system is required for it. If its not on your +`PATH`, you can manually set the path to it in your settings: + +```JSON +"code-re2c.re2c.path": "/path/to/re2c" +``` + +By default, only the `-W` flag is passed to the re2c binary. You can override +the arguments to pass in your settings: + +```JSON +"code-re2c.re2c.arguments": ["-W", "-Werror-empty-character-class"] +``` + +[re2c]: http://re2c.org/ + +## Known issues + +- Flex syntax mode is unsupported. Syntax highlighting is bound to be skewed + when using features pertaining to it. + +- Code blocks of C/C++/Go/Rust *within* a re2c block won't get properly colored. + TextMate is simply too much of a headache to implement such a thing. diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..732760e52cfea1af3177c35a23f7a60d7dbde372 GIT binary patch literal 52798 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
oFdw~ns= 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

j}TOUx0iA26U% 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.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-1.7.2.tgz", + "integrity": "sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.7.2", + "@stylistic/eslint-plugin-jsx": "1.7.2", + "@stylistic/eslint-plugin-plus": "1.7.2", + "@stylistic/eslint-plugin-ts": "1.7.2", + "@types/eslint": "^8.56.8" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.7.2.tgz", + "integrity": "sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.8", + "acorn": "^8.11.3", + "escape-string-regexp": "^4.0.0", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-1.7.2.tgz", + "integrity": "sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "^1.7.2", + "@types/eslint": "^8.56.8", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-plus": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-1.7.2.tgz", + "integrity": "sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.8", + "@typescript-eslint/utils": "^6.21.0" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-1.7.2.tgz", + "integrity": "sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.7.2", + "@types/eslint": "^8.56.8", + "@typescript-eslint/utils": "^6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.88.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.88.0.tgz", + "integrity": "sha512-rWY+Bs6j/f1lvr8jqZTyp5arRMfovdxolcqGi+//+cPDOh8SBvzXH90e7BiSXct5HJ9HGW6jATchbRTpTJpEkw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", + "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/type-utils": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", + "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", + "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", + "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", + "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", + "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", + "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", + "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", + "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0098024 --- /dev/null +++ b/package.json @@ -0,0 +1,99 @@ +{ + "name": "code-re2c", + "version": "0.1.0", + "displayName": "Code re2c", + "description": "Code in re2c! Linting and syntax highlighting for re2c.", + "publisher": "deimonn", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/deimonn/code-re2c" + }, + "icon": "assets/logo.png", + "keywords": [ + "re2c", + "re2go", + "re2rust", + "lex", + "lexer", + "language" + ], + "extensionKind": [ + "workspace" + ], + "engines": { + "vscode": "^1.78.0" + }, + "categories": [ + "Programming Languages" + ], + "main": "./out/extension.js", + "activationEvents": [ + "onLanguage:c", + "onLanguage:cpp", + "onLanguage:go", + "onLanguage:rust" + ], + "contributes": { + "configuration": { + "title": "re2c", + "properties": { + "code-re2c.re2c.path": { + "type": "string", + "scope": "machine-overridable", + "description": "The name or path to the re2c binary.", + "default": "re2c", + "order": 1 + }, + "code-re2c.re2c.arguments": { + "type": "array", + "items": { + "type": "string" + }, + "scope": "machine-overridable", + "description": "Additional arguments to pass to the re2c binary; e.g. to enable warnings.", + "default": ["-W"], + "order": 2 + } + } + }, + "configurationDefaults": { + "files.associations": { + "*.re": "c", + "*.c.re": "c", + "*.cc.re": "cpp", + "*.cpp.re": "cpp", + "*.cxx.re": "cpp", + "*.go.re": "go", + "*.rs.re": "rust" + } + }, + "grammars": [ + { + "scopeName": "source.re2c", + "path": "./syntaxes/re2c.tmLanguage.json", + "injectTo": [ + "source.c", + "source.cpp", + "source.go", + "source.rust" + ] + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "lint": "eslint src --ext ts" + }, + "devDependencies": { + "@stylistic/eslint-plugin": "^1.6.2", + "@types/node": "20.x", + "@types/vscode": "^1.78.0", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", + "eslint": "^8.57.0", + "typescript": "^5.3.3" + } +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..b6b8a98 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,137 @@ +/*─ extension.ts ─────────────────────────────────────────────────────────────* + Code re2c extension code. + *────────────────────────────────────────────────────────────────────────────* + Copyright (c) 2024 Deimonn (a.k.a. Nahuel S. Cisterna) + + This file is licensed under the MIT License. + + See https://raw.githubusercontent.com/deimonn/code-ninjutsu/master/LICENSE for + license information. + *────────────────────────────────────────────────────────────────────────────*/ + +import child_process = require("child_process") + +import * as vscode from "vscode" + +/** Output channel for debugging. */ +let outputChannel: vscode.OutputChannel +/** Diagnostics collection. */ +let activeDiagnostics: vscode.DiagnosticCollection + +/** Fetch string timestamp for logging. */ +function timestamp() { + return new Date().toISOString() +} + +/** Lint and publish diagnostics for re2c code. */ +function publishDiagnostics(document: vscode.TextDocument) { + // Figure out language. + let lang: string + if (document.languageId === "c" || document.languageId === "cpp") { + lang = "c" + } else if (document.languageId === "go") { + lang = "go" + } else if (document.languageId === "rust") { + lang = "rust" + } else { + return + } + + // Fetch configuration. + const configuration = vscode.workspace.getConfiguration("code-re2c") + const re2c = configuration.get("re2c.path") ?? "re2c" + const args = configuration.get("re2c.arguments") ?? ["-W"] + + // Push language and path arguments. + args.push("--lang", lang) + args.push(document.uri.fsPath) + + // Execute `re2c` with the given arguments. + outputChannel.appendLine( + `[${timestamp()}] Executing '${re2c}' with args: ${args.join(" ")}` + ) + + child_process.execFile(re2c, args, (error, _, stderr) => { + // Check for error. + if (error) { + outputChannel.appendLine( + `[${timestamp()}] error: ${error.message}` + ) + + return + } + + // Parse diagnostics. + const diagnostics: vscode.Diagnostic[] = [] + for (const line of stderr.split("\n")) { + outputChannel.appendLine(line) + + // Match regular expression. + const match = line.match( + /((?:[a-z]:)?[^:]+):([0-9]+):([0-9]+): (error|warning): (.*)/i + ) + + if (!match) { + continue + } + + // Validate file. + const file = match[1].replace(/\\\\/g, "\\") + if (file !== document.uri.fsPath) { + return + } + + // Extract position. + const lineno = Number.parseInt(match[2]) - 1 + const columnno = Number.parseInt(match[3]) + + // Extract kind. + const kind = match[4] === "error" + ? vscode.DiagnosticSeverity.Error + : vscode.DiagnosticSeverity.Warning + + // Extract message. + const message = "re2c: " + match[5] + + // Push. + diagnostics.push(new vscode.Diagnostic(new vscode.Range( + new vscode.Position(lineno, columnno), + new vscode.Position(lineno, columnno + 1) + ), message, kind)) + } + + // Set in collection. + activeDiagnostics.set(document.uri, diagnostics) + }) +} + +/** Clear diagnostics for re2c code. */ +function clearDiagnostics(document: vscode.TextDocument) { + if (!document.languageId.match(/^(c|cpp|go|rust)$/)) { + return + } + + activeDiagnostics.set(document.uri, undefined) +} + +/** Extension activation. */ +export function activate(context: vscode.ExtensionContext) { + // Push context subscriptions. + context.subscriptions.push( + // Create the output channel. + outputChannel = vscode.window.createOutputChannel("Code re2c", "log"), + + // Create the diagnostics collection. + activeDiagnostics = vscode.languages.createDiagnosticCollection("re2c"), + + // Linting for re2c code blocks. + vscode.workspace.onDidOpenTextDocument(publishDiagnostics), + vscode.workspace.onDidSaveTextDocument(publishDiagnostics), + vscode.workspace.onDidCloseTextDocument(clearDiagnostics) + ) +} + +/** Extension deactivation. */ +export function deactivate() { + return undefined +} diff --git a/syntaxes/re2c.tmLanguage.json b/syntaxes/re2c.tmLanguage.json new file mode 100644 index 0000000..5773e24 --- /dev/null +++ b/syntaxes/re2c.tmLanguage.json @@ -0,0 +1,361 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "re2c", + "scopeName": "source.re2c", + "injectionSelector": "L:source", + "patterns": [{ + "include": "#blocks" + }], + "repository": { + "blocks": { + "comment": "Definition of re2c blocks.", + "patterns": [ + { + "comment": "Block followed by only one identifier.", + "begin": "\\s*(/\\*)(!)(?:(local|rules|use)(:))?(re2c)\\b(?:(:)([A-Za-z_][A-Za-z_0-9]*))?", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.begin.c" }, + "2": { "name": "punctuation.definition.directive.re2c" }, + "3": { + "patterns": [ + { + "match": "local|rules", + "name": "storage.modifier.$0.re2c" + }, + { + "match": "use", + "name": "keyword.control.directive.$0.re2c" + } + ] + }, + "4": { "name": "punctuation.separator.colon.re2c" }, + "5": { "name": "storage.type.re2c" }, + "6": { "name": "punctuation.separator.colon.re2c" }, + "7": { "name": "entity.name.type.block.re2c" } + }, + "end": "\\s*(\\*/)", + "endCaptures": { + "1": { "name": "punctuation.definition.comment.end.c" } + }, + "patterns": [{ + "include": "#statements" + }] + }, + { + "comment": "Block followed by any number of identifiers.", + "begin": "\\s*(/\\*)(!)(max|maxnmatch|stags|mtags|getstate|conditions)(:)(re2c)\\b((?::[A-Za-z_][A-Za-z_0-9]*)*)", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.begin.c" }, + "2": { "name": "punctuation.definition.directive.re2c" }, + "3": { "name": "keyword.control.directive.$3.re2c" }, + "4": { "name": "punctuation.separator.colon.re2c" }, + "5": { "name": "storage.type.re2c" }, + "6": { + "patterns": [ + { + "match": ":", + "name": "punctuation.separator.colon.re2c" + }, + { + "match": "[A-Za-z_][A-Za-z_0-9]*", + "name": "entity.name.type.block.re2c" + } + ] + } + }, + "end": "\\s*(\\*/)", + "endCaptures": { + "1": { "name": "punctuation.definition.comment.end.c" } + }, + "patterns": [{ + "include": "#statements" + }] + }, + { + "comment": "Block followed by string.", + "begin": "\\s*(/\\*)(!)(include)(:)(re2c)\\s*(?:(\")((?:\\\\\"|[^\"\n])*)(\"))?", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.begin.c" }, + "2": { "name": "punctuation.definition.directive.re2c" }, + "3": { "name": "keyword.control.directive.$3.re2c" }, + "4": { "name": "punctuation.separator.colon.re2c" }, + "5": { "name": "storage.type.re2c" }, + "6": { "name": "string.quoted.double.re2c punctuation.definition.string.begin.re2c" }, + "7": { + "name": "string.quoted.double.re2c", + "patterns": [{ + "include": "#escapes" + }] + }, + "8": { "name": "string.quoted.double.re2c punctuation.definition.string.end.re2c" } + }, + "end": "\\s*(\\*/)", + "endCaptures": { + "1": { "name": "punctuation.definition.comment.end.c" } + }, + "patterns": [{ + "include": "#statements" + }] + }, + { + "comment": "Block followed by on/off.", + "begin": "\\s*(/\\*)(!)(header)(:)(re2c)(?:(:)(on|off)\\b)?", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.begin.c" }, + "2": { "name": "punctuation.definition.directive.re2c" }, + "3": { "name": "keyword.control.directive.$0.re2c" }, + "4": { "name": "punctuation.separator.colon.re2c" }, + "5": { "name": "storage.type.re2c" }, + "6": { "name": "punctuation.separator.colon.re2c" }, + "7": { "name": "constant.language.$7.re2c" } + }, + "end": "\\s*(\\*/)", + "endCaptures": { + "1": { "name": "punctuation.definition.comment.end.c" } + }, + "patterns": [{ + "include": "#statements" + }] + }, + { + "comment": "Block followed by nothing.", + "begin": "\\s*(/\\*)(!)(types|ignore)(:)(re2c)\\b", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.begin.c" }, + "2": { "name": "punctuation.definition.directive.re2c" }, + "3": { "name": "keyword.control.directive.$3.re2c" }, + "4": { "name": "punctuation.separator.colon.re2c" }, + "5": { "name": "storage.type.re2c" } + }, + "end": "\\s*(\\*/)", + "endCaptures": { + "1": { "name": "punctuation.definition.comment.end.c" } + }, + "patterns": [{ + "include": "#statements" + }] + } + ] + }, + "statements": { + "patterns": [ + { + "comment": "Comments within re2c.", + "match": "(//).*", + "name": "comment.line.re2c", + "captures": { + "1": { + "name": "punctuation.definition.comment.begin.re2c" + } + } + }, + { + "comment": "Use directive.", + "match": "(!)(use)(?:(:)([A-Za-z_][A-Za-z_0-9]*))?", + "captures": { + "1": { "name": "punctuation.definition.directive.re2c" }, + "2": { "name": "keyword.control.directive.$2.re2c" }, + "3": { "name": "punctuation.separator.colon.re2c" }, + "4": { "name": "entity.name.type.block.re2c" } + } + }, + { + "comment": "Include directive.", + "match": "(!)(include)\\b", + "captures": { + "1": { "name": "punctuation.definition.directive.re2c" }, + "2": { "name": "keyword.control.directive.$2.re2c" } + } + }, + { + "comment": "Configuration statement.", + "match": "(re2c)((?::[A-Za-z_][A-Za-z_0-9]*)*)(:)([A-Za-z_][-@A-Za-z_0-9]*)\\s*(=)?\\s*((?:\"(?:\\\\\"|[^\"\n])*\")|[^;\n]*)?(;)?", + "captures": { + "1": { "name": "storage.type.re2c" }, + "2": { + "patterns": [ + { + "match": ":", + "name": "punctuation.separator.colon.re2c" + }, + { + "match": "[A-Za-z_][A-Za-z_0-9]*", + "name": "variable.language.setting.re2c" + } + ] + }, + "3": { "name": "punctuation.separator.colon.re2c" }, + "4": { "name": "variable.language.setting.re2c" }, + "5": { "name": "keyword.operator.re2c" }, + "6": { + "patterns": [ + { + "match": "(\")((?:\\\\\"|[^\"\n])*)(\")", + "name": "string.quoted.double.re2c", + "captures": { + "1": { "name": "punctuation.definition.string.begin.re2c" }, + "2": { + "patterns": [{ + "include": "#escapes" + }] + }, + "3": { "name": "punctuation.definition.string.end.re2c" } + } + }, + { + "match": "[A-Za-z_][-A-Za-z_0-9]*", + "name": "string.unquoted.re2c" + }, + { + "match": "[0-9][A-Za-z_0-9]*", + "name": "constant.numeric.re2c" + } + ] + }, + "7": { "name": "punctuation.terminator.statement.re2c" } + } + }, + { + "comment": "Definition statement.", + "match": "([A-Za-z_][A-Za-z_0-9]*)\\s*(=)", + "captures": { + "1": { "name": "variable.name.re2c" }, + "2": { "name": "keyword.operator.re2c" } + } + }, + { + "include": "#regex" + }, + { + "comment": "Statement terminator.", + "match": ";", + "name": "punctuation.terminator.statement.re2c" + } + ] + }, + "regex": { + "patterns": [ + { + "comment": "Case-sensitive string literal.", + "match": "(\")((?:\\\\\"|[^\"\n])*)(\")", + "name": "string.quoted.double.re2c", + "captures": { + "1": { "name": "punctuation.definition.string.begin.re2c" }, + "2": { + "patterns": [{ + "include": "#escapes" + }] + }, + "3": { "name": "punctuation.definition.string.end.re2c" } + } + }, + { + "comment": "Case-insensitive string literal.", + "match": "(')((?:\\\\'|[^'\n])*)(')", + "name": "string.quoted.single.re2c", + "captures": { + "1": { "name": "punctuation.definition.string.begin.re2c" }, + "2": { + "patterns": [{ + "include": "#escapes" + }] + }, + "3": { "name": "punctuation.definition.string.end.re2c" } + } + }, + { + "comment": "Character class.", + "match": "(\\[)((?:\\\\\\[|[^\\]\n])*)(])", + "captures": { + "1": { "name": "punctuation.definition.character-class.begin.re2c" }, + "2": { + "name": "constant.other.character-class.re2c", + "patterns": [ + { + "match": "(?<=\\[)\\^", + "name": "keyword.operator.negate.re2c" + }, + { + "match": "(?<=.)-(?=.)", + "name": "keyword.operator.range.re2c" + }, + { + "include": "#escapes" + } + ] + }, + "3": { "name": "punctuation.definition.character-class.end.re2c" } + } + }, + { + "comment": "Repetition.", + "match": "({)([0-9]+(?:,[0-9]*)?)(})", + "captures": { + "1": { "name": "punctuation.definition.repetition.begin.re2c" }, + "2": { + "patterns": [ + { + "match": ",", + "name": "punctuation.separator.repetition.re2c" + }, + { + "match": "[0-9]+", + "name": "constant.numeric.re2c" + } + ] + }, + "3": { "name": "punctuation.definition.repetition.begin.re2c" } + } + }, + { + "comment": "Tag.", + "match": "(@|#)([A-Za-z_][A-Za-z_0-9]*)", + "name": "keyword.operator.tag.re2c" + }, + { + "comment": "Reference.", + "match": "[A-Za-z_][A-Za-z_0-9]*", + "name": "variable.name.re2c" + }, + { + "comment": "Various operators.", + "match": "\\.|\\\\|\\*|\\+|\\?|!|\\||/", + "name": "keyword.operator.other.re2c" + }, + { + "comment": "Various punctuators.", + "match": "\\(|\\)|{|}", + "name": "punctuation.other.re2c" + } + ] + }, + "escapes": { + "patterns": [ + { + "match": "\\\\(a|b|f|n|r|t|v|\\\\|\"|'|])", + "name": "constant.character.escape.re2c" + }, + { + "match": "\\\\[0-7]{1,3}", + "name": "constant.character.escape.re2c" + }, + { + "match": "\\\\x[A-Fa-f0-9]{2}", + "name": "constant.character.escape.re2c" + }, + { + "match": "\\\\u[A-Fa-f0-9]{4}", + "name": "constant.character.escape.re2c" + }, + { + "match": "\\\\U[A-Fa-f0-9]{8}", + "name": "constant.character.escape.re2c" + }, + { + "match": "\\\\", + "name": "invalid.illegal.escape.re2c" + } + ] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8855787 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "outDir": "out", + "lib": [ + "ES2020" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + } +}