├── .gitignore ├── .npmignore ├── .prettierrc ├── .vscode └── launch.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── fixtures ├── 1.groq ├── 2.groq ├── 3.groq ├── 4.groq ├── 5.groq ├── 6.groq ├── 7.groq ├── 8.groq ├── 9.groq ├── test.js └── test.md ├── grammars ├── groq.js.json ├── groq.json └── groq.md.json ├── images └── icon.png ├── language └── language-configuration.json ├── package-lock.json ├── package.json ├── screenshots ├── codelenspreview.png └── previewofquery.png ├── src ├── config │ └── findConfig.ts ├── extension.ts ├── providers │ ├── content-provider.tsx │ └── groq-codelens-provider.ts ├── query.ts └── resultView │ └── ResultView.tsx └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode-test 3 | out 4 | *.vsix 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | fixtures/** 2 | .vscode/** 3 | .vscode-test/** 4 | .git/** 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "printWidth": 100, 4 | "bracketSpacing": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that launches the extension inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | .git/** 4 | .gitignore 5 | vsc-extension-quickstart.md 6 | fixtures/** 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes will be documented in this file. 4 | 5 | ## 0.2.0 - 2024-08-06 6 | 7 | - BREAKING CHANGE: Drop support for Sanity Studio v2 8 | - Support Sanity Studio v3 and new groq `defineQuery` method 9 | 10 | ## 0.1.4 - 2021-01-19 11 | 12 | - Fix Mac key binding for 'sanity.executeGroq' to not conflict with VSCode default keybindings 13 | 14 | ## 0.1.1 - 2020-10-13 15 | 16 | - Upgraded `@sanity/client` 17 | 18 | ## 0.1.0 - 2020-10-13 19 | 20 | - Added support for running GROQ-queries 21 | 22 | ## 0.0.3 - 2020-03-15 23 | 24 | - Added syntax highlighting for GROQ inside `.svelte`, `.php` files (#3) 25 | 26 | ## 0.0.2 - 2018-12-11 27 | 28 | - Update package description 29 | 30 | ## 0.0.1 - 2018-12-11 31 | 32 | - Initial release 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Sanity.io 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 | # vscode-sanity 2 | 3 | Extension for [Visual Studio Code](https://code.visualstudio.com/) that makes developing applications for [Sanity.io](https://www.sanity.io/) that much more awesome. 4 | 5 | ## Features 6 | 7 | ### GROQ syntax highlighting 8 | 9 | Syntax highlighting for the GROQ query language is available in the following situations: 10 | 11 | - Files with the `.groq` extension 12 | - Fenced code blocks in Markdown with the `groq` tag 13 | - Tagged template literals with the `groq` tag 14 | - Queries using the `defineQuery` method 15 | - Template literals prefixed with the `/* groq */` comment 16 | - Template literals starting with a `// groq` comment 17 | 18 | ### Execute GROQ-queries 19 | 20 | When GROQ-queries are detected, the extension will allow you to run the query and displays the result as JSON in a separate tab. 21 | 22 | The project ID and dataset used is determined by finding `sanity.cli.ts` in the workspace. If multiple files are found, the extension will prompt you to select one. 23 | 24 | If the GROQ file/query has any variables, then extension asks for a relative filename of a JSON-file containing an object of key-value mappings. It autofills the param filename based on the current file with a `.json` extension, if it exists. 25 | 26 | ![Execute GROQ in VS Code](https://raw.githubusercontent.com/sanity-io/vscode-sanity/main/screenshots/previewofquery.png) 27 | 28 | ## Usage 29 | 30 | Install the [VSCode Sanity.io Extension](https://marketplace.visualstudio.com/items?itemName=sanity-io.vscode-sanity). This extension adds syntax highlighting for GROQ-files and `groq` tags. 31 | 32 | ## Development 33 | 34 | 1. Clone the repository - https://github.com/sanity-io/vscode-sanity 35 | 2. `npm install` 36 | 3. Open it in VSCode 37 | 4. Go to the debugging section and run the launch program "Extension" 38 | 5. This will open another VSCode instance with extension enabled 39 | 6. Open a file that should be syntax highlighted 40 | 7. Make changes to the extension code, then press (`Ctrl+R` or `Cmd+R` on Mac) in the syntax highlighted file to test the changes 41 | 42 | ## License 43 | 44 | MIT 45 | -------------------------------------------------------------------------------- /fixtures/1.groq: -------------------------------------------------------------------------------- 1 | * -------------------------------------------------------------------------------- /fixtures/2.groq: -------------------------------------------------------------------------------- 1 | *[_type == "movie"] -------------------------------------------------------------------------------- /fixtures/3.groq: -------------------------------------------------------------------------------- 1 | { 2 | "movies": *[_type == "movie"] 3 | } 4 | -------------------------------------------------------------------------------- /fixtures/4.groq: -------------------------------------------------------------------------------- 1 | *[_type == "movie"][0...10] 2 | -------------------------------------------------------------------------------- /fixtures/5.groq: -------------------------------------------------------------------------------- 1 | *[_type == $type && title in ['a', "b", 'c']] | order(_createdAt desc) [0...10] { 2 | ..., 3 | } 4 | -------------------------------------------------------------------------------- /fixtures/6.groq: -------------------------------------------------------------------------------- 1 | *[title in ['a', "b", 'c']] | order(_createdAt desc) [0...10] { 2 | "names": ["espen", 'bjørge', ...["simen", "even"]], 3 | ..., 4 | } 5 | -------------------------------------------------------------------------------- /fixtures/7.groq: -------------------------------------------------------------------------------- 1 | *[_type == "book" && defined(author)] [0...10] { 2 | title, 3 | coverImage { 4 | asset->{url, mimeType}, 5 | crop 6 | }, 7 | 8 | // Expand the author reference 9 | author->, 10 | 11 | // Just need the title for the publisher 12 | "publisher": publisher->title, 13 | } 14 | -------------------------------------------------------------------------------- /fixtures/8.groq: -------------------------------------------------------------------------------- 1 | *[_type == $type && title in ['a', "b", 'c']] | order(_createdAt desc) [0...10] { 2 | ..., 3 | 4 | author->, 5 | "tags": tags[]->, 6 | 7 | "even": index % 2 == 0, 8 | 'odd': index % 2 != 0, 9 | 10 | // Only fetch news for recent movies 11 | ...select(releaseDate >= $recentThreshold => { 12 | "news": *[_type == 'news' && movie._ref == ^._id], 13 | }), 14 | 15 | ...select(popularity > 20 && field == !false && rating >= 7.0 => { 16 | "awards": *[_type == 'award' && movie._ref == @._id], 17 | "related": *[_type == 'movie' && references(^._id)].title, 18 | "cast": castMembers[characterName in ['Ripley', 'Lambert']].person->{_id, name}, 19 | "featured": true, 20 | "count": count(*[_type == 'movie' && rating == 'R']) 21 | }) 22 | } 23 | -------------------------------------------------------------------------------- /fixtures/9.groq: -------------------------------------------------------------------------------- 1 | *[_type=='movie']{ 2 | ..., 3 | releaseDate >= '2018-06-01' => { 4 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 5 | "news": *[_type == 'news' && movie._ref == ^._id], 6 | }, 7 | popularity > 20 && rating > 7.0 => { 8 | "featured": true, 9 | "awards": *[_type == 'award' && movie._ref == ^._id], 10 | }, 11 | } -------------------------------------------------------------------------------- /fixtures/test.js: -------------------------------------------------------------------------------- 1 | import {defineQuery} from 'groq' 2 | const groq = () => '' 3 | 4 | const query = groq`*[_type=='movie']{ 5 | ..., 6 | releaseDate >= '2018-06-01' => { 7 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 8 | "news": *[_type == 'news' && movie._ref == ^._id], 9 | }, 10 | popularity > 20 && rating > 7.0 => { 11 | "featured": true, 12 | "awards": *[_type == 'award' && movie._ref == ^._id], 13 | }, 14 | } 15 | ` 16 | 17 | const query2 = /* groq */` 18 | *[_type=='movie']{ 19 | ..., 20 | releaseDate >= '2018-06-01' => { 21 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 22 | "news": *[_type == 'news' && movie._ref == ^._id], 23 | }, 24 | popularity > 20 && rating > 7.0 => { 25 | "featured": true, 26 | "awards": *[_type == 'award' && movie._ref == ^._id], 27 | }, 28 | } 29 | ` 30 | 31 | const query3 = `// groq 32 | *[_type=='movie']{ 33 | ..., 34 | releaseDate >= '2018-06-01' => { 35 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 36 | "news": *[_type == 'news' && movie._ref == ^._id], 37 | }, 38 | popularity > 20 && rating > 7.0 => { 39 | "featured": true, 40 | "awards": *[_type == 'award' && movie._ref == ^._id], 41 | }, 42 | } 43 | ` 44 | 45 | const query4 = defineQuery(`*[_type=='movie']{ 46 | ..., 47 | releaseDate >= '2018-06-01' => { 48 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 49 | "news": *[_type == 'news' && movie._ref == ^._id], 50 | }, 51 | popularity > 20 && rating > 7.0 => { 52 | "featured": true, 53 | "awards": *[_type == 'award' && movie._ref == ^._id], 54 | }, 55 | }`) 56 | -------------------------------------------------------------------------------- /fixtures/test.md: -------------------------------------------------------------------------------- 1 | # Foo 2 | 3 | ```groq 4 | *[_type=='movie']{ 5 | ..., 6 | releaseDate >= '2018-06-01' => { 7 | "screenings": *[_type == 'screening' && movie._ref == ^._id], 8 | "news": *[_type == 'news' && movie._ref == ^._id], 9 | }, 10 | popularity > 20 && rating > 7.0 => { 11 | "featured": true, 12 | "awards": *[_type == 'award' && movie._ref == ^._id], 13 | }, 14 | } 15 | ``` 16 | -------------------------------------------------------------------------------- /grammars/groq.js.json: -------------------------------------------------------------------------------- 1 | { 2 | "fileTypes": [ 3 | "js", 4 | "jsx", 5 | "ts", 6 | "tsx", 7 | "vue" 8 | ], 9 | "injectionSelector": "L:source -string -comment", 10 | "patterns": [ 11 | { 12 | "contentName": "meta.embedded.block.groq", 13 | "begin": "\\s*+(groq|(/\\* groq \\*/))\\s*(`)", 14 | "beginCaptures": { 15 | "1": { 16 | "name": "entity.name.function.tagged-template.js" 17 | }, 18 | "2": { 19 | "name": "comment.groq.js" 20 | }, 21 | "3": { 22 | "name": "punctuation.definition.string.template.begin.js" 23 | } 24 | }, 25 | "end": "`", 26 | "endCaptures": { 27 | "0": { 28 | "name": "punctuation.definition.string.template.end.js" 29 | } 30 | }, 31 | "patterns": [ 32 | { 33 | "include": "source.groq" 34 | } 35 | ] 36 | }, 37 | { 38 | "name": "taggedTemplates", 39 | "contentName": "meta.embedded.block.groq", 40 | "begin": "(`)(//\\s*groq)", 41 | "beginCaptures": { 42 | "1": { 43 | "name": "punctuation.definition.string.template.begin.js" 44 | }, 45 | "2": { 46 | "name": "comment.line.groq.js" 47 | } 48 | }, 49 | "end": "`", 50 | "endCaptures": { 51 | "0": { 52 | "name": "punctuation.definition.string.template.end.js" 53 | } 54 | }, 55 | "patterns": [ 56 | { 57 | "include": "source.groq" 58 | } 59 | ] 60 | }, 61 | { 62 | "name": "meta.embedded.block.defineQuery", 63 | "begin": "(defineQuery)\\s*\\(\\s*(['\"`])", 64 | "contentName": "meta.embedded.block.groq", 65 | "beginCaptures": { 66 | "1": { 67 | "name": "keyword.other.js" 68 | }, 69 | "2": { 70 | "name": "punctuation.definition.string.begin.js" 71 | } 72 | }, 73 | "end": "(['\"`])\\s*\\)", 74 | "endCaptures": { 75 | "1": { 76 | "name": "punctuation.definition.string.end.js" 77 | } 78 | }, 79 | "patterns": [ 80 | { 81 | "include": "source.groq" 82 | } 83 | ] 84 | } 85 | ], 86 | "scopeName": "inline.groq" 87 | } 88 | -------------------------------------------------------------------------------- /grammars/groq.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", 3 | "name": "GROQ", 4 | "scopeName": "source.groq", 5 | "patterns": [ 6 | { 7 | "include": "#query" 8 | }, 9 | { 10 | "include": "#value" 11 | }, 12 | { 13 | "include": "#pair" 14 | } 15 | ], 16 | "repository": { 17 | "query": { 18 | "patterns": [ 19 | { 20 | "include": "#nullary-access-operator" 21 | }, 22 | { 23 | "include": "#arraylike" 24 | }, 25 | { 26 | "include": "#pipe" 27 | }, 28 | { 29 | "include": "#sort-order" 30 | }, 31 | { 32 | "include": "#filter" 33 | } 34 | ] 35 | }, 36 | "variable": { 37 | "match": "\\$[_A-Za-z][_0-9A-Za-z]*", 38 | "name": "variable.other.groq" 39 | }, 40 | "keyword": { 41 | "match": "\\b(asc|desc|in|match)\\b", 42 | "name": "keyword.other.groq" 43 | }, 44 | "comparison": { 45 | "match": "(==|!=|>=|<=|(?|<)", 46 | "name": "keyword.operator.comparison.groq" 47 | }, 48 | "operator": { 49 | "match": "(\\+|-|\\*{1,2}|/|%)", 50 | "name": "keyword.operator.arithmetic.groq" 51 | }, 52 | "pipe": { 53 | "match": "\\|", 54 | "name": "keyword.operator.pipe.groq" 55 | }, 56 | "logical": { 57 | "match": "(!|&&|(\\|\\|))", 58 | "name": "keyword.operator.logical.groq" 59 | }, 60 | "reference": { 61 | "match": "\\->", 62 | "name": "keyword.operator.reference.groq" 63 | }, 64 | "pair": { 65 | "patterns": [ 66 | { 67 | "include": "#identifier" 68 | }, 69 | { 70 | "include": "#value" 71 | }, 72 | { 73 | "include": "#filter" 74 | }, 75 | { 76 | "match": "=>", 77 | "name": "keyword.operator.pair.groq" 78 | } 79 | ] 80 | }, 81 | "arraylike": { 82 | "begin": "\\[", 83 | "beginCaptures": { 84 | "0": { 85 | "name": "punctuation.definition.bracket.begin.groq" 86 | } 87 | }, 88 | "end": "\\](\\s*\\.)?", 89 | "endCaptures": { 90 | "0": { 91 | "name": "punctuation.definition.bracket.end.groq" 92 | }, 93 | "1": { 94 | "name": "keyword.operator.descendant.groq" 95 | } 96 | }, 97 | "patterns": [ 98 | { 99 | "include": "#range" 100 | }, 101 | { 102 | "include": "#filter" 103 | }, 104 | { 105 | "include": "#array-values" 106 | } 107 | ] 108 | }, 109 | "array": { 110 | "name": "meta.structure.array.groq", 111 | "begin": "\\[", 112 | "beginCaptures": { 113 | "0": { 114 | "name": "punctuation.definition.bracket.begin.groq" 115 | } 116 | }, 117 | "end": "\\]", 118 | "endCaptures": { 119 | "0": { 120 | "name": "punctuation.definition.bracket.end.groq" 121 | } 122 | }, 123 | "patterns": [ 124 | { 125 | "include": "#array-values" 126 | } 127 | ] 128 | }, 129 | "range": { 130 | "name": "meta.structure.range.groq", 131 | "match": "\\s*(\\d+)\\s*(\\.{2,3})\\s*(\\d+)\\s*", 132 | "captures": { 133 | "1": { 134 | "name": "constant.numeric.groq" 135 | }, 136 | "2": { 137 | "name": "keyword.operator.range.groq" 138 | }, 139 | "3": { 140 | "name": "constant.numeric.groq" 141 | } 142 | } 143 | }, 144 | "spread": { 145 | "name": "meta.structure.spread.groq", 146 | "begin": "\\.\\.\\.", 147 | "beginCaptures": { 148 | "0": { 149 | "name": "punctuation.definition.spread.begin.groq" 150 | } 151 | }, 152 | "end": "(?=.)", 153 | "applyEndPatternLast": 1, 154 | "endCaptures": { 155 | "0": { 156 | "name": "punctuation.definition.spread.end.groq" 157 | } 158 | }, 159 | "patterns": [ 160 | { 161 | "include": "#array" 162 | }, 163 | { 164 | "include": "#function-call" 165 | }, 166 | { 167 | "include": "#projection" 168 | } 169 | ] 170 | }, 171 | "array-values": { 172 | "name": "meta.structure.array-values.groq", 173 | "patterns": [ 174 | { 175 | "include": "#value" 176 | }, 177 | { 178 | "include": "#spread" 179 | }, 180 | { 181 | "match": ",", 182 | "name": "punctuation.separator.array.groq" 183 | }, 184 | { 185 | "match": "[^\\s\\]]", 186 | "name": "invalid.illegal.expected-array-separator.groq" 187 | } 188 | ] 189 | }, 190 | "filter": { 191 | "name": "meta.structure.filter.groq", 192 | "patterns": [ 193 | { 194 | "include": "#function-call" 195 | }, 196 | { 197 | "include": "#keyword" 198 | }, 199 | { 200 | "include": "#constant" 201 | }, 202 | { 203 | "include": "#identifier" 204 | }, 205 | { 206 | "include": "#value" 207 | }, 208 | { 209 | "include": "#comparison" 210 | }, 211 | { 212 | "include": "#operator" 213 | }, 214 | { 215 | "include": "#logical" 216 | } 217 | ] 218 | }, 219 | "comments": { 220 | "patterns": [ 221 | { 222 | "name": "comment.line.double-slash.js", 223 | "match": "(//).*$\\n?", 224 | "captures": { 225 | "1": { 226 | "name": "punctuation.definition.comment.groq" 227 | } 228 | } 229 | } 230 | ] 231 | }, 232 | "nullary-access-operator": { 233 | "match": "[*@^]", 234 | "name": "constant.language.groq" 235 | }, 236 | "constant": { 237 | "match": "\\b(?:true|false|null)\\b", 238 | "name": "constant.language.groq" 239 | }, 240 | "number": { 241 | "match": "(?x) # turn on extended mode\n -? # an optional minus\n (?:\n 0 # a zero\n | # ...or...\n [1-9] # a 1-9 character\n \\d* # followed by zero or more digits\n )\n (?:\n (?:\n \\. # a period\n \\d+ # followed by one or more digits\n )?\n (?:\n [eE] # an e character\n [+-]? # followed by an option +/-\n \\d+ # followed by one or more digits\n )? # make exponent optional\n )? # make decimal portion optional", 242 | "name": "constant.numeric.groq" 243 | }, 244 | "named-projection": { 245 | "patterns": [ 246 | { 247 | "include": "#identifier" 248 | }, 249 | { 250 | "include": "#objectkey" 251 | }, 252 | { 253 | "include": "#projection" 254 | } 255 | ] 256 | }, 257 | "projection": { 258 | "begin": "\\{", 259 | "beginCaptures": { 260 | "0": { 261 | "name": "punctuation.definition.projection.begin.groq" 262 | } 263 | }, 264 | "end": "\\}", 265 | "endCaptures": { 266 | "0": { 267 | "name": "punctuation.definition.projection.end.groq" 268 | } 269 | }, 270 | "name": "meta.structure.projection.groq", 271 | "patterns": [ 272 | { 273 | "include": "#identifier" 274 | }, 275 | { 276 | "include": "#objectkey" 277 | }, 278 | { 279 | "include": "#named-projection" 280 | }, 281 | { 282 | "include": "#comments" 283 | }, 284 | { 285 | "include": "#spread" 286 | }, 287 | { 288 | "include": "#pair" 289 | }, 290 | { 291 | "begin": ":", 292 | "beginCaptures": { 293 | "0": { 294 | "name": "punctuation.separator.projection.key-value.groq" 295 | } 296 | }, 297 | "end": "(,)|(?=\\})", 298 | "endCaptures": { 299 | "1": { 300 | "name": "punctuation.separator.projection.pair.groq" 301 | } 302 | }, 303 | "name": "meta.structure.projection.value.groq", 304 | "patterns": [ 305 | { 306 | "include": "#nullary-access-operator" 307 | }, 308 | { 309 | "include": "#arraylike" 310 | }, 311 | { 312 | "include": "#value" 313 | }, 314 | { 315 | "include": "#spread" 316 | }, 317 | { 318 | "include": "#identifier" 319 | }, 320 | { 321 | "include": "#operator" 322 | }, 323 | { 324 | "include": "#comparison" 325 | }, 326 | { 327 | "include": "#pair" 328 | }, 329 | { 330 | "match": "[^\\s,]", 331 | "name": "invalid.illegal.expected-projection-separator.groq" 332 | } 333 | ] 334 | }, 335 | { 336 | "match": "[^\\s\\},]", 337 | "name": "invalid.illegal.expected-projection-separator.groq" 338 | } 339 | ] 340 | }, 341 | "string": { 342 | "name": "string.quoted.groq", 343 | "patterns": [ 344 | { 345 | "include": "#single-string" 346 | }, 347 | { 348 | "include": "#double-string" 349 | } 350 | ] 351 | }, 352 | "double-string": { 353 | "name": "string.quoted.double.groq", 354 | "begin": "\"", 355 | "beginCaptures": { 356 | "0": { 357 | "name": "punctuation.definition.string.begin.groq" 358 | } 359 | }, 360 | "end": "\"", 361 | "endCaptures": { 362 | "0": { 363 | "name": "punctuation.definition.string.end.groq" 364 | } 365 | }, 366 | "patterns": [ 367 | { 368 | "include": "#stringcontent" 369 | } 370 | ] 371 | }, 372 | "single-string": { 373 | "name": "string.quoted.single.groq", 374 | "begin": "'", 375 | "beginCaptures": { 376 | "0": { 377 | "name": "punctuation.definition.string.single.begin.groq" 378 | } 379 | }, 380 | "end": "'", 381 | "endCaptures": { 382 | "0": { 383 | "name": "punctuation.definition.string.single.end.groq" 384 | } 385 | }, 386 | "patterns": [ 387 | { 388 | "include": "#stringcontent" 389 | } 390 | ] 391 | }, 392 | "objectkey": { 393 | "name": "string.groq support.type.property-name.groq", 394 | "patterns": [ 395 | { 396 | "include": "#string" 397 | } 398 | ] 399 | }, 400 | "stringcontent": { 401 | "patterns": [ 402 | { 403 | "match": "(?x) # turn on extended mode\n \\\\ # a literal backslash\n (?: # ...followed by...\n [\"\\\\/bfnrt] # one of these characters\n | # ...or...\n u # a u\n [0-9a-fA-F]{4}) # and four hex digits", 404 | "name": "constant.character.escape.groq" 405 | }, 406 | { 407 | "match": "\\\\.", 408 | "name": "invalid.illegal.unrecognized-string-escape.groq" 409 | } 410 | ] 411 | }, 412 | "sort-pair": { 413 | "name": "attribute.sortpair.groq", 414 | "patterns": [ 415 | { 416 | "match": "([_A-Za-z][_0-9A-Za-z]*)(?:\\s*(asc|desc))?", 417 | "captures": { 418 | "1": { 419 | "name": "variable.other.readwrite.groq" 420 | }, 421 | "2": { 422 | "name": "keyword.other.groq" 423 | } 424 | } 425 | }, 426 | { 427 | "begin": "(@)(\\[)", 428 | "beginCaptures": { 429 | "1": { 430 | "name": "constant.language.groq" 431 | }, 432 | "2": { 433 | "name": "punctuation.definition.bracket.begin.groq" 434 | } 435 | }, 436 | "end": "(\\])(?:\\s*(asc|desc))?", 437 | "endCaptures": { 438 | "1": { 439 | "name": "punctuation.definition.bracket.begin.groq" 440 | }, 441 | "2": { 442 | "name": "keyword.other.groq" 443 | } 444 | }, 445 | "patterns": [ 446 | { 447 | "include": "#string" 448 | } 449 | ] 450 | } 451 | ] 452 | }, 453 | "sort-order": { 454 | "name": "support.function.sortorder.groq", 455 | "begin": "\\b(order)\\s*\\(", 456 | "beginCaptures": { 457 | "0": { 458 | "name": "support.function.sortorder.begin.groq" 459 | } 460 | }, 461 | "end": "\\)", 462 | "endCaptures": { 463 | "0": { 464 | "name": "support.function.sortorder.end.groq" 465 | } 466 | }, 467 | "patterns": [ 468 | { 469 | "include": "#sort-pair" 470 | }, 471 | { 472 | "match": ",", 473 | "name": "punctuation.separator.array.groq" 474 | }, 475 | { 476 | "match": "[^\\s\\]]", 477 | "name": "invalid.illegal.expected-sort-separator.groq" 478 | } 479 | ] 480 | }, 481 | "function-call": { 482 | "patterns": [ 483 | { 484 | "include": "#function-var-arg" 485 | }, 486 | { 487 | "include": "#function-single-arg" 488 | }, 489 | { 490 | "include": "#function-round" 491 | } 492 | ] 493 | }, 494 | "function-var-arg": { 495 | "name": "support.function.vararg.groq", 496 | "begin": "\\b(coalesce|select)\\s*\\(", 497 | "beginCaptures": { 498 | "0": { 499 | "name": "support.function.vararg.begin.groq" 500 | } 501 | }, 502 | "end": "\\)", 503 | "endCaptures": { 504 | "0": { 505 | "name": "support.function.vararg.end.groq" 506 | } 507 | }, 508 | "patterns": [ 509 | { 510 | "include": "#value" 511 | }, 512 | { 513 | "include": "#identifier" 514 | }, 515 | { 516 | "include": "#filter" 517 | }, 518 | { 519 | "include": "#pair" 520 | }, 521 | { 522 | "match": ",", 523 | "name": "punctuation.separator.array.groq" 524 | } 525 | ] 526 | }, 527 | "function-single-arg": { 528 | "name": "support.function.singlearg.groq", 529 | "begin": "\\b(count|defined|length|path|references)\\s*\\(", 530 | "beginCaptures": { 531 | "0": { 532 | "name": "support.function.singlearg.begin.groq" 533 | } 534 | }, 535 | "end": "\\)", 536 | "endCaptures": { 537 | "0": { 538 | "name": "support.function.singlearg.end.groq" 539 | } 540 | }, 541 | "patterns": [ 542 | { 543 | "include": "#query" 544 | }, 545 | { 546 | "include": "#identifier" 547 | }, 548 | { 549 | "include": "#value" 550 | }, 551 | { 552 | "include": "#pair" 553 | } 554 | ] 555 | }, 556 | "identifier": { 557 | "patterns": [ 558 | { 559 | "match": "([_A-Za-z][_0-9A-Za-z]*)\\s*(\\[\\s*\\])?\\s*(\\->)", 560 | "captures": { 561 | "1": { 562 | "name": "variable.other.readwrite.groq" 563 | }, 564 | "2": { 565 | "name": "punctuation.definition.block.js" 566 | }, 567 | "3": { 568 | "name": "keyword.operator.reference.groq" 569 | } 570 | } 571 | }, 572 | { 573 | "match": "(?:([_A-Za-z][_0-9A-Za-z]*)|([@^]))\\s*(\\[\\s*\\])?\\s*(\\.)", 574 | "captures": { 575 | "1": { 576 | "name": "variable.other.readwrite.groq" 577 | }, 578 | "2": { 579 | "name": "constant.language.groq" 580 | }, 581 | "3": { 582 | "name": "punctuation.definition.block.js" 583 | }, 584 | "4": { 585 | "name": "keyword.operator.descendant.groq" 586 | } 587 | } 588 | }, 589 | { 590 | "match": "[_A-Za-z][_0-9A-Za-z]*", 591 | "name": "variable.other.readwrite.groq" 592 | } 593 | ] 594 | }, 595 | "value": { 596 | "patterns": [ 597 | { 598 | "include": "#constant" 599 | }, 600 | { 601 | "include": "#number" 602 | }, 603 | { 604 | "include": "#string" 605 | }, 606 | { 607 | "include": "#array" 608 | }, 609 | { 610 | "include": "#variable" 611 | }, 612 | { 613 | "include": "#projection" 614 | }, 615 | { 616 | "include": "#comments" 617 | }, 618 | { 619 | "include": "#function-call" 620 | } 621 | ] 622 | } 623 | } 624 | } 625 | -------------------------------------------------------------------------------- /grammars/groq.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "markdown.groq.codeblock", 3 | "fileTypes": [], 4 | "injectionSelector": "L:markup.fenced_code.block.markdown", 5 | "patterns": [ 6 | { 7 | "include": "#groq-code-block" 8 | } 9 | ], 10 | "repository": { 11 | "groq-code-block": { 12 | "begin": "(?<=[`~])groq(\\s+[^`~]*)?$", 13 | "end": "(^|\\G)(?=\\s*[`~]{3,}\\s*$)", 14 | "patterns": [ 15 | { 16 | "begin": "(^|\\G)(\\s*)(.*)", 17 | "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", 18 | "contentName": "meta.embedded.block.groq", 19 | "patterns": [ 20 | { 21 | "include": "source.groq" 22 | } 23 | ] 24 | } 25 | ] 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sanity-io/vscode-sanity/185b19d51ab4aa5806de5fb7a5cebc755c8c341a/images/icon.png -------------------------------------------------------------------------------- /language/language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "//" 4 | }, 5 | "brackets": [ 6 | ["{", "}"], 7 | ["[", "]"], 8 | ["(", ")"] 9 | ], 10 | "autoClosingPairs": [ 11 | ["{", "}"], 12 | ["[", "]"], 13 | ["(", ")"], 14 | ["\"", "\""], 15 | ["'", "'"] 16 | ], 17 | "surroundingPairs": [ 18 | ["{", "}"], 19 | ["[", "]"], 20 | ["(", ")"], 21 | ["\"", "\""], 22 | ["'", "'"] 23 | ] 24 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-sanity", 3 | "version": "0.2.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vscode-sanity", 9 | "version": "0.2.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@sanity/client": "^6.21.1", 13 | "groq-js": "^1.12.0", 14 | "line-number": "^0.1.0", 15 | "osenv": "^0.1.5", 16 | "react": "^16.13.1", 17 | "react-dom": "^16.13.1", 18 | "react-jason": "^1.1.2", 19 | "ts-node": "^10.9.2", 20 | "xdg-basedir": "^4.0.0" 21 | }, 22 | "devDependencies": { 23 | "@types/node": "^20.14.14", 24 | "@types/react": "^16.9.52", 25 | "@types/react-dom": "^16.9.8", 26 | "@types/vscode": "^1.91.0", 27 | "prettier": "^2.1.2", 28 | "typescript": "5.5", 29 | "vsce": "^2.15.0" 30 | }, 31 | "engines": { 32 | "vscode": "^1.91.0" 33 | } 34 | }, 35 | "node_modules/@cspotcode/source-map-support": { 36 | "version": "0.8.1", 37 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 38 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 39 | "dependencies": { 40 | "@jridgewell/trace-mapping": "0.3.9" 41 | }, 42 | "engines": { 43 | "node": ">=12" 44 | } 45 | }, 46 | "node_modules/@jridgewell/resolve-uri": { 47 | "version": "3.1.2", 48 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 49 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 50 | "engines": { 51 | "node": ">=6.0.0" 52 | } 53 | }, 54 | "node_modules/@jridgewell/sourcemap-codec": { 55 | "version": "1.5.0", 56 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 57 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 58 | }, 59 | "node_modules/@jridgewell/trace-mapping": { 60 | "version": "0.3.9", 61 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 62 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 63 | "dependencies": { 64 | "@jridgewell/resolve-uri": "^3.0.3", 65 | "@jridgewell/sourcemap-codec": "^1.4.10" 66 | } 67 | }, 68 | "node_modules/@sanity/client": { 69 | "version": "6.21.1", 70 | "resolved": "https://registry.npmjs.org/@sanity/client/-/client-6.21.1.tgz", 71 | "integrity": "sha512-j6OnE6Ytso0c5imjuIviglJDKXgd3jCVyPmZO+GpqWDtPWSXPucqH/mFyHcs5+kWyfAfkY5G1R2+Er0L7Sb0hA==", 72 | "dependencies": { 73 | "@sanity/eventsource": "^5.0.2", 74 | "get-it": "^8.6.3", 75 | "rxjs": "^7.0.0" 76 | }, 77 | "engines": { 78 | "node": ">=14.18" 79 | } 80 | }, 81 | "node_modules/@sanity/eventsource": { 82 | "version": "5.0.2", 83 | "resolved": "https://registry.npmjs.org/@sanity/eventsource/-/eventsource-5.0.2.tgz", 84 | "integrity": "sha512-/B9PMkUvAlUrpRq0y+NzXgRv5lYCLxZNsBJD2WXVnqZYOfByL9oQBV7KiTaARuObp5hcQYuPfOAVjgXe3hrixA==", 85 | "dependencies": { 86 | "@types/event-source-polyfill": "1.0.5", 87 | "@types/eventsource": "1.1.15", 88 | "event-source-polyfill": "1.0.31", 89 | "eventsource": "2.0.2" 90 | } 91 | }, 92 | "node_modules/@tsconfig/node10": { 93 | "version": "1.0.11", 94 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 95 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" 96 | }, 97 | "node_modules/@tsconfig/node12": { 98 | "version": "1.0.11", 99 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 100 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" 101 | }, 102 | "node_modules/@tsconfig/node14": { 103 | "version": "1.0.3", 104 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 105 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" 106 | }, 107 | "node_modules/@tsconfig/node16": { 108 | "version": "1.0.4", 109 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 110 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" 111 | }, 112 | "node_modules/@types/event-source-polyfill": { 113 | "version": "1.0.5", 114 | "resolved": "https://registry.npmjs.org/@types/event-source-polyfill/-/event-source-polyfill-1.0.5.tgz", 115 | "integrity": "sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==" 116 | }, 117 | "node_modules/@types/eventsource": { 118 | "version": "1.1.15", 119 | "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.15.tgz", 120 | "integrity": "sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==" 121 | }, 122 | "node_modules/@types/node": { 123 | "version": "20.14.14", 124 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", 125 | "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", 126 | "dependencies": { 127 | "undici-types": "~5.26.4" 128 | } 129 | }, 130 | "node_modules/@types/prop-types": { 131 | "version": "15.7.3", 132 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", 133 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", 134 | "dev": true 135 | }, 136 | "node_modules/@types/react": { 137 | "version": "16.9.52", 138 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.52.tgz", 139 | "integrity": "sha512-EHRjmnxiNivwhGdMh9sz1Yw9AUxTSZFxKqdBWAAzyZx3sufWwx6ogqHYh/WB1m/I4ZpjkoZLExF5QTy2ekVi/Q==", 140 | "dev": true, 141 | "dependencies": { 142 | "@types/prop-types": "*", 143 | "csstype": "^3.0.2" 144 | } 145 | }, 146 | "node_modules/@types/react-dom": { 147 | "version": "16.9.8", 148 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", 149 | "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", 150 | "dev": true, 151 | "dependencies": { 152 | "@types/react": "*" 153 | } 154 | }, 155 | "node_modules/@types/vscode": { 156 | "version": "1.91.0", 157 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.91.0.tgz", 158 | "integrity": "sha512-PgPr+bUODjG3y+ozWUCyzttqR9EHny9sPAfJagddQjDwdtf66y2sDKJMnFZRuzBA2YtBGASqJGPil8VDUPvO6A==", 159 | "dev": true 160 | }, 161 | "node_modules/acorn": { 162 | "version": "8.12.1", 163 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 164 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 165 | "bin": { 166 | "acorn": "bin/acorn" 167 | }, 168 | "engines": { 169 | "node": ">=0.4.0" 170 | } 171 | }, 172 | "node_modules/acorn-walk": { 173 | "version": "8.3.3", 174 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", 175 | "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", 176 | "dependencies": { 177 | "acorn": "^8.11.0" 178 | }, 179 | "engines": { 180 | "node": ">=0.4.0" 181 | } 182 | }, 183 | "node_modules/ansi-styles": { 184 | "version": "3.2.1", 185 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 186 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 187 | "dev": true, 188 | "dependencies": { 189 | "color-convert": "^1.9.0" 190 | }, 191 | "engines": { 192 | "node": ">=4" 193 | } 194 | }, 195 | "node_modules/arg": { 196 | "version": "4.1.3", 197 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 198 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" 199 | }, 200 | "node_modules/argparse": { 201 | "version": "2.0.1", 202 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 203 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 204 | "dev": true 205 | }, 206 | "node_modules/azure-devops-node-api": { 207 | "version": "11.2.0", 208 | "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", 209 | "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", 210 | "dev": true, 211 | "dependencies": { 212 | "tunnel": "0.0.6", 213 | "typed-rest-client": "^1.8.4" 214 | } 215 | }, 216 | "node_modules/balanced-match": { 217 | "version": "1.0.0", 218 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 219 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 220 | "dev": true 221 | }, 222 | "node_modules/base64-js": { 223 | "version": "1.5.1", 224 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 225 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 226 | "dev": true, 227 | "funding": [ 228 | { 229 | "type": "github", 230 | "url": "https://github.com/sponsors/feross" 231 | }, 232 | { 233 | "type": "patreon", 234 | "url": "https://www.patreon.com/feross" 235 | }, 236 | { 237 | "type": "consulting", 238 | "url": "https://feross.org/support" 239 | } 240 | ] 241 | }, 242 | "node_modules/bl": { 243 | "version": "4.1.0", 244 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 245 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 246 | "dev": true, 247 | "dependencies": { 248 | "buffer": "^5.5.0", 249 | "inherits": "^2.0.4", 250 | "readable-stream": "^3.4.0" 251 | } 252 | }, 253 | "node_modules/boolbase": { 254 | "version": "1.0.0", 255 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 256 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 257 | "dev": true 258 | }, 259 | "node_modules/brace-expansion": { 260 | "version": "1.1.11", 261 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 262 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 263 | "dev": true, 264 | "dependencies": { 265 | "balanced-match": "^1.0.0", 266 | "concat-map": "0.0.1" 267 | } 268 | }, 269 | "node_modules/buffer": { 270 | "version": "5.7.1", 271 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 272 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 273 | "dev": true, 274 | "funding": [ 275 | { 276 | "type": "github", 277 | "url": "https://github.com/sponsors/feross" 278 | }, 279 | { 280 | "type": "patreon", 281 | "url": "https://www.patreon.com/feross" 282 | }, 283 | { 284 | "type": "consulting", 285 | "url": "https://feross.org/support" 286 | } 287 | ], 288 | "dependencies": { 289 | "base64-js": "^1.3.1", 290 | "ieee754": "^1.1.13" 291 | } 292 | }, 293 | "node_modules/buffer-crc32": { 294 | "version": "0.2.13", 295 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 296 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 297 | "dev": true, 298 | "engines": { 299 | "node": "*" 300 | } 301 | }, 302 | "node_modules/call-bind": { 303 | "version": "1.0.7", 304 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 305 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 306 | "dev": true, 307 | "dependencies": { 308 | "es-define-property": "^1.0.0", 309 | "es-errors": "^1.3.0", 310 | "function-bind": "^1.1.2", 311 | "get-intrinsic": "^1.2.4", 312 | "set-function-length": "^1.2.1" 313 | }, 314 | "engines": { 315 | "node": ">= 0.4" 316 | }, 317 | "funding": { 318 | "url": "https://github.com/sponsors/ljharb" 319 | } 320 | }, 321 | "node_modules/chalk": { 322 | "version": "2.4.2", 323 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 324 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 325 | "dev": true, 326 | "dependencies": { 327 | "ansi-styles": "^3.2.1", 328 | "escape-string-regexp": "^1.0.5", 329 | "supports-color": "^5.3.0" 330 | }, 331 | "engines": { 332 | "node": ">=4" 333 | } 334 | }, 335 | "node_modules/cheerio": { 336 | "version": "1.0.0-rc.12", 337 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 338 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 339 | "dev": true, 340 | "dependencies": { 341 | "cheerio-select": "^2.1.0", 342 | "dom-serializer": "^2.0.0", 343 | "domhandler": "^5.0.3", 344 | "domutils": "^3.0.1", 345 | "htmlparser2": "^8.0.1", 346 | "parse5": "^7.0.0", 347 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 348 | }, 349 | "engines": { 350 | "node": ">= 6" 351 | }, 352 | "funding": { 353 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 354 | } 355 | }, 356 | "node_modules/cheerio-select": { 357 | "version": "2.1.0", 358 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 359 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 360 | "dev": true, 361 | "dependencies": { 362 | "boolbase": "^1.0.0", 363 | "css-select": "^5.1.0", 364 | "css-what": "^6.1.0", 365 | "domelementtype": "^2.3.0", 366 | "domhandler": "^5.0.3", 367 | "domutils": "^3.0.1" 368 | }, 369 | "funding": { 370 | "url": "https://github.com/sponsors/fb55" 371 | } 372 | }, 373 | "node_modules/chownr": { 374 | "version": "1.1.4", 375 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 376 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 377 | "dev": true 378 | }, 379 | "node_modules/color-convert": { 380 | "version": "1.9.3", 381 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 382 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 383 | "dev": true, 384 | "dependencies": { 385 | "color-name": "1.1.3" 386 | } 387 | }, 388 | "node_modules/color-name": { 389 | "version": "1.1.3", 390 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 391 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 392 | "dev": true 393 | }, 394 | "node_modules/concat-map": { 395 | "version": "0.0.1", 396 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 397 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 398 | "dev": true 399 | }, 400 | "node_modules/core-util-is": { 401 | "version": "1.0.3", 402 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 403 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 404 | }, 405 | "node_modules/create-require": { 406 | "version": "1.1.1", 407 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 408 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" 409 | }, 410 | "node_modules/css-select": { 411 | "version": "5.1.0", 412 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 413 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 414 | "dev": true, 415 | "dependencies": { 416 | "boolbase": "^1.0.0", 417 | "css-what": "^6.1.0", 418 | "domhandler": "^5.0.2", 419 | "domutils": "^3.0.1", 420 | "nth-check": "^2.0.1" 421 | }, 422 | "funding": { 423 | "url": "https://github.com/sponsors/fb55" 424 | } 425 | }, 426 | "node_modules/css-what": { 427 | "version": "6.1.0", 428 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 429 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 430 | "dev": true, 431 | "engines": { 432 | "node": ">= 6" 433 | }, 434 | "funding": { 435 | "url": "https://github.com/sponsors/fb55" 436 | } 437 | }, 438 | "node_modules/csstype": { 439 | "version": "3.0.3", 440 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", 441 | "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", 442 | "dev": true 443 | }, 444 | "node_modules/debug": { 445 | "version": "4.3.6", 446 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 447 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 448 | "dependencies": { 449 | "ms": "2.1.2" 450 | }, 451 | "engines": { 452 | "node": ">=6.0" 453 | }, 454 | "peerDependenciesMeta": { 455 | "supports-color": { 456 | "optional": true 457 | } 458 | } 459 | }, 460 | "node_modules/decompress-response": { 461 | "version": "7.0.0", 462 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-7.0.0.tgz", 463 | "integrity": "sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==", 464 | "dependencies": { 465 | "mimic-response": "^3.1.0" 466 | }, 467 | "engines": { 468 | "node": ">=10" 469 | }, 470 | "funding": { 471 | "url": "https://github.com/sponsors/sindresorhus" 472 | } 473 | }, 474 | "node_modules/deep-extend": { 475 | "version": "0.6.0", 476 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 477 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 478 | "dev": true, 479 | "engines": { 480 | "node": ">=4.0.0" 481 | } 482 | }, 483 | "node_modules/define-data-property": { 484 | "version": "1.1.4", 485 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 486 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 487 | "dev": true, 488 | "dependencies": { 489 | "es-define-property": "^1.0.0", 490 | "es-errors": "^1.3.0", 491 | "gopd": "^1.0.1" 492 | }, 493 | "engines": { 494 | "node": ">= 0.4" 495 | }, 496 | "funding": { 497 | "url": "https://github.com/sponsors/ljharb" 498 | } 499 | }, 500 | "node_modules/detect-libc": { 501 | "version": "2.0.3", 502 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 503 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 504 | "dev": true, 505 | "engines": { 506 | "node": ">=8" 507 | } 508 | }, 509 | "node_modules/diff": { 510 | "version": "4.0.2", 511 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 512 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 513 | "engines": { 514 | "node": ">=0.3.1" 515 | } 516 | }, 517 | "node_modules/dom-serializer": { 518 | "version": "2.0.0", 519 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 520 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 521 | "dev": true, 522 | "dependencies": { 523 | "domelementtype": "^2.3.0", 524 | "domhandler": "^5.0.2", 525 | "entities": "^4.2.0" 526 | }, 527 | "funding": { 528 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 529 | } 530 | }, 531 | "node_modules/domelementtype": { 532 | "version": "2.3.0", 533 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 534 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 535 | "dev": true, 536 | "funding": [ 537 | { 538 | "type": "github", 539 | "url": "https://github.com/sponsors/fb55" 540 | } 541 | ] 542 | }, 543 | "node_modules/domhandler": { 544 | "version": "5.0.3", 545 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 546 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 547 | "dev": true, 548 | "dependencies": { 549 | "domelementtype": "^2.3.0" 550 | }, 551 | "engines": { 552 | "node": ">= 4" 553 | }, 554 | "funding": { 555 | "url": "https://github.com/fb55/domhandler?sponsor=1" 556 | } 557 | }, 558 | "node_modules/domutils": { 559 | "version": "3.1.0", 560 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 561 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 562 | "dev": true, 563 | "dependencies": { 564 | "dom-serializer": "^2.0.0", 565 | "domelementtype": "^2.3.0", 566 | "domhandler": "^5.0.3" 567 | }, 568 | "funding": { 569 | "url": "https://github.com/fb55/domutils?sponsor=1" 570 | } 571 | }, 572 | "node_modules/end-of-stream": { 573 | "version": "1.4.4", 574 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 575 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 576 | "dev": true, 577 | "dependencies": { 578 | "once": "^1.4.0" 579 | } 580 | }, 581 | "node_modules/entities": { 582 | "version": "4.5.0", 583 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 584 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 585 | "dev": true, 586 | "engines": { 587 | "node": ">=0.12" 588 | }, 589 | "funding": { 590 | "url": "https://github.com/fb55/entities?sponsor=1" 591 | } 592 | }, 593 | "node_modules/es-define-property": { 594 | "version": "1.0.0", 595 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 596 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 597 | "dev": true, 598 | "dependencies": { 599 | "get-intrinsic": "^1.2.4" 600 | }, 601 | "engines": { 602 | "node": ">= 0.4" 603 | } 604 | }, 605 | "node_modules/es-errors": { 606 | "version": "1.3.0", 607 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 608 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 609 | "dev": true, 610 | "engines": { 611 | "node": ">= 0.4" 612 | } 613 | }, 614 | "node_modules/escape-string-regexp": { 615 | "version": "1.0.5", 616 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 617 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 618 | "dev": true, 619 | "engines": { 620 | "node": ">=0.8.0" 621 | } 622 | }, 623 | "node_modules/event-source-polyfill": { 624 | "version": "1.0.31", 625 | "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.31.tgz", 626 | "integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==" 627 | }, 628 | "node_modules/eventsource": { 629 | "version": "2.0.2", 630 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", 631 | "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", 632 | "engines": { 633 | "node": ">=12.0.0" 634 | } 635 | }, 636 | "node_modules/expand-template": { 637 | "version": "2.0.3", 638 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 639 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 640 | "dev": true, 641 | "engines": { 642 | "node": ">=6" 643 | } 644 | }, 645 | "node_modules/fd-slicer": { 646 | "version": "1.1.0", 647 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 648 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 649 | "dev": true, 650 | "dependencies": { 651 | "pend": "~1.2.0" 652 | } 653 | }, 654 | "node_modules/follow-redirects": { 655 | "version": "1.15.6", 656 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 657 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 658 | "funding": [ 659 | { 660 | "type": "individual", 661 | "url": "https://github.com/sponsors/RubenVerborgh" 662 | } 663 | ], 664 | "engines": { 665 | "node": ">=4.0" 666 | }, 667 | "peerDependenciesMeta": { 668 | "debug": { 669 | "optional": true 670 | } 671 | } 672 | }, 673 | "node_modules/fs-constants": { 674 | "version": "1.0.0", 675 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 676 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 677 | "dev": true 678 | }, 679 | "node_modules/fs.realpath": { 680 | "version": "1.0.0", 681 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 682 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 683 | "dev": true 684 | }, 685 | "node_modules/function-bind": { 686 | "version": "1.1.2", 687 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 688 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 689 | "dev": true, 690 | "funding": { 691 | "url": "https://github.com/sponsors/ljharb" 692 | } 693 | }, 694 | "node_modules/get-intrinsic": { 695 | "version": "1.2.4", 696 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 697 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 698 | "dev": true, 699 | "dependencies": { 700 | "es-errors": "^1.3.0", 701 | "function-bind": "^1.1.2", 702 | "has-proto": "^1.0.1", 703 | "has-symbols": "^1.0.3", 704 | "hasown": "^2.0.0" 705 | }, 706 | "engines": { 707 | "node": ">= 0.4" 708 | }, 709 | "funding": { 710 | "url": "https://github.com/sponsors/ljharb" 711 | } 712 | }, 713 | "node_modules/get-it": { 714 | "version": "8.6.3", 715 | "resolved": "https://registry.npmjs.org/get-it/-/get-it-8.6.3.tgz", 716 | "integrity": "sha512-I7AKP1Xl2q2j4ucvU0yMtiM+xZKgzD1Fvyh1YcZCT66i+wNrxJAonV+H1yynB3gerZ17uA00IXg61LVLdDeiCg==", 717 | "dependencies": { 718 | "decompress-response": "^7.0.0", 719 | "follow-redirects": "^1.15.6", 720 | "is-retry-allowed": "^2.2.0", 721 | "progress-stream": "^2.0.0", 722 | "tunnel-agent": "^0.6.0" 723 | }, 724 | "engines": { 725 | "node": ">=14.0.0" 726 | } 727 | }, 728 | "node_modules/github-from-package": { 729 | "version": "0.0.0", 730 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 731 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 732 | "dev": true 733 | }, 734 | "node_modules/glob": { 735 | "version": "7.1.6", 736 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 737 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 738 | "deprecated": "Glob versions prior to v9 are no longer supported", 739 | "dev": true, 740 | "dependencies": { 741 | "fs.realpath": "^1.0.0", 742 | "inflight": "^1.0.4", 743 | "inherits": "2", 744 | "minimatch": "^3.0.4", 745 | "once": "^1.3.0", 746 | "path-is-absolute": "^1.0.0" 747 | }, 748 | "engines": { 749 | "node": "*" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/isaacs" 753 | } 754 | }, 755 | "node_modules/gopd": { 756 | "version": "1.0.1", 757 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 758 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 759 | "dev": true, 760 | "dependencies": { 761 | "get-intrinsic": "^1.1.3" 762 | }, 763 | "funding": { 764 | "url": "https://github.com/sponsors/ljharb" 765 | } 766 | }, 767 | "node_modules/groq-js": { 768 | "version": "1.12.0", 769 | "resolved": "https://registry.npmjs.org/groq-js/-/groq-js-1.12.0.tgz", 770 | "integrity": "sha512-XxMg2qX3iX+WlhCkj4FmrtDaQKRot9RyphJ0UsmxI/l2aMOdvjG7pqF003yyXppjoE0Vk1ERCDCUYRvC3w/A2Q==", 771 | "dependencies": { 772 | "debug": "^4.3.4" 773 | }, 774 | "engines": { 775 | "node": ">= 14" 776 | } 777 | }, 778 | "node_modules/has-flag": { 779 | "version": "3.0.0", 780 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 781 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 782 | "dev": true, 783 | "engines": { 784 | "node": ">=4" 785 | } 786 | }, 787 | "node_modules/has-property-descriptors": { 788 | "version": "1.0.2", 789 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 790 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 791 | "dev": true, 792 | "dependencies": { 793 | "es-define-property": "^1.0.0" 794 | }, 795 | "funding": { 796 | "url": "https://github.com/sponsors/ljharb" 797 | } 798 | }, 799 | "node_modules/has-proto": { 800 | "version": "1.0.3", 801 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 802 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 803 | "dev": true, 804 | "engines": { 805 | "node": ">= 0.4" 806 | }, 807 | "funding": { 808 | "url": "https://github.com/sponsors/ljharb" 809 | } 810 | }, 811 | "node_modules/has-symbols": { 812 | "version": "1.0.3", 813 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 814 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 815 | "dev": true, 816 | "engines": { 817 | "node": ">= 0.4" 818 | }, 819 | "funding": { 820 | "url": "https://github.com/sponsors/ljharb" 821 | } 822 | }, 823 | "node_modules/hasown": { 824 | "version": "2.0.2", 825 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 826 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 827 | "dev": true, 828 | "dependencies": { 829 | "function-bind": "^1.1.2" 830 | }, 831 | "engines": { 832 | "node": ">= 0.4" 833 | } 834 | }, 835 | "node_modules/hosted-git-info": { 836 | "version": "4.1.0", 837 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", 838 | "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", 839 | "dev": true, 840 | "dependencies": { 841 | "lru-cache": "^6.0.0" 842 | }, 843 | "engines": { 844 | "node": ">=10" 845 | } 846 | }, 847 | "node_modules/htmlparser2": { 848 | "version": "8.0.2", 849 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 850 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 851 | "dev": true, 852 | "funding": [ 853 | "https://github.com/fb55/htmlparser2?sponsor=1", 854 | { 855 | "type": "github", 856 | "url": "https://github.com/sponsors/fb55" 857 | } 858 | ], 859 | "dependencies": { 860 | "domelementtype": "^2.3.0", 861 | "domhandler": "^5.0.3", 862 | "domutils": "^3.0.1", 863 | "entities": "^4.4.0" 864 | } 865 | }, 866 | "node_modules/ieee754": { 867 | "version": "1.2.1", 868 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 869 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 870 | "dev": true, 871 | "funding": [ 872 | { 873 | "type": "github", 874 | "url": "https://github.com/sponsors/feross" 875 | }, 876 | { 877 | "type": "patreon", 878 | "url": "https://www.patreon.com/feross" 879 | }, 880 | { 881 | "type": "consulting", 882 | "url": "https://feross.org/support" 883 | } 884 | ] 885 | }, 886 | "node_modules/inflight": { 887 | "version": "1.0.6", 888 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 889 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 890 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 891 | "dev": true, 892 | "dependencies": { 893 | "once": "^1.3.0", 894 | "wrappy": "1" 895 | } 896 | }, 897 | "node_modules/inherits": { 898 | "version": "2.0.4", 899 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 900 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 901 | }, 902 | "node_modules/ini": { 903 | "version": "1.3.8", 904 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 905 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 906 | "dev": true 907 | }, 908 | "node_modules/is-retry-allowed": { 909 | "version": "2.2.0", 910 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", 911 | "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", 912 | "engines": { 913 | "node": ">=10" 914 | }, 915 | "funding": { 916 | "url": "https://github.com/sponsors/sindresorhus" 917 | } 918 | }, 919 | "node_modules/isarray": { 920 | "version": "1.0.0", 921 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 922 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 923 | }, 924 | "node_modules/js-tokens": { 925 | "version": "4.0.0", 926 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 927 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 928 | }, 929 | "node_modules/keytar": { 930 | "version": "7.9.0", 931 | "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", 932 | "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", 933 | "dev": true, 934 | "hasInstallScript": true, 935 | "dependencies": { 936 | "node-addon-api": "^4.3.0", 937 | "prebuild-install": "^7.0.1" 938 | } 939 | }, 940 | "node_modules/leven": { 941 | "version": "3.1.0", 942 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 943 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 944 | "dev": true, 945 | "engines": { 946 | "node": ">=6" 947 | } 948 | }, 949 | "node_modules/line-number": { 950 | "version": "0.1.0", 951 | "resolved": "https://registry.npmjs.org/line-number/-/line-number-0.1.0.tgz", 952 | "integrity": "sha1-1khiBd8UXJIuAo5mfl254wC6ZFM=", 953 | "engines": { 954 | "node": ">=0.10.0" 955 | } 956 | }, 957 | "node_modules/linkify-it": { 958 | "version": "3.0.3", 959 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", 960 | "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", 961 | "dev": true, 962 | "dependencies": { 963 | "uc.micro": "^1.0.1" 964 | } 965 | }, 966 | "node_modules/loose-envify": { 967 | "version": "1.4.0", 968 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 969 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 970 | "dependencies": { 971 | "js-tokens": "^3.0.0 || ^4.0.0" 972 | }, 973 | "bin": { 974 | "loose-envify": "cli.js" 975 | } 976 | }, 977 | "node_modules/lru-cache": { 978 | "version": "6.0.0", 979 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 980 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 981 | "dev": true, 982 | "dependencies": { 983 | "yallist": "^4.0.0" 984 | }, 985 | "engines": { 986 | "node": ">=10" 987 | } 988 | }, 989 | "node_modules/make-error": { 990 | "version": "1.3.6", 991 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 992 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 993 | }, 994 | "node_modules/markdown-it": { 995 | "version": "12.3.2", 996 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", 997 | "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", 998 | "dev": true, 999 | "dependencies": { 1000 | "argparse": "^2.0.1", 1001 | "entities": "~2.1.0", 1002 | "linkify-it": "^3.0.1", 1003 | "mdurl": "^1.0.1", 1004 | "uc.micro": "^1.0.5" 1005 | }, 1006 | "bin": { 1007 | "markdown-it": "bin/markdown-it.js" 1008 | } 1009 | }, 1010 | "node_modules/markdown-it/node_modules/entities": { 1011 | "version": "2.1.0", 1012 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 1013 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", 1014 | "dev": true, 1015 | "funding": { 1016 | "url": "https://github.com/fb55/entities?sponsor=1" 1017 | } 1018 | }, 1019 | "node_modules/mdurl": { 1020 | "version": "1.0.1", 1021 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 1022 | "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", 1023 | "dev": true 1024 | }, 1025 | "node_modules/mime": { 1026 | "version": "1.6.0", 1027 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1028 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1029 | "dev": true, 1030 | "bin": { 1031 | "mime": "cli.js" 1032 | }, 1033 | "engines": { 1034 | "node": ">=4" 1035 | } 1036 | }, 1037 | "node_modules/mimic-response": { 1038 | "version": "3.1.0", 1039 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1040 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1041 | "engines": { 1042 | "node": ">=10" 1043 | }, 1044 | "funding": { 1045 | "url": "https://github.com/sponsors/sindresorhus" 1046 | } 1047 | }, 1048 | "node_modules/minimatch": { 1049 | "version": "3.1.2", 1050 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1051 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1052 | "dev": true, 1053 | "dependencies": { 1054 | "brace-expansion": "^1.1.7" 1055 | }, 1056 | "engines": { 1057 | "node": "*" 1058 | } 1059 | }, 1060 | "node_modules/minimist": { 1061 | "version": "1.2.8", 1062 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1063 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1064 | "dev": true, 1065 | "funding": { 1066 | "url": "https://github.com/sponsors/ljharb" 1067 | } 1068 | }, 1069 | "node_modules/mkdirp-classic": { 1070 | "version": "0.5.3", 1071 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1072 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1073 | "dev": true 1074 | }, 1075 | "node_modules/ms": { 1076 | "version": "2.1.2", 1077 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1078 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1079 | }, 1080 | "node_modules/mute-stream": { 1081 | "version": "0.0.8", 1082 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1083 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1084 | "dev": true 1085 | }, 1086 | "node_modules/napi-build-utils": { 1087 | "version": "1.0.2", 1088 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1089 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 1090 | "dev": true 1091 | }, 1092 | "node_modules/node-abi": { 1093 | "version": "3.65.0", 1094 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", 1095 | "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", 1096 | "dev": true, 1097 | "dependencies": { 1098 | "semver": "^7.3.5" 1099 | }, 1100 | "engines": { 1101 | "node": ">=10" 1102 | } 1103 | }, 1104 | "node_modules/node-abi/node_modules/semver": { 1105 | "version": "7.6.3", 1106 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1107 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1108 | "dev": true, 1109 | "bin": { 1110 | "semver": "bin/semver.js" 1111 | }, 1112 | "engines": { 1113 | "node": ">=10" 1114 | } 1115 | }, 1116 | "node_modules/node-addon-api": { 1117 | "version": "4.3.0", 1118 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", 1119 | "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", 1120 | "dev": true 1121 | }, 1122 | "node_modules/nth-check": { 1123 | "version": "2.1.1", 1124 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 1125 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 1126 | "dev": true, 1127 | "dependencies": { 1128 | "boolbase": "^1.0.0" 1129 | }, 1130 | "funding": { 1131 | "url": "https://github.com/fb55/nth-check?sponsor=1" 1132 | } 1133 | }, 1134 | "node_modules/object-assign": { 1135 | "version": "4.1.1", 1136 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1137 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1138 | "engines": { 1139 | "node": ">=0.10.0" 1140 | } 1141 | }, 1142 | "node_modules/object-inspect": { 1143 | "version": "1.13.2", 1144 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1145 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1146 | "dev": true, 1147 | "engines": { 1148 | "node": ">= 0.4" 1149 | }, 1150 | "funding": { 1151 | "url": "https://github.com/sponsors/ljharb" 1152 | } 1153 | }, 1154 | "node_modules/once": { 1155 | "version": "1.4.0", 1156 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1157 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1158 | "dev": true, 1159 | "dependencies": { 1160 | "wrappy": "1" 1161 | } 1162 | }, 1163 | "node_modules/os-homedir": { 1164 | "version": "1.0.2", 1165 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1166 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1167 | "engines": { 1168 | "node": ">=0.10.0" 1169 | } 1170 | }, 1171 | "node_modules/os-tmpdir": { 1172 | "version": "1.0.2", 1173 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1174 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1175 | "engines": { 1176 | "node": ">=0.10.0" 1177 | } 1178 | }, 1179 | "node_modules/osenv": { 1180 | "version": "0.1.5", 1181 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1182 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1183 | "deprecated": "This package is no longer supported.", 1184 | "dependencies": { 1185 | "os-homedir": "^1.0.0", 1186 | "os-tmpdir": "^1.0.0" 1187 | } 1188 | }, 1189 | "node_modules/parse-semver": { 1190 | "version": "1.1.1", 1191 | "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", 1192 | "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", 1193 | "dev": true, 1194 | "dependencies": { 1195 | "semver": "^5.1.0" 1196 | } 1197 | }, 1198 | "node_modules/parse5": { 1199 | "version": "7.1.2", 1200 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", 1201 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 1202 | "dev": true, 1203 | "dependencies": { 1204 | "entities": "^4.4.0" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1208 | } 1209 | }, 1210 | "node_modules/parse5-htmlparser2-tree-adapter": { 1211 | "version": "7.0.0", 1212 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 1213 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 1214 | "dev": true, 1215 | "dependencies": { 1216 | "domhandler": "^5.0.2", 1217 | "parse5": "^7.0.0" 1218 | }, 1219 | "funding": { 1220 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1221 | } 1222 | }, 1223 | "node_modules/path-is-absolute": { 1224 | "version": "1.0.1", 1225 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1226 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1227 | "dev": true, 1228 | "engines": { 1229 | "node": ">=0.10.0" 1230 | } 1231 | }, 1232 | "node_modules/pend": { 1233 | "version": "1.2.0", 1234 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1235 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1236 | "dev": true 1237 | }, 1238 | "node_modules/prebuild-install": { 1239 | "version": "7.1.2", 1240 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1241 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1242 | "dev": true, 1243 | "dependencies": { 1244 | "detect-libc": "^2.0.0", 1245 | "expand-template": "^2.0.3", 1246 | "github-from-package": "0.0.0", 1247 | "minimist": "^1.2.3", 1248 | "mkdirp-classic": "^0.5.3", 1249 | "napi-build-utils": "^1.0.1", 1250 | "node-abi": "^3.3.0", 1251 | "pump": "^3.0.0", 1252 | "rc": "^1.2.7", 1253 | "simple-get": "^4.0.0", 1254 | "tar-fs": "^2.0.0", 1255 | "tunnel-agent": "^0.6.0" 1256 | }, 1257 | "bin": { 1258 | "prebuild-install": "bin.js" 1259 | }, 1260 | "engines": { 1261 | "node": ">=10" 1262 | } 1263 | }, 1264 | "node_modules/prettier": { 1265 | "version": "2.1.2", 1266 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", 1267 | "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", 1268 | "dev": true, 1269 | "bin": { 1270 | "prettier": "bin-prettier.js" 1271 | }, 1272 | "engines": { 1273 | "node": ">=10.13.0" 1274 | } 1275 | }, 1276 | "node_modules/process-nextick-args": { 1277 | "version": "2.0.1", 1278 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1279 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1280 | }, 1281 | "node_modules/progress-stream": { 1282 | "version": "2.0.0", 1283 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", 1284 | "integrity": "sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==", 1285 | "dependencies": { 1286 | "speedometer": "~1.0.0", 1287 | "through2": "~2.0.3" 1288 | } 1289 | }, 1290 | "node_modules/prop-types": { 1291 | "version": "15.7.2", 1292 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1293 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1294 | "dependencies": { 1295 | "loose-envify": "^1.4.0", 1296 | "object-assign": "^4.1.1", 1297 | "react-is": "^16.8.1" 1298 | } 1299 | }, 1300 | "node_modules/pump": { 1301 | "version": "3.0.0", 1302 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1303 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1304 | "dev": true, 1305 | "dependencies": { 1306 | "end-of-stream": "^1.1.0", 1307 | "once": "^1.3.1" 1308 | } 1309 | }, 1310 | "node_modules/qs": { 1311 | "version": "6.13.0", 1312 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1313 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1314 | "dev": true, 1315 | "dependencies": { 1316 | "side-channel": "^1.0.6" 1317 | }, 1318 | "engines": { 1319 | "node": ">=0.6" 1320 | }, 1321 | "funding": { 1322 | "url": "https://github.com/sponsors/ljharb" 1323 | } 1324 | }, 1325 | "node_modules/rc": { 1326 | "version": "1.2.8", 1327 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1328 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1329 | "dev": true, 1330 | "dependencies": { 1331 | "deep-extend": "^0.6.0", 1332 | "ini": "~1.3.0", 1333 | "minimist": "^1.2.0", 1334 | "strip-json-comments": "~2.0.1" 1335 | }, 1336 | "bin": { 1337 | "rc": "cli.js" 1338 | } 1339 | }, 1340 | "node_modules/react": { 1341 | "version": "16.13.1", 1342 | "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", 1343 | "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", 1344 | "dependencies": { 1345 | "loose-envify": "^1.1.0", 1346 | "object-assign": "^4.1.1", 1347 | "prop-types": "^15.6.2" 1348 | }, 1349 | "engines": { 1350 | "node": ">=0.10.0" 1351 | } 1352 | }, 1353 | "node_modules/react-dom": { 1354 | "version": "16.13.1", 1355 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", 1356 | "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", 1357 | "dependencies": { 1358 | "loose-envify": "^1.1.0", 1359 | "object-assign": "^4.1.1", 1360 | "prop-types": "^15.6.2", 1361 | "scheduler": "^0.19.1" 1362 | }, 1363 | "peerDependencies": { 1364 | "react": "^16.13.1" 1365 | } 1366 | }, 1367 | "node_modules/react-is": { 1368 | "version": "16.13.1", 1369 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1370 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1371 | }, 1372 | "node_modules/react-jason": { 1373 | "version": "1.1.2", 1374 | "resolved": "https://registry.npmjs.org/react-jason/-/react-jason-1.1.2.tgz", 1375 | "integrity": "sha512-CfOAYS2GOy/QBMEVnQFFUGgv5EC8lwamj3tSKWLFF3XlPk0Dmoq/UZgslSrOtz4kIEXdsEkE+SMZ6UOhNk36XA==", 1376 | "engines": { 1377 | "node": ">=10" 1378 | }, 1379 | "peerDependencies": { 1380 | "react": ">=16" 1381 | } 1382 | }, 1383 | "node_modules/read": { 1384 | "version": "1.0.7", 1385 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1386 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "mute-stream": "~0.0.4" 1390 | }, 1391 | "engines": { 1392 | "node": ">=0.8" 1393 | } 1394 | }, 1395 | "node_modules/readable-stream": { 1396 | "version": "3.6.2", 1397 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1398 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "inherits": "^2.0.3", 1402 | "string_decoder": "^1.1.1", 1403 | "util-deprecate": "^1.0.1" 1404 | }, 1405 | "engines": { 1406 | "node": ">= 6" 1407 | } 1408 | }, 1409 | "node_modules/rxjs": { 1410 | "version": "7.8.1", 1411 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", 1412 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 1413 | "dependencies": { 1414 | "tslib": "^2.1.0" 1415 | } 1416 | }, 1417 | "node_modules/safe-buffer": { 1418 | "version": "5.2.1", 1419 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1420 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1421 | "funding": [ 1422 | { 1423 | "type": "github", 1424 | "url": "https://github.com/sponsors/feross" 1425 | }, 1426 | { 1427 | "type": "patreon", 1428 | "url": "https://www.patreon.com/feross" 1429 | }, 1430 | { 1431 | "type": "consulting", 1432 | "url": "https://feross.org/support" 1433 | } 1434 | ] 1435 | }, 1436 | "node_modules/sax": { 1437 | "version": "1.4.1", 1438 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", 1439 | "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", 1440 | "dev": true 1441 | }, 1442 | "node_modules/scheduler": { 1443 | "version": "0.19.1", 1444 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", 1445 | "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", 1446 | "dependencies": { 1447 | "loose-envify": "^1.1.0", 1448 | "object-assign": "^4.1.1" 1449 | } 1450 | }, 1451 | "node_modules/semver": { 1452 | "version": "5.7.2", 1453 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1454 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1455 | "dev": true, 1456 | "bin": { 1457 | "semver": "bin/semver" 1458 | } 1459 | }, 1460 | "node_modules/set-function-length": { 1461 | "version": "1.2.2", 1462 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1463 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "define-data-property": "^1.1.4", 1467 | "es-errors": "^1.3.0", 1468 | "function-bind": "^1.1.2", 1469 | "get-intrinsic": "^1.2.4", 1470 | "gopd": "^1.0.1", 1471 | "has-property-descriptors": "^1.0.2" 1472 | }, 1473 | "engines": { 1474 | "node": ">= 0.4" 1475 | } 1476 | }, 1477 | "node_modules/side-channel": { 1478 | "version": "1.0.6", 1479 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1480 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1481 | "dev": true, 1482 | "dependencies": { 1483 | "call-bind": "^1.0.7", 1484 | "es-errors": "^1.3.0", 1485 | "get-intrinsic": "^1.2.4", 1486 | "object-inspect": "^1.13.1" 1487 | }, 1488 | "engines": { 1489 | "node": ">= 0.4" 1490 | }, 1491 | "funding": { 1492 | "url": "https://github.com/sponsors/ljharb" 1493 | } 1494 | }, 1495 | "node_modules/simple-concat": { 1496 | "version": "1.0.1", 1497 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1498 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1499 | "dev": true, 1500 | "funding": [ 1501 | { 1502 | "type": "github", 1503 | "url": "https://github.com/sponsors/feross" 1504 | }, 1505 | { 1506 | "type": "patreon", 1507 | "url": "https://www.patreon.com/feross" 1508 | }, 1509 | { 1510 | "type": "consulting", 1511 | "url": "https://feross.org/support" 1512 | } 1513 | ] 1514 | }, 1515 | "node_modules/simple-get": { 1516 | "version": "4.0.1", 1517 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1518 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1519 | "dev": true, 1520 | "funding": [ 1521 | { 1522 | "type": "github", 1523 | "url": "https://github.com/sponsors/feross" 1524 | }, 1525 | { 1526 | "type": "patreon", 1527 | "url": "https://www.patreon.com/feross" 1528 | }, 1529 | { 1530 | "type": "consulting", 1531 | "url": "https://feross.org/support" 1532 | } 1533 | ], 1534 | "dependencies": { 1535 | "decompress-response": "^6.0.0", 1536 | "once": "^1.3.1", 1537 | "simple-concat": "^1.0.0" 1538 | } 1539 | }, 1540 | "node_modules/simple-get/node_modules/decompress-response": { 1541 | "version": "6.0.0", 1542 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 1543 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 1544 | "dev": true, 1545 | "dependencies": { 1546 | "mimic-response": "^3.1.0" 1547 | }, 1548 | "engines": { 1549 | "node": ">=10" 1550 | }, 1551 | "funding": { 1552 | "url": "https://github.com/sponsors/sindresorhus" 1553 | } 1554 | }, 1555 | "node_modules/speedometer": { 1556 | "version": "1.0.0", 1557 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", 1558 | "integrity": "sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==" 1559 | }, 1560 | "node_modules/string_decoder": { 1561 | "version": "1.3.0", 1562 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1563 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1564 | "dev": true, 1565 | "dependencies": { 1566 | "safe-buffer": "~5.2.0" 1567 | } 1568 | }, 1569 | "node_modules/strip-json-comments": { 1570 | "version": "2.0.1", 1571 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1572 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1573 | "dev": true, 1574 | "engines": { 1575 | "node": ">=0.10.0" 1576 | } 1577 | }, 1578 | "node_modules/supports-color": { 1579 | "version": "5.4.0", 1580 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1581 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1582 | "dev": true, 1583 | "dependencies": { 1584 | "has-flag": "^3.0.0" 1585 | }, 1586 | "engines": { 1587 | "node": ">=4" 1588 | } 1589 | }, 1590 | "node_modules/tar-fs": { 1591 | "version": "2.1.1", 1592 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1593 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1594 | "dev": true, 1595 | "dependencies": { 1596 | "chownr": "^1.1.1", 1597 | "mkdirp-classic": "^0.5.2", 1598 | "pump": "^3.0.0", 1599 | "tar-stream": "^2.1.4" 1600 | } 1601 | }, 1602 | "node_modules/tar-stream": { 1603 | "version": "2.2.0", 1604 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1605 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1606 | "dev": true, 1607 | "dependencies": { 1608 | "bl": "^4.0.3", 1609 | "end-of-stream": "^1.4.1", 1610 | "fs-constants": "^1.0.0", 1611 | "inherits": "^2.0.3", 1612 | "readable-stream": "^3.1.1" 1613 | }, 1614 | "engines": { 1615 | "node": ">=6" 1616 | } 1617 | }, 1618 | "node_modules/through2": { 1619 | "version": "2.0.5", 1620 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1621 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1622 | "dependencies": { 1623 | "readable-stream": "~2.3.6", 1624 | "xtend": "~4.0.1" 1625 | } 1626 | }, 1627 | "node_modules/through2/node_modules/readable-stream": { 1628 | "version": "2.3.8", 1629 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1630 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1631 | "dependencies": { 1632 | "core-util-is": "~1.0.0", 1633 | "inherits": "~2.0.3", 1634 | "isarray": "~1.0.0", 1635 | "process-nextick-args": "~2.0.0", 1636 | "safe-buffer": "~5.1.1", 1637 | "string_decoder": "~1.1.1", 1638 | "util-deprecate": "~1.0.1" 1639 | } 1640 | }, 1641 | "node_modules/through2/node_modules/safe-buffer": { 1642 | "version": "5.1.2", 1643 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1644 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1645 | }, 1646 | "node_modules/through2/node_modules/string_decoder": { 1647 | "version": "1.1.1", 1648 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1649 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1650 | "dependencies": { 1651 | "safe-buffer": "~5.1.0" 1652 | } 1653 | }, 1654 | "node_modules/tmp": { 1655 | "version": "0.2.3", 1656 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", 1657 | "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", 1658 | "dev": true, 1659 | "engines": { 1660 | "node": ">=14.14" 1661 | } 1662 | }, 1663 | "node_modules/ts-node": { 1664 | "version": "10.9.2", 1665 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 1666 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 1667 | "dependencies": { 1668 | "@cspotcode/source-map-support": "^0.8.0", 1669 | "@tsconfig/node10": "^1.0.7", 1670 | "@tsconfig/node12": "^1.0.7", 1671 | "@tsconfig/node14": "^1.0.0", 1672 | "@tsconfig/node16": "^1.0.2", 1673 | "acorn": "^8.4.1", 1674 | "acorn-walk": "^8.1.1", 1675 | "arg": "^4.1.0", 1676 | "create-require": "^1.1.0", 1677 | "diff": "^4.0.1", 1678 | "make-error": "^1.1.1", 1679 | "v8-compile-cache-lib": "^3.0.1", 1680 | "yn": "3.1.1" 1681 | }, 1682 | "bin": { 1683 | "ts-node": "dist/bin.js", 1684 | "ts-node-cwd": "dist/bin-cwd.js", 1685 | "ts-node-esm": "dist/bin-esm.js", 1686 | "ts-node-script": "dist/bin-script.js", 1687 | "ts-node-transpile-only": "dist/bin-transpile.js", 1688 | "ts-script": "dist/bin-script-deprecated.js" 1689 | }, 1690 | "peerDependencies": { 1691 | "@swc/core": ">=1.2.50", 1692 | "@swc/wasm": ">=1.2.50", 1693 | "@types/node": "*", 1694 | "typescript": ">=2.7" 1695 | }, 1696 | "peerDependenciesMeta": { 1697 | "@swc/core": { 1698 | "optional": true 1699 | }, 1700 | "@swc/wasm": { 1701 | "optional": true 1702 | } 1703 | } 1704 | }, 1705 | "node_modules/tslib": { 1706 | "version": "2.6.3", 1707 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1708 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 1709 | }, 1710 | "node_modules/tunnel": { 1711 | "version": "0.0.6", 1712 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 1713 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 1714 | "dev": true, 1715 | "engines": { 1716 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 1717 | } 1718 | }, 1719 | "node_modules/tunnel-agent": { 1720 | "version": "0.6.0", 1721 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1722 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1723 | "dependencies": { 1724 | "safe-buffer": "^5.0.1" 1725 | }, 1726 | "engines": { 1727 | "node": "*" 1728 | } 1729 | }, 1730 | "node_modules/typed-rest-client": { 1731 | "version": "1.8.11", 1732 | "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", 1733 | "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", 1734 | "dev": true, 1735 | "dependencies": { 1736 | "qs": "^6.9.1", 1737 | "tunnel": "0.0.6", 1738 | "underscore": "^1.12.1" 1739 | } 1740 | }, 1741 | "node_modules/typescript": { 1742 | "version": "5.5.4", 1743 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", 1744 | "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", 1745 | "bin": { 1746 | "tsc": "bin/tsc", 1747 | "tsserver": "bin/tsserver" 1748 | }, 1749 | "engines": { 1750 | "node": ">=14.17" 1751 | } 1752 | }, 1753 | "node_modules/uc.micro": { 1754 | "version": "1.0.6", 1755 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 1756 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 1757 | "dev": true 1758 | }, 1759 | "node_modules/underscore": { 1760 | "version": "1.13.7", 1761 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", 1762 | "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", 1763 | "dev": true 1764 | }, 1765 | "node_modules/undici-types": { 1766 | "version": "5.26.5", 1767 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1768 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 1769 | }, 1770 | "node_modules/url-join": { 1771 | "version": "4.0.1", 1772 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", 1773 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", 1774 | "dev": true 1775 | }, 1776 | "node_modules/util-deprecate": { 1777 | "version": "1.0.2", 1778 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1779 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1780 | }, 1781 | "node_modules/v8-compile-cache-lib": { 1782 | "version": "3.0.1", 1783 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1784 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" 1785 | }, 1786 | "node_modules/vsce": { 1787 | "version": "2.15.0", 1788 | "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", 1789 | "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", 1790 | "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", 1791 | "dev": true, 1792 | "dependencies": { 1793 | "azure-devops-node-api": "^11.0.1", 1794 | "chalk": "^2.4.2", 1795 | "cheerio": "^1.0.0-rc.9", 1796 | "commander": "^6.1.0", 1797 | "glob": "^7.0.6", 1798 | "hosted-git-info": "^4.0.2", 1799 | "keytar": "^7.7.0", 1800 | "leven": "^3.1.0", 1801 | "markdown-it": "^12.3.2", 1802 | "mime": "^1.3.4", 1803 | "minimatch": "^3.0.3", 1804 | "parse-semver": "^1.1.1", 1805 | "read": "^1.0.7", 1806 | "semver": "^5.1.0", 1807 | "tmp": "^0.2.1", 1808 | "typed-rest-client": "^1.8.4", 1809 | "url-join": "^4.0.1", 1810 | "xml2js": "^0.4.23", 1811 | "yauzl": "^2.3.1", 1812 | "yazl": "^2.2.2" 1813 | }, 1814 | "bin": { 1815 | "vsce": "vsce" 1816 | }, 1817 | "engines": { 1818 | "node": ">= 14" 1819 | } 1820 | }, 1821 | "node_modules/vsce/node_modules/commander": { 1822 | "version": "6.1.0", 1823 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", 1824 | "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", 1825 | "dev": true, 1826 | "engines": { 1827 | "node": ">= 6" 1828 | } 1829 | }, 1830 | "node_modules/wrappy": { 1831 | "version": "1.0.2", 1832 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1833 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1834 | "dev": true 1835 | }, 1836 | "node_modules/xdg-basedir": { 1837 | "version": "4.0.0", 1838 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1839 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 1840 | "engines": { 1841 | "node": ">=8" 1842 | } 1843 | }, 1844 | "node_modules/xml2js": { 1845 | "version": "0.4.23", 1846 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1847 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1848 | "dev": true, 1849 | "dependencies": { 1850 | "sax": ">=0.6.0", 1851 | "xmlbuilder": "~11.0.0" 1852 | }, 1853 | "engines": { 1854 | "node": ">=4.0.0" 1855 | } 1856 | }, 1857 | "node_modules/xmlbuilder": { 1858 | "version": "11.0.1", 1859 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1860 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 1861 | "dev": true, 1862 | "engines": { 1863 | "node": ">=4.0" 1864 | } 1865 | }, 1866 | "node_modules/xtend": { 1867 | "version": "4.0.2", 1868 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1869 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1870 | "engines": { 1871 | "node": ">=0.4" 1872 | } 1873 | }, 1874 | "node_modules/yallist": { 1875 | "version": "4.0.0", 1876 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1877 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1878 | "dev": true 1879 | }, 1880 | "node_modules/yauzl": { 1881 | "version": "2.10.0", 1882 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1883 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1884 | "dev": true, 1885 | "dependencies": { 1886 | "buffer-crc32": "~0.2.3", 1887 | "fd-slicer": "~1.1.0" 1888 | } 1889 | }, 1890 | "node_modules/yazl": { 1891 | "version": "2.5.1", 1892 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 1893 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 1894 | "dev": true, 1895 | "dependencies": { 1896 | "buffer-crc32": "~0.2.3" 1897 | } 1898 | }, 1899 | "node_modules/yn": { 1900 | "version": "3.1.1", 1901 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1902 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1903 | "engines": { 1904 | "node": ">=6" 1905 | } 1906 | } 1907 | } 1908 | } 1909 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-sanity", 3 | "displayName": "Sanity.io", 4 | "version": "0.2.1", 5 | "license": "MIT", 6 | "description": "Developer tools for applications powered by Sanity.io", 7 | "author": "Sanity.io ", 8 | "publisher": "sanity-io", 9 | "engines": { 10 | "vscode": "^1.91.0" 11 | }, 12 | "keywords": [ 13 | "vscode", 14 | "visual studio code", 15 | "sanity", 16 | "groq" 17 | ], 18 | "categories": [ 19 | "Programming Languages" 20 | ], 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/sanity-io/vscode-sanity.git" 24 | }, 25 | "bugs": { 26 | "url": "https://github.com/sanity-io/vscode-sanity/issues" 27 | }, 28 | "homepage": "https://github.com/sanity-io/vscode-sanity/blob/main/README.md", 29 | "icon": "images/icon.png", 30 | "activationEvents": [ 31 | "*" 32 | ], 33 | "main": "./out/extension.js", 34 | "contributes": { 35 | "configuration": { 36 | "title": "Sanity", 37 | "properties": { 38 | "sanity.useCodelens": { 39 | "type": "boolean", 40 | "default": true, 41 | "description": "Enable GROQ codelens." 42 | }, 43 | "sanity.useCDN": { 44 | "type": "boolean", 45 | "default": false, 46 | "description": "Use APICDN for GROQ queries." 47 | }, 48 | "sanity.openJSONFile": { 49 | "type": "boolean", 50 | "default": false, 51 | "description": "Open query results in a new tab as an editable JSON file." 52 | } 53 | } 54 | }, 55 | "commands": [ 56 | { 57 | "command": "sanity.executeGroq", 58 | "title": "Execute GROQ query" 59 | } 60 | ], 61 | "menus": { 62 | "commandPalette": [ 63 | { 64 | "command": "sanity.executeGroq", 65 | "when": "editorLangId == groq || editorLangId == plaintext" 66 | } 67 | ] 68 | }, 69 | "languages": [ 70 | { 71 | "id": "groq", 72 | "aliases": [ 73 | "GROQ", 74 | "groq" 75 | ], 76 | "extensions": [ 77 | ".groq" 78 | ], 79 | "configuration": "./language/language-configuration.json" 80 | } 81 | ], 82 | "grammars": [ 83 | { 84 | "language": "groq", 85 | "scopeName": "source.groq", 86 | "path": "./grammars/groq.json" 87 | }, 88 | { 89 | "injectTo": [ 90 | "source.js", 91 | "source.ts", 92 | "source.js.jsx", 93 | "source.tsx", 94 | "source.vue", 95 | "source.svelte", 96 | "source.php", 97 | "source.astro" 98 | ], 99 | "scopeName": "inline.groq", 100 | "path": "./grammars/groq.js.json", 101 | "embeddedLanguages": { 102 | "meta.embedded.block.groq": "groq" 103 | } 104 | }, 105 | { 106 | "scopeName": "markdown.groq.codeblock", 107 | "path": "./grammars/groq.md.json", 108 | "injectTo": [ 109 | "text.html.markdown" 110 | ], 111 | "embeddedLanguages": { 112 | "meta.embedded.block.groq": "javascript" 113 | } 114 | } 115 | ], 116 | "keybindings": [ 117 | { 118 | "command": "sanity.executeGroq", 119 | "key": "ctrl+shift+g", 120 | "mac": "ctrl+shift+g", 121 | "when": "editorTextFocus" 122 | } 123 | ] 124 | }, 125 | "dependencies": { 126 | "@sanity/client": "^6.21.1", 127 | "groq-js": "^1.12.0", 128 | "line-number": "^0.1.0", 129 | "osenv": "^0.1.5", 130 | "react": "^16.13.1", 131 | "react-dom": "^16.13.1", 132 | "react-jason": "^1.1.2", 133 | "ts-node": "^10.9.2", 134 | "xdg-basedir": "^4.0.0" 135 | }, 136 | "devDependencies": { 137 | "@types/node": "^20.14.14", 138 | "@types/react": "^16.9.52", 139 | "@types/react-dom": "^16.9.8", 140 | "@types/vscode": "^1.91.0", 141 | "prettier": "^2.1.2", 142 | "typescript": "5.5", 143 | "vsce": "^2.15.0" 144 | }, 145 | "scripts": { 146 | "vscode:prepublish": "npm run compile", 147 | "compile": "tsc -p ./", 148 | "watch": "tsc -watch -p ./", 149 | "test": "npm run compile", 150 | "vsce:package": "vsce package", 151 | "env:source": "export $(cat .envrc | xargs)", 152 | "vsce:publish": "sh publish.sh", 153 | "upgrade-interactive": "npx npm-check -u" 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /screenshots/codelenspreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sanity-io/vscode-sanity/185b19d51ab4aa5806de5fb7a5cebc755c8c341a/screenshots/codelenspreview.png -------------------------------------------------------------------------------- /screenshots/previewofquery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sanity-io/vscode-sanity/185b19d51ab4aa5806de5fb7a5cebc755c8c341a/screenshots/previewofquery.png -------------------------------------------------------------------------------- /src/config/findConfig.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode' 2 | import * as path from 'path' 3 | import os from 'os' 4 | import {promises as fs} from 'fs' 5 | import osenv from 'osenv' 6 | import xdgBasedir from 'xdg-basedir' 7 | 8 | export interface Config { 9 | api: { 10 | projectId: string 11 | dataset: string 12 | token?: string 13 | } 14 | } 15 | 16 | export async function loadConfig(basePath: string): Promise { 17 | let dir = basePath 18 | while (!(await hasConfig(dir))) { 19 | const parent = path.dirname(dir) 20 | if (!dir || parent === dir) { 21 | // last ditch effort, check if we are in a studio monorepo 22 | const folders = vscode?.workspace?.workspaceFolders || [] 23 | dir = (folders.length && folders[0].uri.fsPath + '/studio') || '/' 24 | if (!(await hasConfig(dir))) { 25 | return false 26 | } 27 | } else { 28 | dir = parent 29 | } 30 | } 31 | 32 | const configContent = await fs.readFile(path.join(dir, 'sanity.json'), 'utf8') 33 | const config = parseJson(configContent) 34 | if (!config || !config.api || !config.api.projectId) { 35 | return false 36 | } 37 | 38 | const cliConfigContent = await fs.readFile(getGlobalConfigLocation(), 'utf8') 39 | const cliConfig = parseJson(cliConfigContent) 40 | 41 | return cliConfig ? {...config.api, token: cliConfig.authToken} : config.api 42 | } 43 | 44 | async function hasConfig(dir: string): Promise { 45 | return fs 46 | .stat(path.join(dir, 'sanity.json')) 47 | .then(() => true) 48 | .catch(() => false) 49 | } 50 | 51 | function parseJson(content: string) { 52 | try { 53 | return JSON.parse(content) 54 | } catch (err) { 55 | return false 56 | } 57 | } 58 | 59 | function getGlobalConfigLocation() { 60 | const user = (osenv.user() || 'user').replace(/\\/g, '') 61 | const configDir = xdgBasedir.config || path.join(os.tmpdir(), user, '.config') 62 | return path.join(configDir, 'sanity', 'config.json') 63 | } 64 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path' 2 | import * as vscode from 'vscode' 3 | import {promises as fs, constants as fsconstants} from 'fs' 4 | import {parse} from 'groq-js' 5 | import {register as registerTsNode} from 'ts-node' 6 | import {Config} from './config/findConfig' 7 | import {GroqContentProvider} from './providers/content-provider' 8 | import {GROQCodeLensProvider} from './providers/groq-codelens-provider' 9 | import {executeGroq} from './query' 10 | 11 | export function activate(context: vscode.ExtensionContext) { 12 | // needed to load sanity.cli.ts 13 | registerTsNode() 14 | 15 | // Assigned by `readConfig()` 16 | let codelens: vscode.Disposable | undefined 17 | let useCodelens 18 | let openJSONFile 19 | let useCDN 20 | 21 | // Read and listen for configuration updates 22 | readConfig() 23 | vscode.workspace.onDidChangeConfiguration(() => readConfig()) 24 | 25 | let resultPanel: vscode.WebviewPanel | undefined 26 | let disposable = vscode.commands.registerCommand('sanity.executeGroq', async (groqQuery) => { 27 | let config: Config 28 | let query: string = groqQuery 29 | let params: Record = {} 30 | try { 31 | config = await loadSanityConfig() 32 | if (config === null) { 33 | return 34 | } 35 | 36 | if (!query) { 37 | query = await loadGroqFromFile() 38 | } 39 | const variables = findVariablesInQuery(query) 40 | if (variables.length > 0) { 41 | params = await readParams(variables) 42 | } 43 | 44 | vscode.window.showInformationMessage(`Executing GROQ query: ${query}`) 45 | // FIXME: Throw error object in webview? 46 | const {ms, result} = await executeGroq({ 47 | ...config.api, 48 | query, 49 | params, 50 | useCdn: config.api.token ? false : useCDN, 51 | }) 52 | 53 | vscode.window.setStatusBarMessage( 54 | `Query took ${ms}ms` + (useCDN ? ' with cdn' : ' without cdn'), 55 | 10000 56 | ) 57 | 58 | if (!openJSONFile && !resultPanel) { 59 | resultPanel = vscode.window.createWebviewPanel( 60 | 'executionResultsWebView', 61 | 'GROQ Execution Result', 62 | vscode.ViewColumn.Beside, 63 | {} 64 | ) 65 | 66 | resultPanel.onDidDispose(() => { 67 | resultPanel = undefined 68 | }) 69 | } 70 | 71 | if (openJSONFile) { 72 | await openInUntitled(result, 'json') 73 | } else if (resultPanel) { 74 | const contentProvider = await registerContentProvider( 75 | context, 76 | query, 77 | params, 78 | ms, 79 | result || [] 80 | ) 81 | const html = await contentProvider.getCurrentHTML() 82 | resultPanel.webview.html = html 83 | } 84 | } catch (err) { 85 | vscode.window.showErrorMessage(getErrorMessage(err)) 86 | return 87 | } 88 | }) 89 | context.subscriptions.push(disposable) 90 | 91 | function readConfig() { 92 | const settings = vscode.workspace.getConfiguration('sanity') 93 | openJSONFile = settings.get('openJSONFile', false) 94 | useCodelens = settings.get('useCodelens', true) 95 | useCDN = settings.get('useCDN', false) 96 | 97 | if (useCodelens && !codelens) { 98 | codelens = vscode.languages.registerCodeLensProvider( 99 | ['javascript', 'typescript', 'javascriptreact', 'typescriptreact', 'groq'], 100 | new GROQCodeLensProvider() 101 | ) 102 | 103 | context.subscriptions.push(codelens) 104 | } else if (!useCodelens && codelens) { 105 | const subIndex = context.subscriptions.indexOf(codelens) 106 | context.subscriptions.splice(subIndex, 1) 107 | codelens.dispose() 108 | codelens = undefined 109 | } 110 | } 111 | } 112 | 113 | async function loadSanityConfig() { 114 | const configFiles = await vscode.workspace.findFiles('**/sanity.cli.ts', '**/node_modules/**') 115 | if (configFiles.length === 0) { 116 | throw new Error('Could not resolve sanity.cli.ts configuration file') 117 | } 118 | let configFilePath: string | undefined = configFiles[0].fsPath 119 | 120 | // if there are multiple files, ask the user to pick one 121 | if (configFiles.length > 1) { 122 | const values = configFiles.map((value) => { 123 | const workspacePath = vscode.workspace.getWorkspaceFolder(value) 124 | const label = path.relative(workspacePath?.uri.fsPath || '', value.fsPath) 125 | return {label, value} 126 | }) 127 | 128 | configFilePath = await vscode.window 129 | .showQuickPick(values, {}) 130 | .then((selected) => selected?.value.fsPath) 131 | } 132 | 133 | // the user canceled the quick pick 134 | if (!configFilePath) { 135 | return null 136 | } 137 | 138 | const exists = await checkFileExists(configFilePath) 139 | if (!exists) { 140 | throw new Error('Could not resolve sanity.cli.ts configuration file') 141 | } 142 | 143 | // clear require cache to ensure we get the latest version 144 | delete require.cache[require.resolve(configFilePath)] 145 | 146 | const config = require(configFilePath) 147 | return config.default 148 | } 149 | 150 | async function loadGroqFromFile() { 151 | const activeTextEditor = vscode.window.activeTextEditor 152 | if (!activeTextEditor) { 153 | throw new Error('Nothing to execute') 154 | } 155 | 156 | return activeTextEditor.document.getText() 157 | } 158 | 159 | async function registerContentProvider( 160 | context: vscode.ExtensionContext, 161 | query: string, 162 | params: Record, 163 | ms: number, 164 | result: any 165 | ): Promise { 166 | const contentProvider = new GroqContentProvider(query, params, ms, result) 167 | const registration = vscode.workspace.registerTextDocumentContentProvider('groq', contentProvider) 168 | context.subscriptions.push(registration) 169 | return contentProvider 170 | } 171 | 172 | function getActiveFileName(): string { 173 | return vscode.window.activeTextEditor?.document.fileName || '' 174 | } 175 | 176 | async function checkFileExists(file) { 177 | return fs 178 | .access(file, fsconstants.F_OK) 179 | .then(() => true) 180 | .catch(() => false) 181 | } 182 | 183 | function findVariablesInQuery(query: string): string[] { 184 | return findVariables(parse(query), []) 185 | } 186 | 187 | function findVariables(node: any, found: string[]): string[] { 188 | if (node && node.type === 'Parameter' && typeof node.name === 'string') { 189 | return found.concat(node.name) 190 | } 191 | 192 | if (Array.isArray(node)) { 193 | return node.reduce((acc, child) => findVariables(child, acc), found) 194 | } 195 | 196 | if (typeof node !== 'object') { 197 | return found 198 | } 199 | 200 | return Object.keys(node).reduce((acc, key) => findVariables(node[key], acc), found) 201 | } 202 | 203 | async function readParamsFile(): Promise> { 204 | const activeFile = getActiveFileName() 205 | if (activeFile && activeFile !== '') { 206 | var pos = activeFile.lastIndexOf('.') 207 | const absoluteParamFile = activeFile.substring(0, pos < 0 ? activeFile.length : pos) + '.json' 208 | if (await checkFileExists(absoluteParamFile)) { 209 | try { 210 | const content = await fs.readFile(absoluteParamFile) 211 | return JSON.parse(content.toString()) 212 | } catch (err) { 213 | vscode.window.showErrorMessage(`Failed to read parameter file: ${getErrorMessage(err)}`) 214 | } 215 | } 216 | } 217 | 218 | return {} 219 | } 220 | 221 | async function readParams(variables: string[]): Promise> { 222 | const values: Record = await readParamsFile() 223 | const missing = variables.filter((variable) => !values[variable]) 224 | for (const variable of missing) { 225 | let value = await vscode.window.showInputBox({title: `value for "${variable}"`, value: ''}) 226 | if (!value) { 227 | continue 228 | } 229 | 230 | try { 231 | value = JSON.parse(value) 232 | } catch (err) { 233 | // noop 234 | } 235 | values[variable] = value 236 | } 237 | 238 | return values 239 | } 240 | 241 | async function openInUntitled(content: string, language?: string) { 242 | const cs = JSON.stringify(content) 243 | await vscode.workspace.openTextDocument({content: cs}).then((document) => { 244 | vscode.window.showTextDocument(document, {viewColumn: vscode.ViewColumn.Beside}) 245 | vscode.languages.setTextDocumentLanguage(document, language || 'json') 246 | }) 247 | } 248 | 249 | function getErrorMessage(err: unknown): string { 250 | if (err instanceof Error) { 251 | return err.message 252 | } 253 | 254 | if (typeof err === 'string') { 255 | return err 256 | } 257 | 258 | return 'An error occurred' 259 | } 260 | -------------------------------------------------------------------------------- /src/providers/content-provider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/server' 3 | import {type TextDocumentContentProvider, type Uri, type ProviderResult} from 'vscode' 4 | import {ResultView} from '../resultView/ResultView' 5 | 6 | export class GroqContentProvider implements TextDocumentContentProvider { 7 | private html: string = '' 8 | 9 | constructor(query: string, params: Record, ms: number, data: any) { 10 | this.html = ` 11 | 12 | 13 | GROQ result 14 | 18 | 19 | ${this.render(query, params, ms, data)} 20 | 21 | ` 22 | } 23 | 24 | provideTextDocumentContent(_: Uri): ProviderResult { 25 | return this.html 26 | } 27 | 28 | getCurrentHTML(): Promise { 29 | return new Promise((resolve) => { 30 | resolve(this.html) 31 | }) 32 | } 33 | 34 | render(query: string, params: Record, ms: number, result: any) { 35 | return ReactDOM.renderToStaticMarkup( 36 | <> 37 | 38 | 39 | ) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/providers/groq-codelens-provider.ts: -------------------------------------------------------------------------------- 1 | import {type CodeLensProvider, type TextDocument, type CancellationToken, CodeLens, Range, Position} from 'vscode' 2 | 3 | interface ExtractedQuery { 4 | content: string 5 | uri: string 6 | position: Position 7 | } 8 | 9 | function extractAllTemplateLiterals(document: TextDocument): ExtractedQuery[] { 10 | const documents: ExtractedQuery[] = [] 11 | const text = document.getText() 12 | const regExpGQL = new RegExp('groq\\s*`([\\s\\S]+?)`', 'mg') 13 | 14 | let prevIndex = 0 15 | let result 16 | while ((result = regExpGQL.exec(text)) !== null) { 17 | const content = result[1] 18 | const queryPosition = text.indexOf(content, prevIndex) 19 | documents.push({ 20 | content: content, 21 | uri: document.uri.path, 22 | position: document.positionAt(queryPosition), 23 | }) 24 | prevIndex = queryPosition + 1 25 | } 26 | return documents 27 | } 28 | 29 | function extractAllDefineQuery(document: TextDocument): ExtractedQuery[] { 30 | const documents: ExtractedQuery[] = [] 31 | const text = document.getText() 32 | const pattern = '(\\s*defineQuery\\((["\'`])([\\s\\S]*?)\\2\\))' 33 | const regexp = new RegExp(pattern, 'g'); 34 | 35 | let prevIndex = 0 36 | let result 37 | while ((result = regexp.exec(text)) !== null) { 38 | const content = result[3] 39 | const queryPosition = text.indexOf(result[1], prevIndex) 40 | documents.push({ 41 | content: content, 42 | uri: document.uri.path, 43 | position: document.positionAt(queryPosition), 44 | }) 45 | prevIndex = queryPosition + 1 46 | } 47 | return documents 48 | } 49 | 50 | export class GROQCodeLensProvider implements CodeLensProvider { 51 | constructor() {} 52 | 53 | public provideCodeLenses(document: TextDocument, _token: CancellationToken): CodeLens[] { 54 | if (document.languageId === 'groq') { 55 | return [ 56 | new CodeLens(new Range(new Position(0, 0), new Position(0, 0)), { 57 | title: 'Execute Query', 58 | command: 'sanity.executeGroq', 59 | arguments: [document.getText()], 60 | }), 61 | ] 62 | } 63 | 64 | // find all lines where "groq" exists 65 | const queries: ExtractedQuery[] = [...extractAllTemplateLiterals(document), ...extractAllDefineQuery(document)] 66 | 67 | // add a button above each line that has groq 68 | return queries.map((def) => { 69 | return new CodeLens( 70 | new Range(new Position(def.position.line, 0), new Position(def.position.line, 0)), 71 | { 72 | title: 'Execute Query', 73 | command: 'sanity.executeGroq', 74 | arguments: [def.content], 75 | } 76 | ) 77 | }) 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/query.ts: -------------------------------------------------------------------------------- 1 | import {createClient} from '@sanity/client' 2 | import * as vscode from 'vscode' 3 | 4 | export async function executeGroq(options: { 5 | projectId: string 6 | dataset: string 7 | query: string 8 | params: Record 9 | useCdn: boolean 10 | token?: string 11 | }) { 12 | const {query, params, ...clientOptions} = options 13 | const {token, ...noTokenClientOptions} = clientOptions 14 | return createClient(clientOptions) 15 | .fetch(query, params, {filterResponse: false}) 16 | .catch((err) => { 17 | if (err.statusCode === 401) { 18 | vscode.window.showInformationMessage(err.message + '. Falling back to public dataset.') 19 | return createClient(noTokenClientOptions).fetch(query, params, {filterResponse: false}) 20 | } 21 | 22 | throw err 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /src/resultView/ResultView.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {ReactJason} from 'react-jason' 3 | 4 | export function ResultView({query, params, ms, result}: {query: string; params: Record; ms: number; result: any}) { 5 | return ( 6 |
7 |

Query result

8 |

Query: {query}

9 |

params: {JSON.stringify(params)}

10 |

Time: {ms}ms

11 | 12 |
13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "Node16", 4 | "target": "ES2022", 5 | "outDir": "out", 6 | "lib": ["ES2022", "esnext", "dom"], 7 | "sourceMap": true, 8 | "rootDir": "src", 9 | /* Strict Type-Checking Option */ 10 | "strict": true /* enable all strict type-checking options */, 11 | /* Additional Checks */ 12 | "noUnusedLocals": true /* Report errors on unused locals. */, 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | "noImplicitAny": false, 17 | "esModuleInterop": true, 18 | "jsx": "react" 19 | }, 20 | "exclude": ["node_modules", ".vscode-test", "ts-graphql-plugin"] 21 | } 22 | --------------------------------------------------------------------------------