├── .github └── workflows │ ├── contributors.yml │ └── lint.yml ├── .gitignore ├── .markdownlint.yaml ├── .pre-commit-config.yaml ├── .prettierrc.json ├── .tasks ├── .vscode ├── launch.json └── tasks.json ├── .vscodeignore ├── LICENSE ├── README.md ├── assets └── logo.png ├── docs ├── cs.png ├── example.go ├── example.js ├── go.png ├── go_lint.png ├── go_lint2.png ├── java.png ├── js.png ├── js_lint.png ├── py_lint.png ├── python.png ├── ruby.png └── rust.png ├── package-lock.json ├── package.json ├── src ├── configuration.ts └── extension.ts ├── syntaxes ├── c-sharp-multiline.json ├── es6_inline.json ├── golang-multiline.json ├── highlight-sql-string.json ├── lua-multiline.json └── php-multiline.json ├── test └── testdata │ ├── es6.js │ ├── multiline.cs │ ├── multiline.go │ ├── multiline.lua │ ├── multiline.php │ ├── multiline.py │ ├── multiline.rs │ ├── string.js │ ├── string.php │ └── string.py └── tsconfig.json /.github/workflows/contributors.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | 6 | jobs: 7 | contrib-readme-job: 8 | runs-on: ubuntu-latest 9 | name: A job to automate contrib in readme 10 | steps: 11 | - name: Contribute List 12 | uses: akhilmhdh/contributors-readme-action@v2.3.4 13 | env: 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 15 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: lint 2 | on: 3 | push: 4 | branches: [main] 5 | pull_request: 6 | branches: [main] 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v3 12 | - uses: actions/setup-node@v3 13 | with: 14 | node-version: '17' 15 | cache: 'npm' 16 | - run: npm install 17 | - run: npm run lint 18 | - run: npm run test-compile 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | *.tempfile 107 | *.vsix 108 | 109 | /out 110 | -------------------------------------------------------------------------------- /.markdownlint.yaml: -------------------------------------------------------------------------------- 1 | default: true 2 | MD013: 3 | line_length: 200 4 | MD033: false 5 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_stages: [commit] 2 | repos: 3 | - repo: https://github.com/pre-commit/pre-commit-hooks 4 | rev: v4.2.0 5 | hooks: 6 | - id: end-of-file-fixer 7 | - id: check-added-large-files 8 | - id: trailing-whitespace 9 | - id: check-merge-conflict 10 | - id: check-toml 11 | - id: check-yaml 12 | - id: detect-private-key 13 | - id: check-json 14 | exclude: '.vscode/tasks.json' 15 | - id: check-case-conflict 16 | - id: check-symlinks 17 | - id: mixed-line-ending 18 | args: ['--fix=no'] 19 | - repo: https://github.com/jorisroovers/gitlint 20 | rev: v0.17.0 21 | hooks: 22 | - id: gitlint 23 | args: 24 | [ 25 | '--ignore=body-is-missing,body-min-length', 26 | '--contrib=contrib-title-conventional-commits', 27 | '--msg-filename', 28 | ] 29 | - repo: https://github.com/codespell-project/codespell 30 | rev: v2.1.0 31 | hooks: 32 | - id: codespell 33 | exclude: '^go.sum' 34 | - repo: https://github.com/Yelp/detect-secrets 35 | rev: v1.2.0 36 | hooks: 37 | - id: detect-secrets 38 | exclude: '.*_test.go$|README.md' 39 | - repo: https://github.com/zricethezav/gitleaks 40 | rev: v8.8.6 41 | hooks: 42 | - id: gitleaks 43 | - repo: https://github.com/igorshubovych/markdownlint-cli 44 | rev: v0.31.1 45 | hooks: 46 | - id: markdownlint 47 | ci: 48 | autofix_commit_msg: | 49 | [pre-commit.ci] auto fixes from pre-commit.com hooks 50 | for more information, see https://pre-commit.ci 51 | autofix_prs: false 52 | autoupdate_branch: '' 53 | autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate' 54 | autoupdate_schedule: monthly 55 | # These require either docker or docker-compose. Use separate job for golangci-lint. 56 | skip: [] 57 | submodules: false 58 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 4, 4 | "semi": true, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /.tasks: -------------------------------------------------------------------------------- 1 | [npm-watch] 2 | command=npm run watch 3 | output=terminal 4 | pos=long 5 | cwd= 6 | 7 | [pg-start] 8 | command=docker run --rm --name db -e POSTGRES_HOST_AUTH_METHOD=trust -p 5432:5432 postgres 9 | output=terminal 10 | cwd= 11 | 12 | [package] 13 | command=vsce package 14 | cwd= 15 | save=2 16 | 17 | [publish] 18 | command=vsce publish 19 | output=terminal 20 | cwd= 21 | save=2 22 | 23 | [run-vscode] 24 | command=code --extensionDevelopmentPath=$PWD 25 | silent=1 26 | cwd= 27 | save=2 28 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "runtimeExecutable": "${execPath}", 9 | "args": [ 10 | "--extensionDevelopmentPath=${workspaceRoot}" 11 | ] 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "presentation": { 4 | "echo": true, 5 | "reveal": "always", 6 | "focus": true, 7 | "panel": "shared", 8 | "showReuseMessage": true, 9 | "clear": true 10 | }, 11 | "tasks": [ 12 | { 13 | "label": "r/up", 14 | "type": "shell", 15 | "command": "bash -i run.sh up", 16 | "isBackground": true, 17 | }, 18 | { 19 | "label": "r/up:db", 20 | "type": "shell", 21 | "command": "bash -i run.sh up:db", 22 | "isBackground": true, 23 | }, 24 | { 25 | "label": "r/package", 26 | "type": "shell", 27 | "command": "bash -i run.sh package", 28 | }, 29 | { 30 | "label": "r/publish", 31 | "type": "shell", 32 | "command": "bash -i run.sh publish", 33 | }, 34 | ], 35 | } 36 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | tslint.json 10 | run.sh 11 | docker-compose.yml 12 | docs/** 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Gleb Buzin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Inline SQL ![shield](https://img.shields.io/visual-studio-marketplace/i/qufiwefefwoyn.inline-sql-syntax) 2 | 3 | > Also available in [Open VSX Registry](https://open-vsx.org/extension/qufiwefefwoyn/inline-sql-syntax) 4 | 5 | ![python](docs/py_lint.png) 6 | 7 | Highlight and lint inline SQL strings. 8 | Supported languages are **Python**, **Go**, **JavaScript**, **TypeScript**, **Ruby**, **Java**, **C#**, **Rust**, **PHP**, **Lua**. 9 | 10 | Syntax highlighting works for strings starting with `--sql` or any of 11 | the `SELECT`, `INSERT`, `INTO`, `DELETE`, `UPDATE`, `CREATE TABLE`. 12 | 13 | Also works with ES6 Template Strings: 14 | 15 | ```javascript 16 | const query = sql` 17 | select * from book; 18 | `; 19 | ``` 20 | 21 | **Linting and diagnostics powered entirely by awesome 22 | [joereynolds/sql-lint](https://github.com/joereynolds/sql-lint) and works for 23 | multiline strings that start with either \`--sql (backtick followed by `--sql`), 24 | `"--sql` or `"""--sql`.** 25 | 26 | ## Contributors 27 | 28 | 29 | 30 | 31 | 38 | 45 | 52 | 59 | 66 | 73 |
32 | 33 | jwhitaker-swiftnav 34 |
35 | jwhitaker-swiftnav 36 |
37 |
39 | 40 | Wild-W 41 |
42 | Connor Bren 43 |
44 |
46 | 47 | tamasfe 48 |
49 | Ferenc Tamás 50 |
51 |
53 | 54 | nossrannug 55 |
56 | Gunnar Sv Sigurbjörnsson 57 |
58 |
60 | 61 | JonathanWolfe 62 |
63 | Jon Wolfe 64 |
65 |
67 | 68 | titouancreach 69 |
70 | Titouan CREACH 71 |
72 |
74 | 75 | 76 | ## Safety 77 | 78 | The proper way to sanitize data for insertion into your database is to 79 | use placeholders for all variables to be inserted into your SQL strings. 80 | In other words, NEVER do this (Python example): 81 | 82 | ```python 83 | query = f"INSERT INTO foo (bar, baz) VALUES ( {variable1}, {variable2} )"; 84 | ``` 85 | 86 | Instead, use `$` placeholders (or `?` in some databases): 87 | 88 | ```python 89 | query = "INSERT INTO foo (bar, baz) VALUES ( $1, $2 )"; 90 | ``` 91 | 92 | And then pass the variables to be replaced when you execute the query. 93 | For example with [pgx](https://github.com/JackC/pgx) (Go example): 94 | 95 | ```go 96 | err = conn.QueryRow( 97 | context.Background(), 98 | "select name, weight from widgets where id=$1", 99 | 42, 100 | ).Scan(&name, &weight) 101 | ``` 102 | 103 | ## Integration with real database 104 | 105 | Integration with real database is available and controlled through VSCode options: 106 | 107 | ```json 108 | { 109 | "inlineSQL.enableDBIntegration": true, 110 | "inlineSQL.dbDriver": "postgres", 111 | "inlineSQL.dbHost": "localhost", 112 | "inlineSQL.dbPort": 5432, 113 | "inlineSQL.dbUser": "postgres", 114 | "inlineSQL.dbPassword": "postgres" 115 | } 116 | ``` 117 | 118 | ## Examples 119 | 120 | ### Python 121 | 122 | ![python](docs/py_lint.png) 123 | 124 | ### JavaScript/TypeScript 125 | 126 | ![js](docs/js_lint.png) 127 | 128 | ### Go 129 | 130 | ![go](docs/go_lint.png) 131 | 132 | ![go](docs/go_lint2.png) 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
PythonJavaScript/TypeScript
144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 |
RubyJava
155 | 156 | ## Limitations 157 | 158 | ### Semantic highlighting 159 | 160 | Highlighting does not work with semantic token highlighting enabled (feature provided by some LSP servers). 161 | 162 | Currently gopls semantic token highlighting (option `gopls.ui.semanticTokens` - off by default) 163 | overrides extension's syntax. 164 | 165 | #### gopls 166 | 167 | ```json 168 | { 169 | "gopls.ui.semanticTokens": false 170 | } 171 | ``` 172 | 173 | #### rust-analyzer 174 | 175 | ```json 176 | { 177 | "rust-analyzer.highlighting.strings": false 178 | } 179 | ``` 180 | 181 | #### `C#` 182 | 183 | ```json 184 | { 185 | "csharp.semanticHighlighting.enabled": false 186 | } 187 | ``` 188 | 189 | ## Motivation 190 | 191 | This small extension is meant to help those who don't use ORM and don't like SQL builders 192 | like [squirrel](https://github.com/Masterminds/squirrel), 193 | but still want inline sql in their code to be something more than magic strings, 194 | helping to avoid small bugs and typos almost instantly. 195 | 196 | ## Related 197 | 198 | - [joereynolds/sql-lint](https://github.com/joereynolds/sql-lint) - Used for linting. 199 | - [joe-re/sql-language-server](https://github.com/joe-re/sql-language-server) - SQL Language Server, consider it if you use separate files for sql. 200 | - [cmoog/vscode-sql-notebook](https://github.com/cmoog/vscode-sql-notebook) - Open SQL files as VSCode Notebooks. 201 | - [pushqrdx/vscode-inline-html](https://github.com/pushqrdx/vscode-inline-html) - ES6 Template Strings inline HTML. 202 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/assets/logo.png -------------------------------------------------------------------------------- /docs/cs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/cs.png -------------------------------------------------------------------------------- /docs/example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | query := `--sql 7 | select * from book; 8 | ` 9 | fmt.Println(query) 10 | 11 | another := `SELECT * from book` 12 | fmt.Println(another) 13 | } 14 | -------------------------------------------------------------------------------- /docs/example.js: -------------------------------------------------------------------------------- 1 | query = `--sql 2 | select * from book; 3 | ` 4 | -------------------------------------------------------------------------------- /docs/go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/go.png -------------------------------------------------------------------------------- /docs/go_lint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/go_lint.png -------------------------------------------------------------------------------- /docs/go_lint2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/go_lint2.png -------------------------------------------------------------------------------- /docs/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/java.png -------------------------------------------------------------------------------- /docs/js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/js.png -------------------------------------------------------------------------------- /docs/js_lint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/js_lint.png -------------------------------------------------------------------------------- /docs/py_lint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/py_lint.png -------------------------------------------------------------------------------- /docs/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/python.png -------------------------------------------------------------------------------- /docs/ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/ruby.png -------------------------------------------------------------------------------- /docs/rust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/barklan/inline_sql_syntax/22148f47545a3e3adc7d29dbd923add6c971b74c/docs/rust.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "inline-sql-syntax", 3 | "version": "2.15.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "inline-sql-syntax", 9 | "version": "2.15.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "sql-lint": "^0.0.19" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "^17.0.21", 16 | "@types/vscode": "^1.63.0", 17 | "esbuild": "^0.14.25", 18 | "prettier": "2.6.2", 19 | "typescript": "^4.6.2" 20 | }, 21 | "engines": { 22 | "vscode": "^1.63.0" 23 | } 24 | }, 25 | "node_modules/@types/moo": { 26 | "version": "0.5.5", 27 | "resolved": "https://registry.npmjs.org/@types/moo/-/moo-0.5.5.tgz", 28 | "integrity": "sha512-eXQpwnkI4Ntw5uJg6i2PINdRFWLr55dqjuYQaLHNjvqTzF14QdNWbCbml9sza0byyXNA0hZlHtcdN+VNDcgVHA==" 29 | }, 30 | "node_modules/@types/nearley": { 31 | "version": "2.11.2", 32 | "resolved": "https://registry.npmjs.org/@types/nearley/-/nearley-2.11.2.tgz", 33 | "integrity": "sha512-jeyIDNBxxyWyEk6HemDC+t32b4fxthVsgWDxf88qD2WpX0QpOyY8JvA80AElPTBGRUsO0EKnr6OeVOjK3ZDdnA==" 34 | }, 35 | "node_modules/@types/node": { 36 | "version": "17.0.21", 37 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 38 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" 39 | }, 40 | "node_modules/@types/pg": { 41 | "version": "7.14.11", 42 | "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", 43 | "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", 44 | "dependencies": { 45 | "@types/node": "*", 46 | "pg-protocol": "^1.2.0", 47 | "pg-types": "^2.2.0" 48 | } 49 | }, 50 | "node_modules/@types/sprintf-js": { 51 | "version": "1.1.2", 52 | "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz", 53 | "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==" 54 | }, 55 | "node_modules/@types/vscode": { 56 | "version": "1.65.0", 57 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.65.0.tgz", 58 | "integrity": "sha512-wQhExnh2nEzpjDMSKhUvnNmz3ucpd3E+R7wJkOhBNK3No6fG3VUdmVmMOKD0A8NDZDDDiQcLNxe3oGmX5SjJ5w==", 59 | "dev": true 60 | }, 61 | "node_modules/buffer-writer": { 62 | "version": "2.0.0", 63 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 64 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", 65 | "engines": { 66 | "node": ">=4" 67 | } 68 | }, 69 | "node_modules/commander": { 70 | "version": "5.1.0", 71 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 72 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", 73 | "engines": { 74 | "node": ">= 6" 75 | } 76 | }, 77 | "node_modules/denque": { 78 | "version": "2.0.1", 79 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", 80 | "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", 81 | "engines": { 82 | "node": ">=0.10" 83 | } 84 | }, 85 | "node_modules/discontinuous-range": { 86 | "version": "1.0.0", 87 | "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", 88 | "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" 89 | }, 90 | "node_modules/dot-case": { 91 | "version": "3.0.4", 92 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 93 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 94 | "dependencies": { 95 | "no-case": "^3.0.4", 96 | "tslib": "^2.0.3" 97 | } 98 | }, 99 | "node_modules/dot-case/node_modules/tslib": { 100 | "version": "2.3.1", 101 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 102 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 103 | }, 104 | "node_modules/esbuild": { 105 | "version": "0.14.25", 106 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", 107 | "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", 108 | "dev": true, 109 | "hasInstallScript": true, 110 | "bin": { 111 | "esbuild": "bin/esbuild" 112 | }, 113 | "engines": { 114 | "node": ">=12" 115 | }, 116 | "optionalDependencies": { 117 | "esbuild-android-64": "0.14.25", 118 | "esbuild-android-arm64": "0.14.25", 119 | "esbuild-darwin-64": "0.14.25", 120 | "esbuild-darwin-arm64": "0.14.25", 121 | "esbuild-freebsd-64": "0.14.25", 122 | "esbuild-freebsd-arm64": "0.14.25", 123 | "esbuild-linux-32": "0.14.25", 124 | "esbuild-linux-64": "0.14.25", 125 | "esbuild-linux-arm": "0.14.25", 126 | "esbuild-linux-arm64": "0.14.25", 127 | "esbuild-linux-mips64le": "0.14.25", 128 | "esbuild-linux-ppc64le": "0.14.25", 129 | "esbuild-linux-riscv64": "0.14.25", 130 | "esbuild-linux-s390x": "0.14.25", 131 | "esbuild-netbsd-64": "0.14.25", 132 | "esbuild-openbsd-64": "0.14.25", 133 | "esbuild-sunos-64": "0.14.25", 134 | "esbuild-windows-32": "0.14.25", 135 | "esbuild-windows-64": "0.14.25", 136 | "esbuild-windows-arm64": "0.14.25" 137 | } 138 | }, 139 | "node_modules/esbuild-android-64": { 140 | "version": "0.14.25", 141 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", 142 | "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", 143 | "cpu": [ 144 | "x64" 145 | ], 146 | "dev": true, 147 | "optional": true, 148 | "os": [ 149 | "android" 150 | ], 151 | "engines": { 152 | "node": ">=12" 153 | } 154 | }, 155 | "node_modules/esbuild-android-arm64": { 156 | "version": "0.14.25", 157 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", 158 | "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", 159 | "cpu": [ 160 | "arm64" 161 | ], 162 | "dev": true, 163 | "optional": true, 164 | "os": [ 165 | "android" 166 | ], 167 | "engines": { 168 | "node": ">=12" 169 | } 170 | }, 171 | "node_modules/esbuild-darwin-64": { 172 | "version": "0.14.25", 173 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", 174 | "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", 175 | "cpu": [ 176 | "x64" 177 | ], 178 | "dev": true, 179 | "optional": true, 180 | "os": [ 181 | "darwin" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/esbuild-darwin-arm64": { 188 | "version": "0.14.25", 189 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", 190 | "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", 191 | "cpu": [ 192 | "arm64" 193 | ], 194 | "dev": true, 195 | "optional": true, 196 | "os": [ 197 | "darwin" 198 | ], 199 | "engines": { 200 | "node": ">=12" 201 | } 202 | }, 203 | "node_modules/esbuild-freebsd-64": { 204 | "version": "0.14.25", 205 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", 206 | "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", 207 | "cpu": [ 208 | "x64" 209 | ], 210 | "dev": true, 211 | "optional": true, 212 | "os": [ 213 | "freebsd" 214 | ], 215 | "engines": { 216 | "node": ">=12" 217 | } 218 | }, 219 | "node_modules/esbuild-freebsd-arm64": { 220 | "version": "0.14.25", 221 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", 222 | "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", 223 | "cpu": [ 224 | "arm64" 225 | ], 226 | "dev": true, 227 | "optional": true, 228 | "os": [ 229 | "freebsd" 230 | ], 231 | "engines": { 232 | "node": ">=12" 233 | } 234 | }, 235 | "node_modules/esbuild-linux-32": { 236 | "version": "0.14.25", 237 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", 238 | "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", 239 | "cpu": [ 240 | "ia32" 241 | ], 242 | "dev": true, 243 | "optional": true, 244 | "os": [ 245 | "linux" 246 | ], 247 | "engines": { 248 | "node": ">=12" 249 | } 250 | }, 251 | "node_modules/esbuild-linux-64": { 252 | "version": "0.14.25", 253 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", 254 | "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", 255 | "cpu": [ 256 | "x64" 257 | ], 258 | "dev": true, 259 | "optional": true, 260 | "os": [ 261 | "linux" 262 | ], 263 | "engines": { 264 | "node": ">=12" 265 | } 266 | }, 267 | "node_modules/esbuild-linux-arm": { 268 | "version": "0.14.25", 269 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", 270 | "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", 271 | "cpu": [ 272 | "arm" 273 | ], 274 | "dev": true, 275 | "optional": true, 276 | "os": [ 277 | "linux" 278 | ], 279 | "engines": { 280 | "node": ">=12" 281 | } 282 | }, 283 | "node_modules/esbuild-linux-arm64": { 284 | "version": "0.14.25", 285 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", 286 | "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", 287 | "cpu": [ 288 | "arm64" 289 | ], 290 | "dev": true, 291 | "optional": true, 292 | "os": [ 293 | "linux" 294 | ], 295 | "engines": { 296 | "node": ">=12" 297 | } 298 | }, 299 | "node_modules/esbuild-linux-mips64le": { 300 | "version": "0.14.25", 301 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", 302 | "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", 303 | "cpu": [ 304 | "mips64el" 305 | ], 306 | "dev": true, 307 | "optional": true, 308 | "os": [ 309 | "linux" 310 | ], 311 | "engines": { 312 | "node": ">=12" 313 | } 314 | }, 315 | "node_modules/esbuild-linux-ppc64le": { 316 | "version": "0.14.25", 317 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", 318 | "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", 319 | "cpu": [ 320 | "ppc64" 321 | ], 322 | "dev": true, 323 | "optional": true, 324 | "os": [ 325 | "linux" 326 | ], 327 | "engines": { 328 | "node": ">=12" 329 | } 330 | }, 331 | "node_modules/esbuild-linux-riscv64": { 332 | "version": "0.14.25", 333 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", 334 | "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", 335 | "cpu": [ 336 | "riscv64" 337 | ], 338 | "dev": true, 339 | "optional": true, 340 | "os": [ 341 | "linux" 342 | ], 343 | "engines": { 344 | "node": ">=12" 345 | } 346 | }, 347 | "node_modules/esbuild-linux-s390x": { 348 | "version": "0.14.25", 349 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", 350 | "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", 351 | "cpu": [ 352 | "s390x" 353 | ], 354 | "dev": true, 355 | "optional": true, 356 | "os": [ 357 | "linux" 358 | ], 359 | "engines": { 360 | "node": ">=12" 361 | } 362 | }, 363 | "node_modules/esbuild-netbsd-64": { 364 | "version": "0.14.25", 365 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", 366 | "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", 367 | "cpu": [ 368 | "x64" 369 | ], 370 | "dev": true, 371 | "optional": true, 372 | "os": [ 373 | "netbsd" 374 | ], 375 | "engines": { 376 | "node": ">=12" 377 | } 378 | }, 379 | "node_modules/esbuild-openbsd-64": { 380 | "version": "0.14.25", 381 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", 382 | "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", 383 | "cpu": [ 384 | "x64" 385 | ], 386 | "dev": true, 387 | "optional": true, 388 | "os": [ 389 | "openbsd" 390 | ], 391 | "engines": { 392 | "node": ">=12" 393 | } 394 | }, 395 | "node_modules/esbuild-sunos-64": { 396 | "version": "0.14.25", 397 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", 398 | "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", 399 | "cpu": [ 400 | "x64" 401 | ], 402 | "dev": true, 403 | "optional": true, 404 | "os": [ 405 | "sunos" 406 | ], 407 | "engines": { 408 | "node": ">=12" 409 | } 410 | }, 411 | "node_modules/esbuild-windows-32": { 412 | "version": "0.14.25", 413 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", 414 | "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", 415 | "cpu": [ 416 | "ia32" 417 | ], 418 | "dev": true, 419 | "optional": true, 420 | "os": [ 421 | "win32" 422 | ], 423 | "engines": { 424 | "node": ">=12" 425 | } 426 | }, 427 | "node_modules/esbuild-windows-64": { 428 | "version": "0.14.25", 429 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", 430 | "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", 431 | "cpu": [ 432 | "x64" 433 | ], 434 | "dev": true, 435 | "optional": true, 436 | "os": [ 437 | "win32" 438 | ], 439 | "engines": { 440 | "node": ">=12" 441 | } 442 | }, 443 | "node_modules/esbuild-windows-arm64": { 444 | "version": "0.14.25", 445 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", 446 | "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", 447 | "cpu": [ 448 | "arm64" 449 | ], 450 | "dev": true, 451 | "optional": true, 452 | "os": [ 453 | "win32" 454 | ], 455 | "engines": { 456 | "node": ">=12" 457 | } 458 | }, 459 | "node_modules/generate-function": { 460 | "version": "2.3.1", 461 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 462 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 463 | "dependencies": { 464 | "is-property": "^1.0.2" 465 | } 466 | }, 467 | "node_modules/iconv-lite": { 468 | "version": "0.6.3", 469 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 470 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 471 | "dependencies": { 472 | "safer-buffer": ">= 2.1.2 < 3.0.0" 473 | }, 474 | "engines": { 475 | "node": ">=0.10.0" 476 | } 477 | }, 478 | "node_modules/is-property": { 479 | "version": "1.0.2", 480 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 481 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 482 | }, 483 | "node_modules/long": { 484 | "version": "4.0.0", 485 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 486 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 487 | }, 488 | "node_modules/lower-case": { 489 | "version": "2.0.2", 490 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 491 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 492 | "dependencies": { 493 | "tslib": "^2.0.3" 494 | } 495 | }, 496 | "node_modules/lower-case/node_modules/tslib": { 497 | "version": "2.3.1", 498 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 499 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 500 | }, 501 | "node_modules/lru-cache": { 502 | "version": "6.0.0", 503 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 504 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 505 | "dependencies": { 506 | "yallist": "^4.0.0" 507 | }, 508 | "engines": { 509 | "node": ">=10" 510 | } 511 | }, 512 | "node_modules/moo": { 513 | "version": "0.5.1", 514 | "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", 515 | "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" 516 | }, 517 | "node_modules/mysql2": { 518 | "version": "2.3.3", 519 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", 520 | "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", 521 | "dependencies": { 522 | "denque": "^2.0.1", 523 | "generate-function": "^2.3.1", 524 | "iconv-lite": "^0.6.3", 525 | "long": "^4.0.0", 526 | "lru-cache": "^6.0.0", 527 | "named-placeholders": "^1.1.2", 528 | "seq-queue": "^0.0.5", 529 | "sqlstring": "^2.3.2" 530 | }, 531 | "engines": { 532 | "node": ">= 8.0" 533 | } 534 | }, 535 | "node_modules/named-placeholders": { 536 | "version": "1.1.2", 537 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 538 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 539 | "dependencies": { 540 | "lru-cache": "^4.1.3" 541 | }, 542 | "engines": { 543 | "node": ">=6.0.0" 544 | } 545 | }, 546 | "node_modules/named-placeholders/node_modules/lru-cache": { 547 | "version": "4.1.5", 548 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 549 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 550 | "dependencies": { 551 | "pseudomap": "^1.0.2", 552 | "yallist": "^2.1.2" 553 | } 554 | }, 555 | "node_modules/named-placeholders/node_modules/yallist": { 556 | "version": "2.1.2", 557 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 558 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 559 | }, 560 | "node_modules/nearley": { 561 | "version": "2.20.1", 562 | "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", 563 | "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", 564 | "dependencies": { 565 | "commander": "^2.19.0", 566 | "moo": "^0.5.0", 567 | "railroad-diagrams": "^1.0.0", 568 | "randexp": "0.4.6" 569 | }, 570 | "bin": { 571 | "nearley-railroad": "bin/nearley-railroad.js", 572 | "nearley-test": "bin/nearley-test.js", 573 | "nearley-unparse": "bin/nearley-unparse.js", 574 | "nearleyc": "bin/nearleyc.js" 575 | }, 576 | "funding": { 577 | "type": "individual", 578 | "url": "https://nearley.js.org/#give-to-nearley" 579 | } 580 | }, 581 | "node_modules/nearley/node_modules/commander": { 582 | "version": "2.20.3", 583 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 584 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 585 | }, 586 | "node_modules/no-case": { 587 | "version": "3.0.4", 588 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 589 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 590 | "dependencies": { 591 | "lower-case": "^2.0.2", 592 | "tslib": "^2.0.3" 593 | } 594 | }, 595 | "node_modules/no-case/node_modules/tslib": { 596 | "version": "2.3.1", 597 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 598 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 599 | }, 600 | "node_modules/packet-reader": { 601 | "version": "1.0.0", 602 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 603 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 604 | }, 605 | "node_modules/param-case": { 606 | "version": "3.0.4", 607 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 608 | "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 609 | "dependencies": { 610 | "dot-case": "^3.0.4", 611 | "tslib": "^2.0.3" 612 | } 613 | }, 614 | "node_modules/param-case/node_modules/tslib": { 615 | "version": "2.3.1", 616 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 617 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 618 | }, 619 | "node_modules/pg": { 620 | "version": "8.7.3", 621 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz", 622 | "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==", 623 | "dependencies": { 624 | "buffer-writer": "2.0.0", 625 | "packet-reader": "1.0.0", 626 | "pg-connection-string": "^2.5.0", 627 | "pg-pool": "^3.5.1", 628 | "pg-protocol": "^1.5.0", 629 | "pg-types": "^2.1.0", 630 | "pgpass": "1.x" 631 | }, 632 | "engines": { 633 | "node": ">= 8.0.0" 634 | }, 635 | "peerDependencies": { 636 | "pg-native": ">=2.0.0" 637 | }, 638 | "peerDependenciesMeta": { 639 | "pg-native": { 640 | "optional": true 641 | } 642 | } 643 | }, 644 | "node_modules/pg-connection-string": { 645 | "version": "2.5.0", 646 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 647 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 648 | }, 649 | "node_modules/pg-int8": { 650 | "version": "1.0.1", 651 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 652 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 653 | "engines": { 654 | "node": ">=4.0.0" 655 | } 656 | }, 657 | "node_modules/pg-pool": { 658 | "version": "3.5.1", 659 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", 660 | "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==", 661 | "peerDependencies": { 662 | "pg": ">=8.0" 663 | } 664 | }, 665 | "node_modules/pg-protocol": { 666 | "version": "1.5.0", 667 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 668 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 669 | }, 670 | "node_modules/pg-types": { 671 | "version": "2.2.0", 672 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 673 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 674 | "dependencies": { 675 | "pg-int8": "1.0.1", 676 | "postgres-array": "~2.0.0", 677 | "postgres-bytea": "~1.0.0", 678 | "postgres-date": "~1.0.4", 679 | "postgres-interval": "^1.1.0" 680 | }, 681 | "engines": { 682 | "node": ">=4" 683 | } 684 | }, 685 | "node_modules/pgpass": { 686 | "version": "1.0.5", 687 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 688 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 689 | "dependencies": { 690 | "split2": "^4.1.0" 691 | } 692 | }, 693 | "node_modules/postgres-array": { 694 | "version": "2.0.0", 695 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 696 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 697 | "engines": { 698 | "node": ">=4" 699 | } 700 | }, 701 | "node_modules/postgres-bytea": { 702 | "version": "1.0.0", 703 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 704 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", 705 | "engines": { 706 | "node": ">=0.10.0" 707 | } 708 | }, 709 | "node_modules/postgres-date": { 710 | "version": "1.0.7", 711 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 712 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 713 | "engines": { 714 | "node": ">=0.10.0" 715 | } 716 | }, 717 | "node_modules/postgres-interval": { 718 | "version": "1.2.0", 719 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 720 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 721 | "dependencies": { 722 | "xtend": "^4.0.0" 723 | }, 724 | "engines": { 725 | "node": ">=0.10.0" 726 | } 727 | }, 728 | "node_modules/prettier": { 729 | "version": "2.6.2", 730 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", 731 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", 732 | "dev": true, 733 | "bin": { 734 | "prettier": "bin-prettier.js" 735 | }, 736 | "engines": { 737 | "node": ">=10.13.0" 738 | }, 739 | "funding": { 740 | "url": "https://github.com/prettier/prettier?sponsor=1" 741 | } 742 | }, 743 | "node_modules/pseudomap": { 744 | "version": "1.0.2", 745 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 746 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 747 | }, 748 | "node_modules/railroad-diagrams": { 749 | "version": "1.0.0", 750 | "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", 751 | "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=" 752 | }, 753 | "node_modules/randexp": { 754 | "version": "0.4.6", 755 | "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", 756 | "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", 757 | "dependencies": { 758 | "discontinuous-range": "1.0.0", 759 | "ret": "~0.1.10" 760 | }, 761 | "engines": { 762 | "node": ">=0.12" 763 | } 764 | }, 765 | "node_modules/ret": { 766 | "version": "0.1.15", 767 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 768 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 769 | "engines": { 770 | "node": ">=0.12" 771 | } 772 | }, 773 | "node_modules/safer-buffer": { 774 | "version": "2.1.2", 775 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 776 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 777 | }, 778 | "node_modules/seq-queue": { 779 | "version": "0.0.5", 780 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 781 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 782 | }, 783 | "node_modules/split2": { 784 | "version": "4.1.0", 785 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", 786 | "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", 787 | "engines": { 788 | "node": ">= 10.x" 789 | } 790 | }, 791 | "node_modules/sprintf-js": { 792 | "version": "1.1.2", 793 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 794 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 795 | }, 796 | "node_modules/sql-lint": { 797 | "version": "0.0.19", 798 | "resolved": "https://registry.npmjs.org/sql-lint/-/sql-lint-0.0.19.tgz", 799 | "integrity": "sha512-h/epb9LR2UgwC/+fN+ZxClna12vC6e2r3R3R4Ax2AsQ0s6cUt1jiYxylKSXTV3ijySRBD0q8O9q8O5qVxOVu/Q==", 800 | "dependencies": { 801 | "@types/moo": "^0.5.3", 802 | "@types/nearley": "^2.11.1", 803 | "@types/node": "^14.0.14", 804 | "@types/pg": "^7.14.11", 805 | "@types/sprintf-js": "^1.1.2", 806 | "commander": "^5.1.0", 807 | "moo": "^0.5.1", 808 | "mysql2": "^2.2.5", 809 | "nearley": "^2.19.3", 810 | "param-case": "^3.0.3", 811 | "pg": "^8.6.0", 812 | "sprintf-js": "^1.1.2" 813 | }, 814 | "bin": { 815 | "sql-lint": "dist/src/cli.js" 816 | } 817 | }, 818 | "node_modules/sql-lint/node_modules/@types/node": { 819 | "version": "14.18.12", 820 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", 821 | "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" 822 | }, 823 | "node_modules/sqlstring": { 824 | "version": "2.3.2", 825 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", 826 | "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", 827 | "engines": { 828 | "node": ">= 0.6" 829 | } 830 | }, 831 | "node_modules/typescript": { 832 | "version": "4.6.2", 833 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 834 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 835 | "dev": true, 836 | "bin": { 837 | "tsc": "bin/tsc", 838 | "tsserver": "bin/tsserver" 839 | }, 840 | "engines": { 841 | "node": ">=4.2.0" 842 | } 843 | }, 844 | "node_modules/xtend": { 845 | "version": "4.0.2", 846 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 847 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 848 | "engines": { 849 | "node": ">=0.4" 850 | } 851 | }, 852 | "node_modules/yallist": { 853 | "version": "4.0.0", 854 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 855 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 856 | } 857 | }, 858 | "dependencies": { 859 | "@types/moo": { 860 | "version": "0.5.5", 861 | "resolved": "https://registry.npmjs.org/@types/moo/-/moo-0.5.5.tgz", 862 | "integrity": "sha512-eXQpwnkI4Ntw5uJg6i2PINdRFWLr55dqjuYQaLHNjvqTzF14QdNWbCbml9sza0byyXNA0hZlHtcdN+VNDcgVHA==" 863 | }, 864 | "@types/nearley": { 865 | "version": "2.11.2", 866 | "resolved": "https://registry.npmjs.org/@types/nearley/-/nearley-2.11.2.tgz", 867 | "integrity": "sha512-jeyIDNBxxyWyEk6HemDC+t32b4fxthVsgWDxf88qD2WpX0QpOyY8JvA80AElPTBGRUsO0EKnr6OeVOjK3ZDdnA==" 868 | }, 869 | "@types/node": { 870 | "version": "17.0.21", 871 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 872 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" 873 | }, 874 | "@types/pg": { 875 | "version": "7.14.11", 876 | "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", 877 | "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", 878 | "requires": { 879 | "@types/node": "*", 880 | "pg-protocol": "^1.2.0", 881 | "pg-types": "^2.2.0" 882 | } 883 | }, 884 | "@types/sprintf-js": { 885 | "version": "1.1.2", 886 | "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz", 887 | "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==" 888 | }, 889 | "@types/vscode": { 890 | "version": "1.65.0", 891 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.65.0.tgz", 892 | "integrity": "sha512-wQhExnh2nEzpjDMSKhUvnNmz3ucpd3E+R7wJkOhBNK3No6fG3VUdmVmMOKD0A8NDZDDDiQcLNxe3oGmX5SjJ5w==", 893 | "dev": true 894 | }, 895 | "buffer-writer": { 896 | "version": "2.0.0", 897 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 898 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 899 | }, 900 | "commander": { 901 | "version": "5.1.0", 902 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 903 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" 904 | }, 905 | "denque": { 906 | "version": "2.0.1", 907 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", 908 | "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" 909 | }, 910 | "discontinuous-range": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", 913 | "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" 914 | }, 915 | "dot-case": { 916 | "version": "3.0.4", 917 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 918 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 919 | "requires": { 920 | "no-case": "^3.0.4", 921 | "tslib": "^2.0.3" 922 | }, 923 | "dependencies": { 924 | "tslib": { 925 | "version": "2.3.1", 926 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 927 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 928 | } 929 | } 930 | }, 931 | "esbuild": { 932 | "version": "0.14.25", 933 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", 934 | "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", 935 | "dev": true, 936 | "requires": { 937 | "esbuild-android-64": "0.14.25", 938 | "esbuild-android-arm64": "0.14.25", 939 | "esbuild-darwin-64": "0.14.25", 940 | "esbuild-darwin-arm64": "0.14.25", 941 | "esbuild-freebsd-64": "0.14.25", 942 | "esbuild-freebsd-arm64": "0.14.25", 943 | "esbuild-linux-32": "0.14.25", 944 | "esbuild-linux-64": "0.14.25", 945 | "esbuild-linux-arm": "0.14.25", 946 | "esbuild-linux-arm64": "0.14.25", 947 | "esbuild-linux-mips64le": "0.14.25", 948 | "esbuild-linux-ppc64le": "0.14.25", 949 | "esbuild-linux-riscv64": "0.14.25", 950 | "esbuild-linux-s390x": "0.14.25", 951 | "esbuild-netbsd-64": "0.14.25", 952 | "esbuild-openbsd-64": "0.14.25", 953 | "esbuild-sunos-64": "0.14.25", 954 | "esbuild-windows-32": "0.14.25", 955 | "esbuild-windows-64": "0.14.25", 956 | "esbuild-windows-arm64": "0.14.25" 957 | } 958 | }, 959 | "esbuild-android-64": { 960 | "version": "0.14.25", 961 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", 962 | "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", 963 | "dev": true, 964 | "optional": true 965 | }, 966 | "esbuild-android-arm64": { 967 | "version": "0.14.25", 968 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", 969 | "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", 970 | "dev": true, 971 | "optional": true 972 | }, 973 | "esbuild-darwin-64": { 974 | "version": "0.14.25", 975 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", 976 | "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", 977 | "dev": true, 978 | "optional": true 979 | }, 980 | "esbuild-darwin-arm64": { 981 | "version": "0.14.25", 982 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", 983 | "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", 984 | "dev": true, 985 | "optional": true 986 | }, 987 | "esbuild-freebsd-64": { 988 | "version": "0.14.25", 989 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", 990 | "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", 991 | "dev": true, 992 | "optional": true 993 | }, 994 | "esbuild-freebsd-arm64": { 995 | "version": "0.14.25", 996 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", 997 | "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", 998 | "dev": true, 999 | "optional": true 1000 | }, 1001 | "esbuild-linux-32": { 1002 | "version": "0.14.25", 1003 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", 1004 | "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", 1005 | "dev": true, 1006 | "optional": true 1007 | }, 1008 | "esbuild-linux-64": { 1009 | "version": "0.14.25", 1010 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", 1011 | "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", 1012 | "dev": true, 1013 | "optional": true 1014 | }, 1015 | "esbuild-linux-arm": { 1016 | "version": "0.14.25", 1017 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", 1018 | "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", 1019 | "dev": true, 1020 | "optional": true 1021 | }, 1022 | "esbuild-linux-arm64": { 1023 | "version": "0.14.25", 1024 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", 1025 | "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", 1026 | "dev": true, 1027 | "optional": true 1028 | }, 1029 | "esbuild-linux-mips64le": { 1030 | "version": "0.14.25", 1031 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", 1032 | "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", 1033 | "dev": true, 1034 | "optional": true 1035 | }, 1036 | "esbuild-linux-ppc64le": { 1037 | "version": "0.14.25", 1038 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", 1039 | "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", 1040 | "dev": true, 1041 | "optional": true 1042 | }, 1043 | "esbuild-linux-riscv64": { 1044 | "version": "0.14.25", 1045 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", 1046 | "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", 1047 | "dev": true, 1048 | "optional": true 1049 | }, 1050 | "esbuild-linux-s390x": { 1051 | "version": "0.14.25", 1052 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", 1053 | "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", 1054 | "dev": true, 1055 | "optional": true 1056 | }, 1057 | "esbuild-netbsd-64": { 1058 | "version": "0.14.25", 1059 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", 1060 | "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", 1061 | "dev": true, 1062 | "optional": true 1063 | }, 1064 | "esbuild-openbsd-64": { 1065 | "version": "0.14.25", 1066 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", 1067 | "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", 1068 | "dev": true, 1069 | "optional": true 1070 | }, 1071 | "esbuild-sunos-64": { 1072 | "version": "0.14.25", 1073 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", 1074 | "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", 1075 | "dev": true, 1076 | "optional": true 1077 | }, 1078 | "esbuild-windows-32": { 1079 | "version": "0.14.25", 1080 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", 1081 | "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", 1082 | "dev": true, 1083 | "optional": true 1084 | }, 1085 | "esbuild-windows-64": { 1086 | "version": "0.14.25", 1087 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", 1088 | "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", 1089 | "dev": true, 1090 | "optional": true 1091 | }, 1092 | "esbuild-windows-arm64": { 1093 | "version": "0.14.25", 1094 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", 1095 | "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", 1096 | "dev": true, 1097 | "optional": true 1098 | }, 1099 | "generate-function": { 1100 | "version": "2.3.1", 1101 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 1102 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 1103 | "requires": { 1104 | "is-property": "^1.0.2" 1105 | } 1106 | }, 1107 | "iconv-lite": { 1108 | "version": "0.6.3", 1109 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1110 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1111 | "requires": { 1112 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1113 | } 1114 | }, 1115 | "is-property": { 1116 | "version": "1.0.2", 1117 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1118 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 1119 | }, 1120 | "long": { 1121 | "version": "4.0.0", 1122 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1123 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1124 | }, 1125 | "lower-case": { 1126 | "version": "2.0.2", 1127 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1128 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1129 | "requires": { 1130 | "tslib": "^2.0.3" 1131 | }, 1132 | "dependencies": { 1133 | "tslib": { 1134 | "version": "2.3.1", 1135 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1136 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1137 | } 1138 | } 1139 | }, 1140 | "lru-cache": { 1141 | "version": "6.0.0", 1142 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1143 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1144 | "requires": { 1145 | "yallist": "^4.0.0" 1146 | } 1147 | }, 1148 | "moo": { 1149 | "version": "0.5.1", 1150 | "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", 1151 | "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" 1152 | }, 1153 | "mysql2": { 1154 | "version": "2.3.3", 1155 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", 1156 | "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", 1157 | "requires": { 1158 | "denque": "^2.0.1", 1159 | "generate-function": "^2.3.1", 1160 | "iconv-lite": "^0.6.3", 1161 | "long": "^4.0.0", 1162 | "lru-cache": "^6.0.0", 1163 | "named-placeholders": "^1.1.2", 1164 | "seq-queue": "^0.0.5", 1165 | "sqlstring": "^2.3.2" 1166 | } 1167 | }, 1168 | "named-placeholders": { 1169 | "version": "1.1.2", 1170 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 1171 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 1172 | "requires": { 1173 | "lru-cache": "^4.1.3" 1174 | }, 1175 | "dependencies": { 1176 | "lru-cache": { 1177 | "version": "4.1.5", 1178 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1179 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1180 | "requires": { 1181 | "pseudomap": "^1.0.2", 1182 | "yallist": "^2.1.2" 1183 | } 1184 | }, 1185 | "yallist": { 1186 | "version": "2.1.2", 1187 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1188 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 1189 | } 1190 | } 1191 | }, 1192 | "nearley": { 1193 | "version": "2.20.1", 1194 | "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", 1195 | "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", 1196 | "requires": { 1197 | "commander": "^2.19.0", 1198 | "moo": "^0.5.0", 1199 | "railroad-diagrams": "^1.0.0", 1200 | "randexp": "0.4.6" 1201 | }, 1202 | "dependencies": { 1203 | "commander": { 1204 | "version": "2.20.3", 1205 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1206 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 1207 | } 1208 | } 1209 | }, 1210 | "no-case": { 1211 | "version": "3.0.4", 1212 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1213 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1214 | "requires": { 1215 | "lower-case": "^2.0.2", 1216 | "tslib": "^2.0.3" 1217 | }, 1218 | "dependencies": { 1219 | "tslib": { 1220 | "version": "2.3.1", 1221 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1222 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1223 | } 1224 | } 1225 | }, 1226 | "packet-reader": { 1227 | "version": "1.0.0", 1228 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 1229 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 1230 | }, 1231 | "param-case": { 1232 | "version": "3.0.4", 1233 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 1234 | "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 1235 | "requires": { 1236 | "dot-case": "^3.0.4", 1237 | "tslib": "^2.0.3" 1238 | }, 1239 | "dependencies": { 1240 | "tslib": { 1241 | "version": "2.3.1", 1242 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1243 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1244 | } 1245 | } 1246 | }, 1247 | "pg": { 1248 | "version": "8.7.3", 1249 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz", 1250 | "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==", 1251 | "requires": { 1252 | "buffer-writer": "2.0.0", 1253 | "packet-reader": "1.0.0", 1254 | "pg-connection-string": "^2.5.0", 1255 | "pg-pool": "^3.5.1", 1256 | "pg-protocol": "^1.5.0", 1257 | "pg-types": "^2.1.0", 1258 | "pgpass": "1.x" 1259 | } 1260 | }, 1261 | "pg-connection-string": { 1262 | "version": "2.5.0", 1263 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 1264 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 1265 | }, 1266 | "pg-int8": { 1267 | "version": "1.0.1", 1268 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1269 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 1270 | }, 1271 | "pg-pool": { 1272 | "version": "3.5.1", 1273 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", 1274 | "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==", 1275 | "requires": {} 1276 | }, 1277 | "pg-protocol": { 1278 | "version": "1.5.0", 1279 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 1280 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 1281 | }, 1282 | "pg-types": { 1283 | "version": "2.2.0", 1284 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1285 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1286 | "requires": { 1287 | "pg-int8": "1.0.1", 1288 | "postgres-array": "~2.0.0", 1289 | "postgres-bytea": "~1.0.0", 1290 | "postgres-date": "~1.0.4", 1291 | "postgres-interval": "^1.1.0" 1292 | } 1293 | }, 1294 | "pgpass": { 1295 | "version": "1.0.5", 1296 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 1297 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 1298 | "requires": { 1299 | "split2": "^4.1.0" 1300 | } 1301 | }, 1302 | "postgres-array": { 1303 | "version": "2.0.0", 1304 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1305 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 1306 | }, 1307 | "postgres-bytea": { 1308 | "version": "1.0.0", 1309 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1310 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" 1311 | }, 1312 | "postgres-date": { 1313 | "version": "1.0.7", 1314 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1315 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 1316 | }, 1317 | "postgres-interval": { 1318 | "version": "1.2.0", 1319 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1320 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1321 | "requires": { 1322 | "xtend": "^4.0.0" 1323 | } 1324 | }, 1325 | "prettier": { 1326 | "version": "2.6.2", 1327 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", 1328 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", 1329 | "dev": true 1330 | }, 1331 | "pseudomap": { 1332 | "version": "1.0.2", 1333 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1334 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 1335 | }, 1336 | "railroad-diagrams": { 1337 | "version": "1.0.0", 1338 | "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", 1339 | "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=" 1340 | }, 1341 | "randexp": { 1342 | "version": "0.4.6", 1343 | "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", 1344 | "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", 1345 | "requires": { 1346 | "discontinuous-range": "1.0.0", 1347 | "ret": "~0.1.10" 1348 | } 1349 | }, 1350 | "ret": { 1351 | "version": "0.1.15", 1352 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 1353 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 1354 | }, 1355 | "safer-buffer": { 1356 | "version": "2.1.2", 1357 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1358 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1359 | }, 1360 | "seq-queue": { 1361 | "version": "0.0.5", 1362 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 1363 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 1364 | }, 1365 | "split2": { 1366 | "version": "4.1.0", 1367 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", 1368 | "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" 1369 | }, 1370 | "sprintf-js": { 1371 | "version": "1.1.2", 1372 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 1373 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 1374 | }, 1375 | "sql-lint": { 1376 | "version": "0.0.19", 1377 | "resolved": "https://registry.npmjs.org/sql-lint/-/sql-lint-0.0.19.tgz", 1378 | "integrity": "sha512-h/epb9LR2UgwC/+fN+ZxClna12vC6e2r3R3R4Ax2AsQ0s6cUt1jiYxylKSXTV3ijySRBD0q8O9q8O5qVxOVu/Q==", 1379 | "requires": { 1380 | "@types/moo": "^0.5.3", 1381 | "@types/nearley": "^2.11.1", 1382 | "@types/node": "^14.0.14", 1383 | "@types/pg": "^7.14.11", 1384 | "@types/sprintf-js": "^1.1.2", 1385 | "commander": "^5.1.0", 1386 | "moo": "^0.5.1", 1387 | "mysql2": "^2.2.5", 1388 | "nearley": "^2.19.3", 1389 | "param-case": "^3.0.3", 1390 | "pg": "^8.6.0", 1391 | "sprintf-js": "^1.1.2" 1392 | }, 1393 | "dependencies": { 1394 | "@types/node": { 1395 | "version": "14.18.12", 1396 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", 1397 | "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" 1398 | } 1399 | } 1400 | }, 1401 | "sqlstring": { 1402 | "version": "2.3.2", 1403 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", 1404 | "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" 1405 | }, 1406 | "typescript": { 1407 | "version": "4.6.2", 1408 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 1409 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 1410 | "dev": true 1411 | }, 1412 | "xtend": { 1413 | "version": "4.0.2", 1414 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1415 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1416 | }, 1417 | "yallist": { 1418 | "version": "4.0.0", 1419 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1420 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1421 | } 1422 | } 1423 | } 1424 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "inline-sql-syntax", 3 | "displayName": "Inline SQL", 4 | "description": "Highlight and lint SQL strings and SQL files. Python, Go, Rust, JS, TS, Ruby, Java, C#, PHP, Lua.", 5 | "version": "2.16.0", 6 | "author": "qufiwefefwoyn ", 7 | "publisher": "qufiwefefwoyn", 8 | "license": "MIT", 9 | "icon": "assets/logo.png", 10 | "repository": { 11 | "url": "https://github.com/barklan/inline_sql_syntax" 12 | }, 13 | "homepage": "https://github.com/barklan/inline_sql_syntax", 14 | "engines": { 15 | "vscode": "^1.63.0" 16 | }, 17 | "categories": [ 18 | "Linters", 19 | "Other" 20 | ], 21 | "keywords": [ 22 | "sql", 23 | "postgres", 24 | "mysql", 25 | "lint", 26 | "inline" 27 | ], 28 | "activationEvents": [ 29 | "onLanguage:python", 30 | "onLanguage:go", 31 | "onLanguage:javascript", 32 | "onLanguage:typescript", 33 | "onLanguage:java", 34 | "onLanguage:ruby", 35 | "onLanguage:csharp", 36 | "onLanguage:rust", 37 | "onLanguage:sql", 38 | "onLanguage:php", 39 | "onLanguage:lua" 40 | ], 41 | "main": "./out/extension.js", 42 | "browser": "./out/extension.js", 43 | "scripts": { 44 | "vscode:prepublish": "npm run esbuild-base -- --minify", 45 | "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --external:pg-native --format=cjs --platform=node", 46 | "esbuild": "npm run esbuild-base -- --sourcemap", 47 | "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", 48 | "test-compile": "tsc -p ./", 49 | "compile": "tsc -p ./", 50 | "lint": "npx prettier --check ./src", 51 | "watch": "tsc -watch -p ./" 52 | }, 53 | "contributes": { 54 | "grammars": [ 55 | { 56 | "path": "./syntaxes/highlight-sql-string.json", 57 | "scopeName": "inline-sql.injection", 58 | "injectTo": [ 59 | "source.python", 60 | "source.java", 61 | "source.ruby", 62 | "source.cs", 63 | "source.js", 64 | "source.ts", 65 | "source.vue", 66 | "source.svelte", 67 | "source.tsx", 68 | "source.rust", 69 | "text.html.php" 70 | ], 71 | "embeddedLanguages": { 72 | "meta.embedded.sql": "sql" 73 | } 74 | }, 75 | { 76 | "path": "./syntaxes/php-multiline.json", 77 | "scopeName": "php-multiline.injection", 78 | "injectTo": [ 79 | "text.html.php" 80 | ], 81 | "embeddedLanguages": { 82 | "meta.embedded.sql": "sql" 83 | } 84 | }, 85 | { 86 | "path": "./syntaxes/c-sharp-multiline.json", 87 | "scopeName": "c-sharp-multiline.injection", 88 | "injectTo": [ 89 | "source.cs" 90 | ], 91 | "embeddedLanguages": { 92 | "meta.embedded.sql": "sql" 93 | } 94 | }, 95 | { 96 | "path": "./syntaxes/lua-multiline.json", 97 | "scopeName": "lua-multiline.injection", 98 | "injectTo": [ 99 | "source.lua" 100 | ], 101 | "embeddedLanguages": { 102 | "meta.embedded.sql": "sql" 103 | } 104 | }, 105 | { 106 | "path": "./syntaxes/es6_inline.json", 107 | "scopeName": "es6_inline", 108 | "injectTo": [ 109 | "source.js", 110 | "source.js.jsx", 111 | "source.jsx", 112 | "source.ts", 113 | "source.tsx" 114 | ], 115 | "embeddedLanguages": { 116 | "meta.embedded.sql": "sql", 117 | "meta.template.expression.ts": "typescript" 118 | } 119 | }, 120 | { 121 | "path": "./syntaxes/golang-multiline.json", 122 | "scopeName": "golang-multiline.injection", 123 | "injectTo": [ 124 | "source.go" 125 | ], 126 | "embeddedLanguages": { 127 | "meta.embedded.sql": "sql" 128 | } 129 | } 130 | ], 131 | "configuration": { 132 | "title": "inline-sql-syntax", 133 | "properties": { 134 | "inlineSQL.enableDBIntegration": { 135 | "type": "boolean", 136 | "default": false, 137 | "markdownDescription": "Enable linting using real database." 138 | }, 139 | "inlineSQL.dbDriver": { 140 | "type": "string", 141 | "default": "postgres", 142 | "description": "Driver to use for verifying queries. It currently supports MySQL and Postgres.", 143 | "enum": [ 144 | "mysql", 145 | "postgres" 146 | ] 147 | }, 148 | "inlineSQL.dbHost": { 149 | "type": "string", 150 | "default": "localhost", 151 | "markdownDescription": "Database host address." 152 | }, 153 | "inlineSQL.dbPort": { 154 | "type": "number", 155 | "default": 5432, 156 | "markdownDescription": "Database port." 157 | }, 158 | "inlineSQL.dbUser": { 159 | "type": "string", 160 | "default": "postgres", 161 | "markdownDescription": "Database user." 162 | }, 163 | "inlineSQL.dbPassword": { 164 | "type": "string", 165 | "default": "postgres", 166 | "markdownDescription": "Database password." 167 | }, 168 | "inlineSQL.lintSQLFiles": { 169 | "type": "boolean", 170 | "default": false, 171 | "markdownDescription": "Enable linting for SQL files." 172 | } 173 | } 174 | } 175 | }, 176 | "devDependencies": { 177 | "@types/node": "^17.0.21", 178 | "@types/vscode": "^1.63.0", 179 | "esbuild": "^0.14.25", 180 | "prettier": "2.6.2", 181 | "typescript": "^4.6.2" 182 | }, 183 | "dependencies": { 184 | "sql-lint": "^0.0.19" 185 | }, 186 | "__metadata": { 187 | "id": "4d32ffbd-a404-4f22-9022-38a9e83e55f1", 188 | "publisherDisplayName": "qufiwefefwoyn", 189 | "publisherId": "5be51ce2-befe-4527-952a-3e1c764d2c4e", 190 | "isPreReleaseVersion": false, 191 | "targetPlatform": "undefined", 192 | "isApplicationScoped": false, 193 | "updated": false, 194 | "preRelease": false, 195 | "installedTimestamp": 1662490066638 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /src/configuration.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | export const PREFIX = 'inlineSQL'; 4 | 5 | export enum DRIVER { // eslint-disable-line no-shadow 6 | mysql = 'mysql', // eslint-disable-line no-unused-vars 7 | postgres = 'postgres', // eslint-disable-line no-unused-vars 8 | } 9 | 10 | export type Configuration = { 11 | enableDBIntegration: boolean; 12 | dbDriver: DRIVER; 13 | dbHost: string; 14 | dbPort: number; 15 | dbUser: string; 16 | dbPassword: string; 17 | lintSQLFiles: boolean; 18 | }; 19 | 20 | export function getConfiguration() { 21 | return vscode.workspace.getConfiguration(); 22 | } 23 | 24 | export function get(key: keyof Configuration): T { 25 | return getConfiguration().get( 26 | `${PREFIX}.${key}`, 27 | ) as unknown as T; 28 | } 29 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import sqlLint from 'sql-lint'; 3 | import * as configuration from './configuration'; 4 | 5 | export const PHP_SQL = '<<"""|"|'''|'|`)--\s*sql/; 7 | 8 | async function checkRange( 9 | log: vscode.OutputChannel, 10 | doc: vscode.TextDocument, 11 | range: vscode.Range, 12 | ): Promise { 13 | const diagnostics: vscode.Diagnostic[] = []; 14 | 15 | const sqlStr = doc.getText(range); 16 | 17 | let errors = null; 18 | log.appendLine(`linting sql: ${sqlStr}`); 19 | if (configuration.get('enableDBIntegration')) { 20 | try { 21 | log.appendLine('linting sql using live database'); 22 | errors = await sqlLint({ 23 | sql: sqlStr, 24 | driver: configuration.get('dbDriver'), 25 | host: configuration.get('dbHost'), 26 | port: configuration.get('dbPort'), 27 | user: configuration.get('dbUser'), 28 | password: configuration.get('dbPassword'), 29 | }); 30 | log.appendLine(`${errors.length} errors found`); 31 | } catch { 32 | log.appendLine('failed to make database request'); 33 | } 34 | } else { 35 | errors = await sqlLint({ sql: sqlStr }); 36 | log.appendLine(`${errors.length} errors found`); 37 | } 38 | 39 | if (errors != null) { 40 | for (let i = 0; i < errors.length; i += 1) { 41 | const diagnostic = new vscode.Diagnostic( 42 | range, 43 | errors[i].error, 44 | vscode.DiagnosticSeverity.Error, 45 | ); 46 | diagnostics.push(diagnostic); 47 | } 48 | } 49 | 50 | return diagnostics; 51 | } 52 | 53 | export async function refreshDiagnostics( 54 | doc: vscode.TextDocument, 55 | inlinesqlDiagnostics: vscode.DiagnosticCollection, 56 | log: vscode.OutputChannel, 57 | ): Promise { 58 | const diagnostics: vscode.Diagnostic[] = []; 59 | 60 | let startRangePosition = -1; 61 | let sqlStringBound = ''; 62 | let sqlStartLineIndex = -1; 63 | 64 | if ( 65 | configuration.get('lintSQLFiles') && 66 | doc.languageId === 'sql' 67 | ) { 68 | const lastLineIndex = doc.lineCount - 1; 69 | const lastLine = doc.lineAt(lastLineIndex); 70 | 71 | const range = new vscode.Range( 72 | 0, 73 | 0, 74 | lastLineIndex, 75 | lastLine.text.length, 76 | ); 77 | const subDiagnostics = await checkRange(log, doc, range); 78 | diagnostics.push(...subDiagnostics); 79 | 80 | inlinesqlDiagnostics.set(doc.uri, diagnostics); 81 | return; 82 | } 83 | let match; 84 | let phpPatternStart = -1; 85 | let sqlStringCnt = 0; 86 | for (let lineIndex = 0; lineIndex < doc.lineCount; lineIndex += 1) { 87 | let lineOfText = doc.lineAt(lineIndex).text; 88 | if (sqlStartLineIndex === -1) { 89 | if ((match = SQL_START_REGEX.exec(lineOfText)) !== null) { 90 | startRangePosition = match.index + match.groups!.token.length; 91 | sqlStringBound = match.groups!.token; 92 | sqlStartLineIndex = lineIndex; 93 | } else if ((phpPatternStart = lineOfText.indexOf(PHP_SQL)) !== -1) { 94 | startRangePosition = phpPatternStart + PHP_SQL.length; 95 | sqlStringBound = 'SQL;'; 96 | sqlStartLineIndex = lineIndex; 97 | } 98 | } else if (sqlStringBound !== '') { 99 | let endSqlIndex = lineOfText.indexOf(sqlStringBound); 100 | if (endSqlIndex !== -1) { 101 | sqlStringCnt += 1; 102 | const range = new vscode.Range( 103 | sqlStartLineIndex, 104 | startRangePosition, 105 | lineIndex, 106 | endSqlIndex, 107 | ); 108 | const subDiagnostics = await checkRange(log, doc, range); 109 | diagnostics.push(...subDiagnostics); 110 | sqlStartLineIndex = -1; 111 | sqlStringBound = ''; 112 | } 113 | } 114 | } 115 | const now = new Date().toISOString(); 116 | if (sqlStringBound !== '') { 117 | log.appendLine(`${now}: SQL string was not closed.`); 118 | } 119 | log.appendLine(`${now}: ${sqlStringCnt} SQL strings found and linted`); 120 | 121 | inlinesqlDiagnostics.set(doc.uri, diagnostics); 122 | } 123 | 124 | export async function subscribeToDocumentChanges( 125 | context: vscode.ExtensionContext, 126 | inlinesqlDiagnostics: vscode.DiagnosticCollection, 127 | log: vscode.OutputChannel, 128 | ): Promise { 129 | context.subscriptions.push( 130 | vscode.window.onDidChangeActiveTextEditor((editor) => { 131 | if (editor) { 132 | refreshDiagnostics(editor.document, inlinesqlDiagnostics, log); 133 | } 134 | }), 135 | ); 136 | 137 | context.subscriptions.push( 138 | vscode.workspace.onDidSaveTextDocument((e) => { 139 | const now = new Date().toISOString(); 140 | log.appendLine(`${now}: document saved, refreshing diagnostics`); 141 | refreshDiagnostics(e, inlinesqlDiagnostics, log); 142 | }), 143 | ); 144 | 145 | context.subscriptions.push( 146 | vscode.workspace.onDidCloseTextDocument((doc) => 147 | inlinesqlDiagnostics.delete(doc.uri), 148 | ), 149 | ); 150 | log.appendLine('watching active editors'); 151 | } 152 | 153 | export async function activate(context: vscode.ExtensionContext) { 154 | const inlinesqlDiagnostics = 155 | vscode.languages.createDiagnosticCollection('inlinesql'); 156 | context.subscriptions.push(inlinesqlDiagnostics); 157 | 158 | const log = vscode.window.createOutputChannel('Inline SQL'); 159 | log.appendLine('inline SQL activated'); 160 | 161 | await subscribeToDocumentChanges(context, inlinesqlDiagnostics, log); 162 | } 163 | -------------------------------------------------------------------------------- /syntaxes/c-sharp-multiline.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "c-sharp-multiline.injection", 3 | "fileTypes": [ 4 | "cs" 5 | ], 6 | "injectionSelector": [ 7 | "L:source -comment -string" 8 | ], 9 | "patterns": [ 10 | { 11 | "comment": "C# multi-lines strings", 12 | "begin": "(@\")(--\\s*sql)", 13 | "beginCaptures": { 14 | "2": { 15 | "name": "comment.sql" 16 | } 17 | }, 18 | "end": "(\")", 19 | "patterns": [ 20 | { 21 | "include": "source.sql" 22 | } 23 | ] 24 | }, 25 | { 26 | "comment": "C# multi-lines strings", 27 | "begin": "(@\")(SELECT |INSERT INTO |DELETE |UPDATE |CREATE TABLE |CREATE INDEX)", 28 | "beginCaptures": { 29 | "2": { 30 | "name": "keyword.sql" 31 | } 32 | }, 33 | "end": "(\")", 34 | "patterns": [ 35 | { 36 | "include": "source.sql" 37 | } 38 | ] 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /syntaxes/es6_inline.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "es6_inline", 3 | "fileTypes": [ 4 | "js", 5 | "jsx", 6 | "ts", 7 | "tsx" 8 | ], 9 | "injectionSelector": "L:source.js -comment -string, L:source.jsx -comment -string, L:source.js.jsx -comment -string, L:source.ts -comment -string, L:source.js (string.quoted.double.html, string.quoted.single.html), L:source.jsx (string.quoted.double.html, string.quoted.single.html), L:source.js.jsx (string.quoted.double.html, string.quoted.single.html), L:source.ts (string.quoted.double.html, string.quoted.single.html), L:source.tsx (string.quoted.double.html, string.quoted.single.html)", 10 | "injections": { 11 | "L:source": { 12 | "patterns": [ 13 | { 14 | "match": "<", 15 | "name": "invalid.illegal.bad-angle-bracket.html" 16 | } 17 | ] 18 | } 19 | }, 20 | "patterns": [ 21 | { 22 | "contentName": "meta.embedded.sql", 23 | "begin": "(?x)(\\s*?(\\w+\\.)?(?:sql|/\\*\\s*sql\\s*\\*/)\\s*)(`)", 24 | "beginCaptures": { 25 | "0": { 26 | "name": "string.template.ts, punctuation.definition.string.template.begin.ts" 27 | }, 28 | "1": { 29 | "name": "entity.name.function.tagged-template.ts" 30 | } 31 | }, 32 | "end": "(`)", 33 | "endCaptures": { 34 | "0": { 35 | "name": "string.template.ts, punctuation.definition.string.template.end.ts" 36 | } 37 | }, 38 | "patterns": [ 39 | { 40 | "include": "source.ts#template-substitution-element" 41 | }, 42 | { 43 | "include": "source.sql" 44 | } 45 | ] 46 | }, 47 | { 48 | "include": "source.ts#template-substitution-element" 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /syntaxes/golang-multiline.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "golang-multiline.injection", 3 | "fileTypes": [ 4 | "go" 5 | ], 6 | "injectionSelector": [ 7 | "L:string.quoted.raw.go -comment" 8 | ], 9 | "patterns": [ 10 | { 11 | "name": "meta.embedded.sql", 12 | "begin": "\\s*((?i)(select|with|insert|update|create table|create index)(?=\\s))|(--\\w+)", 13 | "end": "(?=`)", 14 | "beginCaptures": { 15 | "2": { "name": "keyword.other.DML.sql" }, 16 | "3": { "name": "comment.line.double-dash.sql" } 17 | }, 18 | "patterns": [ 19 | { "include": "source.sql" } 20 | ] 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /syntaxes/highlight-sql-string.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "inline-sql.injection", 3 | "fileTypes": [ 4 | "py", 5 | "js", 6 | "jsx", 7 | "ts", 8 | "tsx", 9 | "vue", 10 | "svelte", 11 | "java", 12 | "rb", 13 | "cs", 14 | "rs", 15 | "php" 16 | ], 17 | "injectionSelector": [ 18 | "text.html.php", 19 | "L:source -comment -string" 20 | ], 21 | "patterns": [ 22 | { 23 | "comment": "Rust multi-line raw strings", 24 | "begin": "(b?r)(#*)(\")(--\\s*sql)", 25 | "beginCaptures": { 26 | "1": { 27 | "name": "string.quoted.byte.raw.rust" 28 | }, 29 | "2": { 30 | "name": "string.raw.rust" 31 | }, 32 | "3": { 33 | "name": "string.rust" 34 | }, 35 | "4": { 36 | "name": "comment.sql" 37 | } 38 | }, 39 | "end": "(\")(\\2)", 40 | "endCaptures": { 41 | "1": { 42 | "name": "string.rust" 43 | }, 44 | "2": { 45 | "name": "string.raw.rust" 46 | } 47 | }, 48 | "patterns": [ 49 | { 50 | "include": "source.sql" 51 | } 52 | ] 53 | }, 54 | { 55 | "begin": "(\")(--\\s*sql)", 56 | "beginCaptures": { 57 | "2": { 58 | "name": "comment.sql" 59 | } 60 | }, 61 | "end": "(\")", 62 | "patterns": [ 63 | { 64 | "include": "source.sql" 65 | } 66 | ] 67 | }, 68 | { 69 | "begin": "(?i)(\")(SELECT |INSERT INTO |DELETE |UPDATE |CREATE TABLE |CREATE INDEX )", 70 | "beginCaptures": { 71 | "2": { 72 | "name": "keyword.sql" 73 | } 74 | }, 75 | "end": "(\")", 76 | "patterns": [ 77 | { 78 | "include": "source.sql" 79 | } 80 | ] 81 | }, 82 | { 83 | "begin": "(`)(--\\s*sql)", 84 | "beginCaptures": { 85 | "2": { 86 | "name": "comment.sql" 87 | } 88 | }, 89 | "end": "(`)", 90 | "patterns": [ 91 | { 92 | "include": "source.sql" 93 | } 94 | ] 95 | }, 96 | { 97 | "begin": "(?i)(`)(SELECT |INSERT INTO |DELETE |UPDATE |CREATE TABLE |CREATE INDEX)", 98 | "beginCaptures": { 99 | "2": { 100 | "name": "keyword.sql" 101 | } 102 | }, 103 | "end": "(`)", 104 | "patterns": [ 105 | { 106 | "include": "source.sql" 107 | } 108 | ] 109 | }, 110 | { 111 | "comment": "Python multi-line strings", 112 | "begin": "f?(\"\"\")(--\\s*sql)", 113 | "beginCaptures": { 114 | "2": { 115 | "name": "comment.sql" 116 | } 117 | }, 118 | "end": "(\"\"\")", 119 | "patterns": [ 120 | { 121 | "include": "source.sql" 122 | } 123 | ] 124 | }, 125 | { 126 | "begin": "(?i)(\"\"\")(SELECT |INSERT INTO |DELETE |UPDATE |CREATE TABLE |CREATE INDEX)", 127 | "beginCaptures": { 128 | "2": { 129 | "name": "keyword.sql" 130 | } 131 | }, 132 | "end": "(\"\"\")", 133 | "patterns": [ 134 | { 135 | "include": "source.sql" 136 | } 137 | ] 138 | } 139 | ] 140 | } 141 | -------------------------------------------------------------------------------- /syntaxes/lua-multiline.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "lua-multiline.injection", 3 | "fileTypes": [ 4 | "lua" 5 | ], 6 | "injectionSelector": [ 7 | "L:source -comment -string" 8 | ], 9 | "patterns": [ 10 | { 11 | "comment": "Lua multi-lines strings", 12 | "begin": "(\\[\\=*\\[)(--\\s*sql)", 13 | "beginCaptures": { 14 | "2": { 15 | "name": "comment.sql" 16 | } 17 | }, 18 | "end": "(\\]\\=*\\])", 19 | "patterns": [ 20 | { 21 | "include": "source.sql" 22 | } 23 | ] 24 | }, 25 | { 26 | "comment": "Lua multi-lines strings", 27 | "begin": "(\\[\\=*\\[)(SELECT |INSERT INTO |DELETE |UPDATE |CREATE TABLE |CREATE INDEX)", 28 | "beginCaptures": { 29 | "2": { 30 | "name": "keyword.sql" 31 | } 32 | }, 33 | "end": "(\\]\\=*\\])", 34 | "patterns": [ 35 | { 36 | "include": "source.sql" 37 | } 38 | ] 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /syntaxes/php-multiline.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "php-multiline.injection", 3 | "fileTypes": [ 4 | "php", 5 | "php4", 6 | "php5" 7 | ], 8 | "injectionSelector": [ 9 | "text.html.php" 10 | ], 11 | "patterns": [ 12 | { 13 | "comment": "PHP multi-line strings", 14 | "begin": "(<<<)(SQL)", 15 | "beginCaptures": { 16 | "2": { 17 | "name": "entity.name.tag" 18 | } 19 | }, 20 | "end": "^\\s*(SQL);", 21 | "endCaptures": { 22 | "1": { 23 | "name": "entity" 24 | } 25 | }, 26 | "patterns": [ 27 | { 28 | "include": "source.sql" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /test/testdata/es6.js: -------------------------------------------------------------------------------- 1 | const query = sql` 2 | select * from book; 3 | `; 4 | -------------------------------------------------------------------------------- /test/testdata/multiline.cs: -------------------------------------------------------------------------------- 1 | string query = @"--sql 2 | select * FROM book WHERE id = 34;"; 3 | 4 | string another = @"--sql 5 | select * from book 6 | where id = 34;"; 7 | 8 | string more = @"SELECT * 9 | from book;"; 10 | 11 | string queryx = "SELECT * from book;" 12 | -------------------------------------------------------------------------------- /test/testdata/multiline.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | func main() { 4 | // On live DB error should be: 5 | // [error] relation "book" does not exist 6 | query := `--sql 7 | select * from book where id = 34; 8 | ` 9 | 10 | another := `--sql 11 | select * from book where id = 34; 12 | ` 13 | 14 | notQuery := ` 15 | SELECT This a query and should be considered 16 | as one even though --sql comment is not present. 17 | Also, I hate manual testing.; 18 | ` 19 | 20 | notQuery2 := ` 21 | this is really not a query, but we do demonstrate the only known issue 22 | with this approach, where an in-string sql keyword will make the sql injection 23 | mis-fire. 24 | ` 25 | 26 | more := `--sql 27 | select * from book where id = 34; 28 | ` 29 | 30 | more2 := ` 31 | --sql 32 | select * from book where id = 34; 33 | ` 34 | 35 | more3 := `--sql; select * from book;` 36 | 37 | more4 := `select * from book;` 38 | 39 | more5 := `SELECT * from book;` 40 | 41 | more6 := ` 42 | SELECT * from book; 43 | ` 44 | 45 | more7 := ` 46 | with hihi as ( 47 | 48 | ) 49 | ` 50 | 51 | print(query, another, more, notQuery, notQuery2, more2, more3, more4, more5, more6, more7) 52 | } 53 | 54 | func add(a, b int) int { 55 | return a + b 56 | } 57 | -------------------------------------------------------------------------------- /test/testdata/multiline.lua: -------------------------------------------------------------------------------- 1 | local testQuery = [=[--sql 2 | SELECT * FROM employees WHERE [First Name] = "Jared"; 3 | ]=] 4 | 5 | local testQuery2 = [[INSERT INTO locations (x, y, locationName) VALUES (20, 43, "Monument")]] 6 | -------------------------------------------------------------------------------- /test/testdata/multiline.php: -------------------------------------------------------------------------------- 1 | $query = <<createAndInsertValue( 2 | "CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT, data VARCHAR (50) NOT NULL, PRIMARY KEY (id))", 3 | "INSERT INTO test (data) VALUES('Hello World')" 4 | ); 5 | -------------------------------------------------------------------------------- /test/testdata/string.py: -------------------------------------------------------------------------------- 1 | query = "SELECT 'id', 'name', 'age' FROM user;" 2 | 3 | query = "--sql; SELECT title FROM book;" 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2020", 5 | "lib": ["es2020"], 6 | "outDir": "out", 7 | "sourceMap": true, 8 | "strict": true, 9 | "rootDir": "src" 10 | }, 11 | "exclude": [ 12 | "node_modules", 13 | ".vscode-test" 14 | ] 15 | } 16 | --------------------------------------------------------------------------------