├── .devcontainer └── devcontainer.json ├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── images └── icon.png ├── package-lock.json ├── package.json ├── src ├── commands.ts ├── config.ts ├── constants.ts ├── extension.ts ├── git.ts ├── store.ts ├── utils.ts └── watcher.ts └── tsconfig.json /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "build": "npm run package" 4 | } 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it 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 | "name": "Run Extension", 9 | "type": "extensionHost", 10 | "request": "launch", 11 | "runtimeExecutable": "${execPath}", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ], 15 | "outFiles": [ 16 | "${workspaceFolder}/out/**/*.js" 17 | ], 18 | "preLaunchTask": "npm: watch" 19 | }, 20 | { 21 | "name": "Extension Tests", 22 | "type": "extensionHost", 23 | "request": "launch", 24 | "runtimeExecutable": "${execPath}", 25 | "args": [ 26 | "--extensionDevelopmentPath=${workspaceFolder}", 27 | "--extensionTestsPath=${workspaceFolder}/out/test" 28 | ], 29 | "outFiles": [ 30 | "${workspaceFolder}/out/test/**/*.js" 31 | ], 32 | "preLaunchTask": "npm: watch" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "out": false 4 | }, 5 | "search.exclude": { 6 | "out": true 7 | }, 8 | "typescript.tsc.autoDetect": "off", 9 | "editor.formatOnSave": true, 10 | "gitdoc.enabled": false 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | src/** 3 | .gitignore 4 | **/tsconfig.json 5 | **/tslint.json 6 | **/*.map 7 | **/*.ts -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## v0.2.3 (12/26/2024) 2 | 3 | - Introduced a new `GitDoc > AI: Use Emojis` setting, to alloq prepending AI-generated commit messages with an emoji. 4 | 5 | ## v0.2.2 (12/26/2024) 6 | 7 | - Introduced a new `GitDoc > AI: Custom Instructions` setting, to allow configuring the style/format of the AI-generated commit mesa 8 | 9 | ## v0.2.1 (12/26/2024) 10 | 11 | - Introduced a new `GitDoc: Commit` command, to manually trigger a commit, as opposed to waiting until the next auto-commit 12 | - Introduced a new `GotDoc: No Verify` setting, which allows suppressing git hooks for GitDoc-generated commits 13 | - GitDoc now checks whether a git repo has remotes before trying to push/pull 14 | 15 | ## v0.2.0 (12/26/2024) 16 | 17 | - Introduced the ability to generate semantic commit messages with AI 18 | - The `GitDoc: Auto Commit Delay` and `GitDoc: File Pattern` settings now take affect immediately whenever you change them 19 | 20 | ## v0.1.0 (08/10/2022) 21 | 22 | - Fixed a bug with VS Code v1.70 23 | - Added the `GitDoc: Push Mode` setting, that allows controlling how commits are automatically pushed to the remote repository 24 | - Commit messages now format datetimes using a configured timezone 25 | - Removed the `GitDoc` suffix from the status bar button, in order to reduce UI clutter 26 | 27 | ## v0.0.8 (03/20/2021) 28 | 29 | - Fixed an issue where the GitDoc setting was being written to every workspace you opened 30 | 31 | ## v0.0.7 (03/07/2021) 32 | 33 | - Introduced the ability to auto-pull changes from the remote. 34 | - Changes are now auto-committed when you close VS Code. 35 | - Removed the `GitDoc: Enable (Branch)` and `GitDoc: Disable (Branch)` commands 36 | 37 | ## v0.0.6 (04/25/2020) 38 | 39 | - Auto-commits are now only made when changes files don't have any associated errors. This behavior can be changed with the new `GitDoc: Commit Validation Level` setting. 40 | 41 | ## v0.0.5 (04/23/2020) 42 | 43 | - Introduced the `Undo Version` command to the `Timeline` tree, which allows you to revert a previous change 44 | - Added the new `GitDoc: Auto Commit Delay` setting, which allows you to control how much time to delay creating commits after saving 45 | - Renamed the `Collapse Version(s) Above` command to `Squash Version(s) Above` 46 | - Renamed the `onSave` option of the `GitDoc: Auto Push` setting to `onCommit` 47 | 48 | ## v0.0.4 (04/19/2020) 49 | 50 | - Introduced the `Squash Version(s) Above` command to the `Timeline` tree, which allows you to merge/name a bunch of auto-commits into a single version 51 | - Introduced the `Restore Version` command to the `Timeline` tree, which allows you to restore a previous version of a file 52 | 53 | ## v0.0.3 (04/18/2020) 54 | 55 | - Added the `GitDoc: File Pattern` setting, which allows you to enable auto-commits on only specific files 56 | - Fixed an issue where the commit message and date didn't match 57 | 58 | ## v0.0.2 (04/17/2020) 59 | 60 | - The status bar item now indicates when it is actively syncing or not 61 | 62 | ## v0.0.1 (04/17/2020) 63 | 64 | Initial release! 🎉 65 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) Jonathan Carter and Contributors. 2 | 3 | MIT License 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 | # GitDoc 📄 2 | 3 | GitDoc is a Visual Studio Code extension that allows you to automatically commit/push/pull changes on save. This gives you the simplicity of a Google/Word Doc (creating "snapshots" by saving, not by running `git commit`), but with the richness of git history, and the ability to easily [share](https://github.com) your work. You can enable these auto-commits during specific periods (e.g. when you're working on a feature branch and want to track the evolution of a change), permanently on [specific branches](#auto-commiting-specific-branches) (e.g. you have a `docs` repo that you want to version like a document), or only for [specific files](#auto-commiting-specific-files) (e.g. auto-commmit `*.md` files, but nothing else). This allows you to easily switch between "versioning modalities", in order to support the diverse set of use cases that can benefit from being stored in a git repo (e.g. team projects, your personal blog, school work, etc.) 4 | 5 | By default, commits are only created for [error-free code](#error-detection), which allows you to author and save changes, knowing you aren't accidentally persisting invalid states. Additionally, just because you're auto-commmiting your changes, doesn't mean you lose control over your version history. When needed, you can easily [restore](#restoring-versions), [undo](#undoing-changes), and/or [squash](#squashing-versions) versions, without needing to memorize the [magic of git](https://sethrobertson.github.io/GitFixUm/fixup.html) 🦸‍♀️ 6 | 7 | 8 | 9 | ## Getting Started 10 | 11 | 1. Install this extension 12 | 2. Run the `GitDoc: Enable` command, and notice that your status bar now includes a "mirror" icon button. This indicates that `GitDoc` is enabled 🚀 13 | 3. Open a file, make a change, and then save it 14 | 4. Open the `Timeline` view on the `Explorer` tab (or run `git log`), and within 30s, notice that a new commit was created on your behalf 15 | 5. Select the top item in the `Timeline` view to see the diff of the change you just made 16 | 6. Continue to make changes, knowing that they'll be automatically tracked for you (as long as they don't contain [errors](#error-detection)) 👍 17 | 18 | From here, you can [restore](#restoring-versions), [undo](#undoing-changes), and/or [squash](#collapsing-versions) versions from the `Timeline`, in order to "clean" up/manage your history. When you're done, simply click the `GitDoc` button in your status bar, or run the `GitDoc: Disable` command, in order to disable auto-commits. 19 | 20 | And if you'd like to have GitDoc generate semantic commit messages on your behalf, you can enable the [Copilot integration](#ai-generated-commit-messages), which uses AI to automatically summarize your changes 🤖 21 | 22 | ## Auto-commiting 23 | 24 | By default, when you enable `GitDoc`, it will create commits every 30s, _whenever there are actually changes_. So if you don't make any changes, than it won't make any commits. However, if you're continuously writing code, then it's only going to capture those edits in 30s intervals. This way, you don't generate a massive number of commits, depending on how frequently you save files. If you find that 30s is too short or too long, you can customize this by setting the `GitDoc: Auto Commit Delay` setting to the appropriate value. 25 | 26 | ### Error Detection 27 | 28 | By default, auto-commits are only made when a file is changed, and it doesn't have any pending errors (e.g. issues in the `Problems` panel with an `error` severity). This prevents you from creating commits that represent invalid changes, and allows you to install whatever linting/testing/build extensions you want, knowing that they'll "gate" your auto-commits. If you want to suppress commits in the presence of warnings, or ignore problems entirely, and simply always auto-commit, then you can set the `GitDoc: Commit Validation Level` setting to `warning` or `none` respectively. 29 | 30 | 31 | 32 | ### Auto-commiting specific files 33 | 34 | If you'd like to only enable auto-commiting for specific files, you can set the `GitDoc: File Pattern` setting to a file glob. For example, you could set this to `**/*.md` in order to auto-commit markdown files, but nothing else. By default, this is set to `**/*`, which auto-commits changes to any file. 35 | 36 | When this setting is set, the `GitDoc` [status bar](#status-bar) which only appear when you have a file that is matches it. This way, you can easily tell when you're editing a file that will be auto-committed/pushed. 37 | 38 | ### Auto-saving 39 | 40 | When you enable `GitDoc`, it creates a new commit anytime you save a file. This allows you to control when commits are created, simply be determining when you save. You can save a single file, or multiple files, and all of the changes within a single "save operation" will be committed together. If you'd like to automatically track your changes, without needing to explicitly save, then simply set the `Files: Auto Save` setting, specifying the exact behavior you'd like (e.g. save every 30s). 41 | 42 | ## Auto-pushing 43 | 44 | In addition to automatically creating commits, GitDoc will automatically push your changes to the configured remote. By default, changes will be pushed as soon as you commit them, but this can be configured via the `GitDoc: Autopush` setting. This can be set to `afterDelay` in order to push on some sort of frequency (controlled via the `GitDoc: Auto Push Delay` setting). Additionally, if you don't want to auto-push changes, you can disable this behavior by setting the `GitDoc: Autopush` setting to `off`. 45 | 46 | By default, GitDoc will perform a "force push", since certain operations such as [`squashing`](#squashing-versions) can actually re-write history. However, if you'd like to change this behavior, you can set the `GitDoc: Push Mode` to either `Force Push with Lease` or `Push`. 47 | 48 | ## Auto-pulling 49 | 50 | By default, when you enable `GitDoc`, it will automatically pull changes from the repo when you 1) open the workspace, and 2) [push changes](#auto-pushing). This ensures that your local copy is in sync with the remote, and attempts to mitigate merge conflics from happening. If you'd like to modify this behavior, you can customize the `GitDoc: Auto Pull` and `GitDoc: Pull on Open` settings. 51 | 52 | ## AI-Generated Commit Messages 53 | 54 | By default, GitDoc generates commit messages based on the day and time that they're committed. However, it can also use AI to generate commit messages based on contents of the changes you make. If you'd like to enable this capability, simply install the Copilot extension, and then enable the `GitDoc > AI: Enabled` setting. Once complete, you'll notice that your auto-commits now have semantic/friendly messages. 55 | 56 | By default, GitDoc uses `gpt-4o` for generating commit messages, but you can only try out other models (e.g. `o1`, `claude-3.5-sonnet`) by changing the `GitDoc > AI: Model` setting. Additionally, if you'd like to prepend an emoji to the AI-generated commit messages, then enable the `GitDoc > AI: Use Emojis` setting. And if you'd like to provide GitDoc with more specific stylistic preferences, then you can set the `GitDoc > AI: Custom Instructions` setting to include any additional guidance (e.g. "Use only lowercase letters"). 57 | 58 | ## Squashing versions 59 | 60 | Auto-committing is useful for tracking unique versions, however, depending on how frequently you save, you could end up creating a significant number of file versions. If a series of versions represent a single logical change, you can "squash" them together by right-clicking the oldest version in the `Timeline` tree and selecting the `Squash Version(s) Above` command. You can give the new version a name, and when submitted, the selected version, and all versions above it, will be "squashed" into a single version. 61 | 62 | 63 | 64 | > Demystification: Behind the scenes, this command performs a `git reset --soft`, starting at the commit _before_ the selected one. It then runs `git commit -m `, where `message` is the string you specified. This preserves your working directory/index, while "rewritting" the commit history. 65 | 66 | ## Undoing versions 67 | 68 | If you made a change, that you want to undo, you can simply open up the `Timeline` view, right-click the version you want to undo, and select `Undo Version`. This will create a new version that undos the changes that were made in the selected version. This way, any undo action is actually a "forward edit", that you can then undo again if needed. 69 | 70 | > Demystification: Behind the scenes, this command simply performs a `git revert` on the selcted commit. Because this is a "safe" action, you can generally perform it without any problems (including on shared branches), since it doesn't re-write history. 71 | 72 | ## Restoring versions 73 | 74 | If you've made a bunch of changes to a file, and want to restore an older version, simply open up the `Timeline` tree, right-click the desired version, and select `Restore Version`. 75 | 76 | > Demystification: Behind the scenes, this command peforms a `git checkout -- ` (on the file that's associated with the selected timeline item), followed by `git commit` (in order to commit the restoration). This way, the restore is a "forward moving" operation. 77 | 78 | ## Status Bar 79 | 80 | Whenever `GitDoc` is enabled, it will contribute a status bar item to your status bar. This simply indicates that it's enabled, and makes it easier for you to know which "versioning mode" you're in (auto-commit vs. manual commit). Additionally, if you enable [auto-pushing](#auto-pushing), then the status bar will indicate when it's syncing your commits with your repo. If you click the `GitDoc` status bar item, this will disable `GitDoc`. This allows you to easily enable GitDoc for a period of time, and then quickly turn it off. 81 | 82 | ## Contributed Commands 83 | 84 | When you install the `GitDoc` extension, the following commands are contributed to the command palette, and are visible when your open workspace is also a git repository: 85 | 86 | - `GitDoc: Enable` - Enables auto-commits. This command is only visible when GitDoc isn't already enabled. 87 | 88 | - `GitDoc: Disable` - Disables auto-commits. This command is only visible when GitDoc is enabled. 89 | 90 | - `GitDoc: Commit` - Manually commits changes. This command allows you to trigger a commit without waiting for the auto-commit interval. 91 | 92 | ## Contributed Settings 93 | 94 | The following settings enable you to customize the default behavior of `GitDoc`: 95 | 96 | - `GitDoc: Auto Commit Delay` - Controls the delay in ms after which any changes are automatically committed. Only applies when `GitDoc: Enabled` is set to `true`. Defaults to `30000` (30s). 97 | 98 | - `GitDoc: Autopull` - Specifies whether to automatically pull changes from the current remote. Can be set to one of the following values: `afterDelay`, `onCommit`, `onPush`, or `off`. Defaults to `onPush`. 99 | 100 | - `GitDoc: Autopull Delay` - Controls the delay in ms after which any changes are automatically pulled. Only applies when `GitDoc: Auto Pull` is set to `afterDelay`. Defaults to `30000`. 101 | 102 | - `GitDoc: Autopush` - Specifies whether to automatically push changes to the current remote. Can be set to one of the following values: `afterDelay`, `onCommit`,or `off`. Defaults to `onCommit`. 103 | 104 | - `GitDoc: Autopush Delay` - Controls the delay in ms after which any commits are automatically pushed. Only applies when `GitDoc: Auto Push` is set to `afterDelay`. Defaults to `30000`. 105 | 106 | - `GitDoc: Commit Message Format` - Specifies the [moment.js](https://momentjs.com/) format string to use when generating auto-commit messages. Defaults to `LLL`. 107 | 108 | - `GitDoc: Commit Validation Level` - Specifies whether to validate that a file is free of problems, before attempting to commit changes to it. Defaults to `error`. 109 | 110 | - `GitDoc: Commit on Close` - Specifies whether to automatically commit changes when you close VS Code. Defaults to `true`. 111 | 112 | - `GitDoc: Enabled` - Specifies whether to automatically create a commit each time you save a file. 113 | 114 | - `GitDoc: File Pattern` - Specifies a glob that indicates the exact files that should be automatically committed. This is useful if you'd like to only [auto-commiting specific files](#auto-commiting-specific-files), as opposed to an entire branch. 115 | 116 | - `GitDoc: Pull on Open` - Specifies whether to automatically pull remote changes when you open a repo. Defaults to `true`. 117 | 118 | - `GitDoc: Push Mode` - Specifies how changes should be pushed after they're committed. This setting only applies when auto-pushing is enabled. Can be set to one of the following values: `forcePushWithLease`, `forcePush`, or `push`. Defaults to `forcePush`. 119 | 120 | - `GitDoc: Exclude Branches` - Specifies a list of branches that should be excluded from auto-commits. This allows you to prevent auto-commits on specific branches, ensuring that your work on these branches remains manual. This is particularly useful for branches where you want to have more control over the commits, such as production or release branches. Defaults to `[]`. 121 | 122 | - `GitDoc: No Verify` - Specifies whether to ignore any configured git hooks. Defaults to `false`. 123 | 124 | ### AI Settings 125 | 126 | - `GitDoc > AI: Enabled` - Specifies whether to use AI to generate commit messages. This setting only applies when you have the Copilot extension installed and setup. 127 | 128 | - `GitDoc > AI: Model` - Specifies the AI model to use when generating commit messages. This setting only applies when `GitDoc > AI: Enabled` is set to `true`. Defaults to `gpt-4o`. 129 | 130 | - `GitDoc > AI: Custom Instructions` - Specifies custom instructions to use when generating commit messages (e.g. use conventional commit syntax, use emojis). This setting only applies when `GitDoc > AI: Enabled` is set to `true`." 131 | 132 | - `GitDoc > AI: Use Emojis` - Specifies whether to prepend AI-generated commit messages with an emoji. This setting only applies when `GitDoc > AI: Enabled` is set to `true`. Defaults to `false`. -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lostintangent/gitdoc/5e596daccc7195cd1296f1d4ae7a58936ad8d1a3/images/icon.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitdoc", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "gitdoc", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "luxon": "^2.0.2", 12 | "minimatch": "^3.0.4", 13 | "mobx": "^5.14.2" 14 | }, 15 | "devDependencies": { 16 | "@types/debounce": "^1.2.0", 17 | "@types/luxon": "^2.0.5", 18 | "@types/minimatch": "^3.0.3", 19 | "@types/node": "^18.6.5", 20 | "@types/vscode": "1.90.0", 21 | "tslint": "^5.8.0", 22 | "typescript": "^4.7.4", 23 | "vsce": "^2.10.0" 24 | }, 25 | "engines": { 26 | "vscode": "^1.90.0" 27 | } 28 | }, 29 | "node_modules/@babel/code-frame": { 30 | "version": "7.5.5", 31 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 32 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 33 | "dev": true, 34 | "dependencies": { 35 | "@babel/highlight": "^7.0.0" 36 | } 37 | }, 38 | "node_modules/@babel/highlight": { 39 | "version": "7.5.0", 40 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 41 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 42 | "dev": true, 43 | "dependencies": { 44 | "chalk": "^2.0.0", 45 | "esutils": "^2.0.2", 46 | "js-tokens": "^4.0.0" 47 | } 48 | }, 49 | "node_modules/@types/debounce": { 50 | "version": "1.2.0", 51 | "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.0.tgz", 52 | "integrity": "sha512-bWG5wapaWgbss9E238T0R6bfo5Fh3OkeoSt245CM7JJwVwpw6MEBCbIxLq5z8KzsE3uJhzcIuQkyiZmzV3M/Dw==", 53 | "dev": true 54 | }, 55 | "node_modules/@types/luxon": { 56 | "version": "2.0.5", 57 | "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.5.tgz", 58 | "integrity": "sha512-GKrG5v16BOs9XGpouu33hOkAFaiSDi3ZaDXG9F2yAoyzHRBtksZnI60VWY5aM/yAENCccBejrxw8jDY+9OVlxw==", 59 | "dev": true 60 | }, 61 | "node_modules/@types/minimatch": { 62 | "version": "3.0.3", 63 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 64 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 65 | "dev": true 66 | }, 67 | "node_modules/@types/node": { 68 | "version": "18.6.5", 69 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", 70 | "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", 71 | "dev": true 72 | }, 73 | "node_modules/@types/vscode": { 74 | "version": "1.90.0", 75 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.90.0.tgz", 76 | "integrity": "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ==", 77 | "dev": true, 78 | "license": "MIT" 79 | }, 80 | "node_modules/ansi-styles": { 81 | "version": "3.2.1", 82 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 83 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 84 | "dev": true, 85 | "dependencies": { 86 | "color-convert": "^1.9.0" 87 | }, 88 | "engines": { 89 | "node": ">=4" 90 | } 91 | }, 92 | "node_modules/argparse": { 93 | "version": "1.0.10", 94 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 95 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 96 | "dev": true, 97 | "dependencies": { 98 | "sprintf-js": "~1.0.2" 99 | } 100 | }, 101 | "node_modules/azure-devops-node-api": { 102 | "version": "11.2.0", 103 | "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", 104 | "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", 105 | "dev": true, 106 | "dependencies": { 107 | "tunnel": "0.0.6", 108 | "typed-rest-client": "^1.8.4" 109 | } 110 | }, 111 | "node_modules/balanced-match": { 112 | "version": "1.0.0", 113 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 114 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 115 | }, 116 | "node_modules/base64-js": { 117 | "version": "1.5.1", 118 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 119 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 120 | "dev": true, 121 | "funding": [ 122 | { 123 | "type": "github", 124 | "url": "https://github.com/sponsors/feross" 125 | }, 126 | { 127 | "type": "patreon", 128 | "url": "https://www.patreon.com/feross" 129 | }, 130 | { 131 | "type": "consulting", 132 | "url": "https://feross.org/support" 133 | } 134 | ] 135 | }, 136 | "node_modules/bl": { 137 | "version": "4.1.0", 138 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 139 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 140 | "dev": true, 141 | "dependencies": { 142 | "buffer": "^5.5.0", 143 | "inherits": "^2.0.4", 144 | "readable-stream": "^3.4.0" 145 | } 146 | }, 147 | "node_modules/boolbase": { 148 | "version": "1.0.0", 149 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 150 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 151 | "dev": true 152 | }, 153 | "node_modules/brace-expansion": { 154 | "version": "1.1.11", 155 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 156 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 157 | "dependencies": { 158 | "balanced-match": "^1.0.0", 159 | "concat-map": "0.0.1" 160 | } 161 | }, 162 | "node_modules/buffer": { 163 | "version": "5.7.1", 164 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 165 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 166 | "dev": true, 167 | "funding": [ 168 | { 169 | "type": "github", 170 | "url": "https://github.com/sponsors/feross" 171 | }, 172 | { 173 | "type": "patreon", 174 | "url": "https://www.patreon.com/feross" 175 | }, 176 | { 177 | "type": "consulting", 178 | "url": "https://feross.org/support" 179 | } 180 | ], 181 | "dependencies": { 182 | "base64-js": "^1.3.1", 183 | "ieee754": "^1.1.13" 184 | } 185 | }, 186 | "node_modules/buffer-crc32": { 187 | "version": "0.2.13", 188 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 189 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 190 | "dev": true, 191 | "engines": { 192 | "node": "*" 193 | } 194 | }, 195 | "node_modules/builtin-modules": { 196 | "version": "1.1.1", 197 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 198 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 199 | "dev": true, 200 | "engines": { 201 | "node": ">=0.10.0" 202 | } 203 | }, 204 | "node_modules/call-bind": { 205 | "version": "1.0.2", 206 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 207 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 208 | "dev": true, 209 | "dependencies": { 210 | "function-bind": "^1.1.1", 211 | "get-intrinsic": "^1.0.2" 212 | }, 213 | "funding": { 214 | "url": "https://github.com/sponsors/ljharb" 215 | } 216 | }, 217 | "node_modules/chalk": { 218 | "version": "2.4.2", 219 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 220 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 221 | "dev": true, 222 | "dependencies": { 223 | "ansi-styles": "^3.2.1", 224 | "escape-string-regexp": "^1.0.5", 225 | "supports-color": "^5.3.0" 226 | }, 227 | "engines": { 228 | "node": ">=4" 229 | } 230 | }, 231 | "node_modules/cheerio": { 232 | "version": "1.0.0-rc.12", 233 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 234 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 235 | "dev": true, 236 | "dependencies": { 237 | "cheerio-select": "^2.1.0", 238 | "dom-serializer": "^2.0.0", 239 | "domhandler": "^5.0.3", 240 | "domutils": "^3.0.1", 241 | "htmlparser2": "^8.0.1", 242 | "parse5": "^7.0.0", 243 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 244 | }, 245 | "engines": { 246 | "node": ">= 6" 247 | }, 248 | "funding": { 249 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 250 | } 251 | }, 252 | "node_modules/cheerio-select": { 253 | "version": "2.1.0", 254 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 255 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 256 | "dev": true, 257 | "dependencies": { 258 | "boolbase": "^1.0.0", 259 | "css-select": "^5.1.0", 260 | "css-what": "^6.1.0", 261 | "domelementtype": "^2.3.0", 262 | "domhandler": "^5.0.3", 263 | "domutils": "^3.0.1" 264 | }, 265 | "funding": { 266 | "url": "https://github.com/sponsors/fb55" 267 | } 268 | }, 269 | "node_modules/chownr": { 270 | "version": "1.1.4", 271 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 272 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 273 | "dev": true 274 | }, 275 | "node_modules/color-convert": { 276 | "version": "1.9.3", 277 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 278 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 279 | "dev": true, 280 | "dependencies": { 281 | "color-name": "1.1.3" 282 | } 283 | }, 284 | "node_modules/color-name": { 285 | "version": "1.1.3", 286 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 287 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 288 | "dev": true 289 | }, 290 | "node_modules/commander": { 291 | "version": "2.20.3", 292 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 293 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 294 | "dev": true 295 | }, 296 | "node_modules/concat-map": { 297 | "version": "0.0.1", 298 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 299 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 300 | }, 301 | "node_modules/css-select": { 302 | "version": "5.1.0", 303 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 304 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 305 | "dev": true, 306 | "dependencies": { 307 | "boolbase": "^1.0.0", 308 | "css-what": "^6.1.0", 309 | "domhandler": "^5.0.2", 310 | "domutils": "^3.0.1", 311 | "nth-check": "^2.0.1" 312 | }, 313 | "funding": { 314 | "url": "https://github.com/sponsors/fb55" 315 | } 316 | }, 317 | "node_modules/css-what": { 318 | "version": "6.1.0", 319 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 320 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 321 | "dev": true, 322 | "engines": { 323 | "node": ">= 6" 324 | }, 325 | "funding": { 326 | "url": "https://github.com/sponsors/fb55" 327 | } 328 | }, 329 | "node_modules/decompress-response": { 330 | "version": "6.0.0", 331 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 332 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 333 | "dev": true, 334 | "dependencies": { 335 | "mimic-response": "^3.1.0" 336 | }, 337 | "engines": { 338 | "node": ">=10" 339 | }, 340 | "funding": { 341 | "url": "https://github.com/sponsors/sindresorhus" 342 | } 343 | }, 344 | "node_modules/deep-extend": { 345 | "version": "0.6.0", 346 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 347 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 348 | "dev": true, 349 | "engines": { 350 | "node": ">=4.0.0" 351 | } 352 | }, 353 | "node_modules/detect-libc": { 354 | "version": "2.0.1", 355 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", 356 | "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", 357 | "dev": true, 358 | "engines": { 359 | "node": ">=8" 360 | } 361 | }, 362 | "node_modules/diff": { 363 | "version": "4.0.1", 364 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 365 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 366 | "dev": true, 367 | "engines": { 368 | "node": ">=0.3.1" 369 | } 370 | }, 371 | "node_modules/dom-serializer": { 372 | "version": "2.0.0", 373 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 374 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 375 | "dev": true, 376 | "dependencies": { 377 | "domelementtype": "^2.3.0", 378 | "domhandler": "^5.0.2", 379 | "entities": "^4.2.0" 380 | }, 381 | "funding": { 382 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 383 | } 384 | }, 385 | "node_modules/domelementtype": { 386 | "version": "2.3.0", 387 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 388 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 389 | "dev": true, 390 | "funding": [ 391 | { 392 | "type": "github", 393 | "url": "https://github.com/sponsors/fb55" 394 | } 395 | ] 396 | }, 397 | "node_modules/domhandler": { 398 | "version": "5.0.3", 399 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 400 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 401 | "dev": true, 402 | "dependencies": { 403 | "domelementtype": "^2.3.0" 404 | }, 405 | "engines": { 406 | "node": ">= 4" 407 | }, 408 | "funding": { 409 | "url": "https://github.com/fb55/domhandler?sponsor=1" 410 | } 411 | }, 412 | "node_modules/domutils": { 413 | "version": "3.0.1", 414 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", 415 | "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", 416 | "dev": true, 417 | "dependencies": { 418 | "dom-serializer": "^2.0.0", 419 | "domelementtype": "^2.3.0", 420 | "domhandler": "^5.0.1" 421 | }, 422 | "funding": { 423 | "url": "https://github.com/fb55/domutils?sponsor=1" 424 | } 425 | }, 426 | "node_modules/end-of-stream": { 427 | "version": "1.4.4", 428 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 429 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 430 | "dev": true, 431 | "dependencies": { 432 | "once": "^1.4.0" 433 | } 434 | }, 435 | "node_modules/entities": { 436 | "version": "4.3.1", 437 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", 438 | "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", 439 | "dev": true, 440 | "engines": { 441 | "node": ">=0.12" 442 | }, 443 | "funding": { 444 | "url": "https://github.com/fb55/entities?sponsor=1" 445 | } 446 | }, 447 | "node_modules/escape-string-regexp": { 448 | "version": "1.0.5", 449 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 450 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 451 | "dev": true, 452 | "engines": { 453 | "node": ">=0.8.0" 454 | } 455 | }, 456 | "node_modules/esprima": { 457 | "version": "4.0.1", 458 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 459 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 460 | "dev": true, 461 | "bin": { 462 | "esparse": "bin/esparse.js", 463 | "esvalidate": "bin/esvalidate.js" 464 | }, 465 | "engines": { 466 | "node": ">=4" 467 | } 468 | }, 469 | "node_modules/esutils": { 470 | "version": "2.0.3", 471 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 472 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 473 | "dev": true, 474 | "engines": { 475 | "node": ">=0.10.0" 476 | } 477 | }, 478 | "node_modules/expand-template": { 479 | "version": "2.0.3", 480 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 481 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 482 | "dev": true, 483 | "engines": { 484 | "node": ">=6" 485 | } 486 | }, 487 | "node_modules/fd-slicer": { 488 | "version": "1.1.0", 489 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 490 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 491 | "dev": true, 492 | "dependencies": { 493 | "pend": "~1.2.0" 494 | } 495 | }, 496 | "node_modules/fs-constants": { 497 | "version": "1.0.0", 498 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 499 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 500 | "dev": true 501 | }, 502 | "node_modules/fs.realpath": { 503 | "version": "1.0.0", 504 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 505 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 506 | "dev": true 507 | }, 508 | "node_modules/function-bind": { 509 | "version": "1.1.1", 510 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 511 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 512 | "dev": true 513 | }, 514 | "node_modules/get-intrinsic": { 515 | "version": "1.1.2", 516 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 517 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 518 | "dev": true, 519 | "dependencies": { 520 | "function-bind": "^1.1.1", 521 | "has": "^1.0.3", 522 | "has-symbols": "^1.0.3" 523 | }, 524 | "funding": { 525 | "url": "https://github.com/sponsors/ljharb" 526 | } 527 | }, 528 | "node_modules/github-from-package": { 529 | "version": "0.0.0", 530 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 531 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 532 | "dev": true 533 | }, 534 | "node_modules/glob": { 535 | "version": "7.1.6", 536 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 537 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 538 | "deprecated": "Glob versions prior to v9 are no longer supported", 539 | "dev": true, 540 | "dependencies": { 541 | "fs.realpath": "^1.0.0", 542 | "inflight": "^1.0.4", 543 | "inherits": "2", 544 | "minimatch": "^3.0.4", 545 | "once": "^1.3.0", 546 | "path-is-absolute": "^1.0.0" 547 | }, 548 | "engines": { 549 | "node": "*" 550 | }, 551 | "funding": { 552 | "url": "https://github.com/sponsors/isaacs" 553 | } 554 | }, 555 | "node_modules/has": { 556 | "version": "1.0.3", 557 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 558 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 559 | "dev": true, 560 | "dependencies": { 561 | "function-bind": "^1.1.1" 562 | }, 563 | "engines": { 564 | "node": ">= 0.4.0" 565 | } 566 | }, 567 | "node_modules/has-flag": { 568 | "version": "3.0.0", 569 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 570 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 571 | "dev": true, 572 | "engines": { 573 | "node": ">=4" 574 | } 575 | }, 576 | "node_modules/has-symbols": { 577 | "version": "1.0.3", 578 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 579 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 580 | "dev": true, 581 | "engines": { 582 | "node": ">= 0.4" 583 | }, 584 | "funding": { 585 | "url": "https://github.com/sponsors/ljharb" 586 | } 587 | }, 588 | "node_modules/hosted-git-info": { 589 | "version": "4.1.0", 590 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", 591 | "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", 592 | "dev": true, 593 | "dependencies": { 594 | "lru-cache": "^6.0.0" 595 | }, 596 | "engines": { 597 | "node": ">=10" 598 | } 599 | }, 600 | "node_modules/htmlparser2": { 601 | "version": "8.0.1", 602 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", 603 | "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", 604 | "dev": true, 605 | "funding": [ 606 | "https://github.com/fb55/htmlparser2?sponsor=1", 607 | { 608 | "type": "github", 609 | "url": "https://github.com/sponsors/fb55" 610 | } 611 | ], 612 | "dependencies": { 613 | "domelementtype": "^2.3.0", 614 | "domhandler": "^5.0.2", 615 | "domutils": "^3.0.1", 616 | "entities": "^4.3.0" 617 | } 618 | }, 619 | "node_modules/ieee754": { 620 | "version": "1.2.1", 621 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 622 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 623 | "dev": true, 624 | "funding": [ 625 | { 626 | "type": "github", 627 | "url": "https://github.com/sponsors/feross" 628 | }, 629 | { 630 | "type": "patreon", 631 | "url": "https://www.patreon.com/feross" 632 | }, 633 | { 634 | "type": "consulting", 635 | "url": "https://feross.org/support" 636 | } 637 | ] 638 | }, 639 | "node_modules/inflight": { 640 | "version": "1.0.6", 641 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 642 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 643 | "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.", 644 | "dev": true, 645 | "dependencies": { 646 | "once": "^1.3.0", 647 | "wrappy": "1" 648 | } 649 | }, 650 | "node_modules/inherits": { 651 | "version": "2.0.4", 652 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 653 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 654 | "dev": true 655 | }, 656 | "node_modules/ini": { 657 | "version": "1.3.8", 658 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 659 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 660 | "dev": true 661 | }, 662 | "node_modules/js-tokens": { 663 | "version": "4.0.0", 664 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 665 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 666 | "dev": true 667 | }, 668 | "node_modules/js-yaml": { 669 | "version": "3.13.1", 670 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 671 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 672 | "dev": true, 673 | "dependencies": { 674 | "argparse": "^1.0.7", 675 | "esprima": "^4.0.0" 676 | }, 677 | "bin": { 678 | "js-yaml": "bin/js-yaml.js" 679 | } 680 | }, 681 | "node_modules/keytar": { 682 | "version": "7.9.0", 683 | "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", 684 | "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", 685 | "dev": true, 686 | "hasInstallScript": true, 687 | "dependencies": { 688 | "node-addon-api": "^4.3.0", 689 | "prebuild-install": "^7.0.1" 690 | } 691 | }, 692 | "node_modules/leven": { 693 | "version": "3.1.0", 694 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 695 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 696 | "dev": true, 697 | "engines": { 698 | "node": ">=6" 699 | } 700 | }, 701 | "node_modules/linkify-it": { 702 | "version": "3.0.3", 703 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", 704 | "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", 705 | "dev": true, 706 | "dependencies": { 707 | "uc.micro": "^1.0.1" 708 | } 709 | }, 710 | "node_modules/lru-cache": { 711 | "version": "6.0.0", 712 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 713 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 714 | "dev": true, 715 | "dependencies": { 716 | "yallist": "^4.0.0" 717 | }, 718 | "engines": { 719 | "node": ">=10" 720 | } 721 | }, 722 | "node_modules/luxon": { 723 | "version": "2.0.2", 724 | "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.2.tgz", 725 | "integrity": "sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg==", 726 | "engines": { 727 | "node": "*" 728 | } 729 | }, 730 | "node_modules/markdown-it": { 731 | "version": "12.3.2", 732 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", 733 | "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", 734 | "dev": true, 735 | "dependencies": { 736 | "argparse": "^2.0.1", 737 | "entities": "~2.1.0", 738 | "linkify-it": "^3.0.1", 739 | "mdurl": "^1.0.1", 740 | "uc.micro": "^1.0.5" 741 | }, 742 | "bin": { 743 | "markdown-it": "bin/markdown-it.js" 744 | } 745 | }, 746 | "node_modules/markdown-it/node_modules/argparse": { 747 | "version": "2.0.1", 748 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 749 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 750 | "dev": true 751 | }, 752 | "node_modules/markdown-it/node_modules/entities": { 753 | "version": "2.1.0", 754 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 755 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", 756 | "dev": true, 757 | "funding": { 758 | "url": "https://github.com/fb55/entities?sponsor=1" 759 | } 760 | }, 761 | "node_modules/mdurl": { 762 | "version": "1.0.1", 763 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 764 | "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", 765 | "dev": true 766 | }, 767 | "node_modules/mime": { 768 | "version": "1.6.0", 769 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 770 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 771 | "dev": true, 772 | "bin": { 773 | "mime": "cli.js" 774 | }, 775 | "engines": { 776 | "node": ">=4" 777 | } 778 | }, 779 | "node_modules/mimic-response": { 780 | "version": "3.1.0", 781 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 782 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 783 | "dev": true, 784 | "engines": { 785 | "node": ">=10" 786 | }, 787 | "funding": { 788 | "url": "https://github.com/sponsors/sindresorhus" 789 | } 790 | }, 791 | "node_modules/minimatch": { 792 | "version": "3.0.4", 793 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 794 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 795 | "dependencies": { 796 | "brace-expansion": "^1.1.7" 797 | }, 798 | "engines": { 799 | "node": "*" 800 | } 801 | }, 802 | "node_modules/minimist": { 803 | "version": "0.0.8", 804 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 805 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 806 | "dev": true 807 | }, 808 | "node_modules/mkdirp": { 809 | "version": "0.5.1", 810 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 811 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 812 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 813 | "dev": true, 814 | "dependencies": { 815 | "minimist": "0.0.8" 816 | }, 817 | "bin": { 818 | "mkdirp": "bin/cmd.js" 819 | } 820 | }, 821 | "node_modules/mkdirp-classic": { 822 | "version": "0.5.3", 823 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 824 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 825 | "dev": true 826 | }, 827 | "node_modules/mobx": { 828 | "version": "5.14.2", 829 | "resolved": "https://registry.npmjs.org/mobx/-/mobx-5.14.2.tgz", 830 | "integrity": "sha512-yx5Xe6o2WSYFgeytzZt6jGaYghJdQbd1ElR7S2s93x7/+5SYfJBfutvZF1O5gPEsUyTAFZ5IMYGu1KyhkPk+oQ==" 831 | }, 832 | "node_modules/mute-stream": { 833 | "version": "0.0.8", 834 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 835 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 836 | "dev": true 837 | }, 838 | "node_modules/napi-build-utils": { 839 | "version": "1.0.2", 840 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 841 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 842 | "dev": true 843 | }, 844 | "node_modules/node-abi": { 845 | "version": "3.24.0", 846 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", 847 | "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", 848 | "dev": true, 849 | "dependencies": { 850 | "semver": "^7.3.5" 851 | }, 852 | "engines": { 853 | "node": ">=10" 854 | } 855 | }, 856 | "node_modules/node-abi/node_modules/semver": { 857 | "version": "7.3.7", 858 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 859 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 860 | "dev": true, 861 | "dependencies": { 862 | "lru-cache": "^6.0.0" 863 | }, 864 | "bin": { 865 | "semver": "bin/semver.js" 866 | }, 867 | "engines": { 868 | "node": ">=10" 869 | } 870 | }, 871 | "node_modules/node-addon-api": { 872 | "version": "4.3.0", 873 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", 874 | "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", 875 | "dev": true 876 | }, 877 | "node_modules/nth-check": { 878 | "version": "2.1.1", 879 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 880 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 881 | "dev": true, 882 | "dependencies": { 883 | "boolbase": "^1.0.0" 884 | }, 885 | "funding": { 886 | "url": "https://github.com/fb55/nth-check?sponsor=1" 887 | } 888 | }, 889 | "node_modules/object-inspect": { 890 | "version": "1.12.2", 891 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 892 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 893 | "dev": true, 894 | "funding": { 895 | "url": "https://github.com/sponsors/ljharb" 896 | } 897 | }, 898 | "node_modules/once": { 899 | "version": "1.4.0", 900 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 901 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 902 | "dev": true, 903 | "dependencies": { 904 | "wrappy": "1" 905 | } 906 | }, 907 | "node_modules/parse-semver": { 908 | "version": "1.1.1", 909 | "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", 910 | "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", 911 | "dev": true, 912 | "dependencies": { 913 | "semver": "^5.1.0" 914 | } 915 | }, 916 | "node_modules/parse5": { 917 | "version": "7.0.0", 918 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", 919 | "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", 920 | "dev": true, 921 | "dependencies": { 922 | "entities": "^4.3.0" 923 | }, 924 | "funding": { 925 | "url": "https://github.com/inikulin/parse5?sponsor=1" 926 | } 927 | }, 928 | "node_modules/parse5-htmlparser2-tree-adapter": { 929 | "version": "7.0.0", 930 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 931 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 932 | "dev": true, 933 | "dependencies": { 934 | "domhandler": "^5.0.2", 935 | "parse5": "^7.0.0" 936 | }, 937 | "funding": { 938 | "url": "https://github.com/inikulin/parse5?sponsor=1" 939 | } 940 | }, 941 | "node_modules/path-is-absolute": { 942 | "version": "1.0.1", 943 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 944 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 945 | "dev": true, 946 | "engines": { 947 | "node": ">=0.10.0" 948 | } 949 | }, 950 | "node_modules/path-parse": { 951 | "version": "1.0.6", 952 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 953 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 954 | "dev": true 955 | }, 956 | "node_modules/pend": { 957 | "version": "1.2.0", 958 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 959 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 960 | "dev": true 961 | }, 962 | "node_modules/prebuild-install": { 963 | "version": "7.1.1", 964 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", 965 | "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", 966 | "dev": true, 967 | "dependencies": { 968 | "detect-libc": "^2.0.0", 969 | "expand-template": "^2.0.3", 970 | "github-from-package": "0.0.0", 971 | "minimist": "^1.2.3", 972 | "mkdirp-classic": "^0.5.3", 973 | "napi-build-utils": "^1.0.1", 974 | "node-abi": "^3.3.0", 975 | "pump": "^3.0.0", 976 | "rc": "^1.2.7", 977 | "simple-get": "^4.0.0", 978 | "tar-fs": "^2.0.0", 979 | "tunnel-agent": "^0.6.0" 980 | }, 981 | "bin": { 982 | "prebuild-install": "bin.js" 983 | }, 984 | "engines": { 985 | "node": ">=10" 986 | } 987 | }, 988 | "node_modules/prebuild-install/node_modules/minimist": { 989 | "version": "1.2.6", 990 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 991 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 992 | "dev": true 993 | }, 994 | "node_modules/pump": { 995 | "version": "3.0.0", 996 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 997 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 998 | "dev": true, 999 | "dependencies": { 1000 | "end-of-stream": "^1.1.0", 1001 | "once": "^1.3.1" 1002 | } 1003 | }, 1004 | "node_modules/qs": { 1005 | "version": "6.11.0", 1006 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1007 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1008 | "dev": true, 1009 | "dependencies": { 1010 | "side-channel": "^1.0.4" 1011 | }, 1012 | "engines": { 1013 | "node": ">=0.6" 1014 | }, 1015 | "funding": { 1016 | "url": "https://github.com/sponsors/ljharb" 1017 | } 1018 | }, 1019 | "node_modules/rc": { 1020 | "version": "1.2.8", 1021 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1022 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1023 | "dev": true, 1024 | "dependencies": { 1025 | "deep-extend": "^0.6.0", 1026 | "ini": "~1.3.0", 1027 | "minimist": "^1.2.0", 1028 | "strip-json-comments": "~2.0.1" 1029 | }, 1030 | "bin": { 1031 | "rc": "cli.js" 1032 | } 1033 | }, 1034 | "node_modules/rc/node_modules/minimist": { 1035 | "version": "1.2.6", 1036 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1037 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1038 | "dev": true 1039 | }, 1040 | "node_modules/read": { 1041 | "version": "1.0.7", 1042 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1043 | "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "mute-stream": "~0.0.4" 1047 | }, 1048 | "engines": { 1049 | "node": ">=0.8" 1050 | } 1051 | }, 1052 | "node_modules/readable-stream": { 1053 | "version": "3.6.0", 1054 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1055 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "inherits": "^2.0.3", 1059 | "string_decoder": "^1.1.1", 1060 | "util-deprecate": "^1.0.1" 1061 | }, 1062 | "engines": { 1063 | "node": ">= 6" 1064 | } 1065 | }, 1066 | "node_modules/resolve": { 1067 | "version": "1.14.1", 1068 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", 1069 | "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", 1070 | "dev": true, 1071 | "dependencies": { 1072 | "path-parse": "^1.0.6" 1073 | }, 1074 | "funding": { 1075 | "url": "https://github.com/sponsors/ljharb" 1076 | } 1077 | }, 1078 | "node_modules/rimraf": { 1079 | "version": "3.0.2", 1080 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1081 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1082 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "glob": "^7.1.3" 1086 | }, 1087 | "bin": { 1088 | "rimraf": "bin.js" 1089 | }, 1090 | "funding": { 1091 | "url": "https://github.com/sponsors/isaacs" 1092 | } 1093 | }, 1094 | "node_modules/safe-buffer": { 1095 | "version": "5.2.1", 1096 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1097 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1098 | "dev": true, 1099 | "funding": [ 1100 | { 1101 | "type": "github", 1102 | "url": "https://github.com/sponsors/feross" 1103 | }, 1104 | { 1105 | "type": "patreon", 1106 | "url": "https://www.patreon.com/feross" 1107 | }, 1108 | { 1109 | "type": "consulting", 1110 | "url": "https://feross.org/support" 1111 | } 1112 | ] 1113 | }, 1114 | "node_modules/sax": { 1115 | "version": "1.2.4", 1116 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1117 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 1118 | "dev": true 1119 | }, 1120 | "node_modules/semver": { 1121 | "version": "5.7.1", 1122 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1123 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1124 | "dev": true, 1125 | "bin": { 1126 | "semver": "bin/semver" 1127 | } 1128 | }, 1129 | "node_modules/side-channel": { 1130 | "version": "1.0.4", 1131 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1132 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1133 | "dev": true, 1134 | "dependencies": { 1135 | "call-bind": "^1.0.0", 1136 | "get-intrinsic": "^1.0.2", 1137 | "object-inspect": "^1.9.0" 1138 | }, 1139 | "funding": { 1140 | "url": "https://github.com/sponsors/ljharb" 1141 | } 1142 | }, 1143 | "node_modules/simple-concat": { 1144 | "version": "1.0.1", 1145 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1146 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1147 | "dev": true, 1148 | "funding": [ 1149 | { 1150 | "type": "github", 1151 | "url": "https://github.com/sponsors/feross" 1152 | }, 1153 | { 1154 | "type": "patreon", 1155 | "url": "https://www.patreon.com/feross" 1156 | }, 1157 | { 1158 | "type": "consulting", 1159 | "url": "https://feross.org/support" 1160 | } 1161 | ] 1162 | }, 1163 | "node_modules/simple-get": { 1164 | "version": "4.0.1", 1165 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1166 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1167 | "dev": true, 1168 | "funding": [ 1169 | { 1170 | "type": "github", 1171 | "url": "https://github.com/sponsors/feross" 1172 | }, 1173 | { 1174 | "type": "patreon", 1175 | "url": "https://www.patreon.com/feross" 1176 | }, 1177 | { 1178 | "type": "consulting", 1179 | "url": "https://feross.org/support" 1180 | } 1181 | ], 1182 | "dependencies": { 1183 | "decompress-response": "^6.0.0", 1184 | "once": "^1.3.1", 1185 | "simple-concat": "^1.0.0" 1186 | } 1187 | }, 1188 | "node_modules/sprintf-js": { 1189 | "version": "1.0.3", 1190 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1191 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1192 | "dev": true 1193 | }, 1194 | "node_modules/string_decoder": { 1195 | "version": "1.3.0", 1196 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1197 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1198 | "dev": true, 1199 | "dependencies": { 1200 | "safe-buffer": "~5.2.0" 1201 | } 1202 | }, 1203 | "node_modules/strip-json-comments": { 1204 | "version": "2.0.1", 1205 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1206 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1207 | "dev": true, 1208 | "engines": { 1209 | "node": ">=0.10.0" 1210 | } 1211 | }, 1212 | "node_modules/supports-color": { 1213 | "version": "5.5.0", 1214 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1215 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1216 | "dev": true, 1217 | "dependencies": { 1218 | "has-flag": "^3.0.0" 1219 | }, 1220 | "engines": { 1221 | "node": ">=4" 1222 | } 1223 | }, 1224 | "node_modules/tar-fs": { 1225 | "version": "2.1.1", 1226 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1227 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "chownr": "^1.1.1", 1231 | "mkdirp-classic": "^0.5.2", 1232 | "pump": "^3.0.0", 1233 | "tar-stream": "^2.1.4" 1234 | } 1235 | }, 1236 | "node_modules/tar-stream": { 1237 | "version": "2.2.0", 1238 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1239 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1240 | "dev": true, 1241 | "dependencies": { 1242 | "bl": "^4.0.3", 1243 | "end-of-stream": "^1.4.1", 1244 | "fs-constants": "^1.0.0", 1245 | "inherits": "^2.0.3", 1246 | "readable-stream": "^3.1.1" 1247 | }, 1248 | "engines": { 1249 | "node": ">=6" 1250 | } 1251 | }, 1252 | "node_modules/tmp": { 1253 | "version": "0.2.1", 1254 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 1255 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 1256 | "dev": true, 1257 | "dependencies": { 1258 | "rimraf": "^3.0.0" 1259 | }, 1260 | "engines": { 1261 | "node": ">=8.17.0" 1262 | } 1263 | }, 1264 | "node_modules/tslib": { 1265 | "version": "1.10.0", 1266 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1267 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1268 | "dev": true 1269 | }, 1270 | "node_modules/tslint": { 1271 | "version": "5.20.1", 1272 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", 1273 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", 1274 | "dev": true, 1275 | "dependencies": { 1276 | "@babel/code-frame": "^7.0.0", 1277 | "builtin-modules": "^1.1.1", 1278 | "chalk": "^2.3.0", 1279 | "commander": "^2.12.1", 1280 | "diff": "^4.0.1", 1281 | "glob": "^7.1.1", 1282 | "js-yaml": "^3.13.1", 1283 | "minimatch": "^3.0.4", 1284 | "mkdirp": "^0.5.1", 1285 | "resolve": "^1.3.2", 1286 | "semver": "^5.3.0", 1287 | "tslib": "^1.8.0", 1288 | "tsutils": "^2.29.0" 1289 | }, 1290 | "bin": { 1291 | "tslint": "bin/tslint" 1292 | }, 1293 | "engines": { 1294 | "node": ">=4.8.0" 1295 | }, 1296 | "peerDependencies": { 1297 | "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" 1298 | } 1299 | }, 1300 | "node_modules/tsutils": { 1301 | "version": "2.29.0", 1302 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1303 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1304 | "dev": true, 1305 | "dependencies": { 1306 | "tslib": "^1.8.1" 1307 | }, 1308 | "peerDependencies": { 1309 | "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" 1310 | } 1311 | }, 1312 | "node_modules/tunnel": { 1313 | "version": "0.0.6", 1314 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 1315 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 1316 | "dev": true, 1317 | "engines": { 1318 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 1319 | } 1320 | }, 1321 | "node_modules/tunnel-agent": { 1322 | "version": "0.6.0", 1323 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1324 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1325 | "dev": true, 1326 | "dependencies": { 1327 | "safe-buffer": "^5.0.1" 1328 | }, 1329 | "engines": { 1330 | "node": "*" 1331 | } 1332 | }, 1333 | "node_modules/typed-rest-client": { 1334 | "version": "1.8.9", 1335 | "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", 1336 | "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", 1337 | "dev": true, 1338 | "dependencies": { 1339 | "qs": "^6.9.1", 1340 | "tunnel": "0.0.6", 1341 | "underscore": "^1.12.1" 1342 | } 1343 | }, 1344 | "node_modules/typescript": { 1345 | "version": "4.7.4", 1346 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 1347 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 1348 | "dev": true, 1349 | "bin": { 1350 | "tsc": "bin/tsc", 1351 | "tsserver": "bin/tsserver" 1352 | }, 1353 | "engines": { 1354 | "node": ">=4.2.0" 1355 | } 1356 | }, 1357 | "node_modules/uc.micro": { 1358 | "version": "1.0.6", 1359 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 1360 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 1361 | "dev": true 1362 | }, 1363 | "node_modules/underscore": { 1364 | "version": "1.13.4", 1365 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", 1366 | "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", 1367 | "dev": true 1368 | }, 1369 | "node_modules/url-join": { 1370 | "version": "4.0.1", 1371 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", 1372 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", 1373 | "dev": true 1374 | }, 1375 | "node_modules/util-deprecate": { 1376 | "version": "1.0.2", 1377 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1378 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1379 | "dev": true 1380 | }, 1381 | "node_modules/vsce": { 1382 | "version": "2.10.0", 1383 | "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.10.0.tgz", 1384 | "integrity": "sha512-b+wB3XMapEi368g64klSM6uylllZdNutseqbNY+tUoHYSy6g2NwnlWuAGKDQTYc0IqfDUjUFRQBpPgA89Q+Fyw==", 1385 | "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", 1386 | "dev": true, 1387 | "dependencies": { 1388 | "azure-devops-node-api": "^11.0.1", 1389 | "chalk": "^2.4.2", 1390 | "cheerio": "^1.0.0-rc.9", 1391 | "commander": "^6.1.0", 1392 | "glob": "^7.0.6", 1393 | "hosted-git-info": "^4.0.2", 1394 | "keytar": "^7.7.0", 1395 | "leven": "^3.1.0", 1396 | "markdown-it": "^12.3.2", 1397 | "mime": "^1.3.4", 1398 | "minimatch": "^3.0.3", 1399 | "parse-semver": "^1.1.1", 1400 | "read": "^1.0.7", 1401 | "semver": "^5.1.0", 1402 | "tmp": "^0.2.1", 1403 | "typed-rest-client": "^1.8.4", 1404 | "url-join": "^4.0.1", 1405 | "xml2js": "^0.4.23", 1406 | "yauzl": "^2.3.1", 1407 | "yazl": "^2.2.2" 1408 | }, 1409 | "bin": { 1410 | "vsce": "vsce" 1411 | }, 1412 | "engines": { 1413 | "node": ">= 14" 1414 | } 1415 | }, 1416 | "node_modules/vsce/node_modules/commander": { 1417 | "version": "6.2.1", 1418 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 1419 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 1420 | "dev": true, 1421 | "engines": { 1422 | "node": ">= 6" 1423 | } 1424 | }, 1425 | "node_modules/wrappy": { 1426 | "version": "1.0.2", 1427 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1428 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1429 | "dev": true 1430 | }, 1431 | "node_modules/xml2js": { 1432 | "version": "0.4.23", 1433 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1434 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1435 | "dev": true, 1436 | "dependencies": { 1437 | "sax": ">=0.6.0", 1438 | "xmlbuilder": "~11.0.0" 1439 | }, 1440 | "engines": { 1441 | "node": ">=4.0.0" 1442 | } 1443 | }, 1444 | "node_modules/xmlbuilder": { 1445 | "version": "11.0.1", 1446 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1447 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 1448 | "dev": true, 1449 | "engines": { 1450 | "node": ">=4.0" 1451 | } 1452 | }, 1453 | "node_modules/yallist": { 1454 | "version": "4.0.0", 1455 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1456 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1457 | "dev": true 1458 | }, 1459 | "node_modules/yauzl": { 1460 | "version": "2.10.0", 1461 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1462 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1463 | "dev": true, 1464 | "dependencies": { 1465 | "buffer-crc32": "~0.2.3", 1466 | "fd-slicer": "~1.1.0" 1467 | } 1468 | }, 1469 | "node_modules/yazl": { 1470 | "version": "2.5.1", 1471 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 1472 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 1473 | "dev": true, 1474 | "dependencies": { 1475 | "buffer-crc32": "~0.2.3" 1476 | } 1477 | } 1478 | }, 1479 | "dependencies": { 1480 | "@babel/code-frame": { 1481 | "version": "7.5.5", 1482 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 1483 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 1484 | "dev": true, 1485 | "requires": { 1486 | "@babel/highlight": "^7.0.0" 1487 | } 1488 | }, 1489 | "@babel/highlight": { 1490 | "version": "7.5.0", 1491 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 1492 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 1493 | "dev": true, 1494 | "requires": { 1495 | "chalk": "^2.0.0", 1496 | "esutils": "^2.0.2", 1497 | "js-tokens": "^4.0.0" 1498 | } 1499 | }, 1500 | "@types/debounce": { 1501 | "version": "1.2.0", 1502 | "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.0.tgz", 1503 | "integrity": "sha512-bWG5wapaWgbss9E238T0R6bfo5Fh3OkeoSt245CM7JJwVwpw6MEBCbIxLq5z8KzsE3uJhzcIuQkyiZmzV3M/Dw==", 1504 | "dev": true 1505 | }, 1506 | "@types/luxon": { 1507 | "version": "2.0.5", 1508 | "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.5.tgz", 1509 | "integrity": "sha512-GKrG5v16BOs9XGpouu33hOkAFaiSDi3ZaDXG9F2yAoyzHRBtksZnI60VWY5aM/yAENCccBejrxw8jDY+9OVlxw==", 1510 | "dev": true 1511 | }, 1512 | "@types/minimatch": { 1513 | "version": "3.0.3", 1514 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 1515 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 1516 | "dev": true 1517 | }, 1518 | "@types/node": { 1519 | "version": "18.6.5", 1520 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", 1521 | "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", 1522 | "dev": true 1523 | }, 1524 | "@types/vscode": { 1525 | "version": "1.90.0", 1526 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.90.0.tgz", 1527 | "integrity": "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ==", 1528 | "dev": true 1529 | }, 1530 | "ansi-styles": { 1531 | "version": "3.2.1", 1532 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1533 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1534 | "dev": true, 1535 | "requires": { 1536 | "color-convert": "^1.9.0" 1537 | } 1538 | }, 1539 | "argparse": { 1540 | "version": "1.0.10", 1541 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1542 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1543 | "dev": true, 1544 | "requires": { 1545 | "sprintf-js": "~1.0.2" 1546 | } 1547 | }, 1548 | "azure-devops-node-api": { 1549 | "version": "11.2.0", 1550 | "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", 1551 | "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", 1552 | "dev": true, 1553 | "requires": { 1554 | "tunnel": "0.0.6", 1555 | "typed-rest-client": "^1.8.4" 1556 | } 1557 | }, 1558 | "balanced-match": { 1559 | "version": "1.0.0", 1560 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 1561 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 1562 | }, 1563 | "base64-js": { 1564 | "version": "1.5.1", 1565 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1566 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1567 | "dev": true 1568 | }, 1569 | "bl": { 1570 | "version": "4.1.0", 1571 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 1572 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 1573 | "dev": true, 1574 | "requires": { 1575 | "buffer": "^5.5.0", 1576 | "inherits": "^2.0.4", 1577 | "readable-stream": "^3.4.0" 1578 | } 1579 | }, 1580 | "boolbase": { 1581 | "version": "1.0.0", 1582 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 1583 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 1584 | "dev": true 1585 | }, 1586 | "brace-expansion": { 1587 | "version": "1.1.11", 1588 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1589 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1590 | "requires": { 1591 | "balanced-match": "^1.0.0", 1592 | "concat-map": "0.0.1" 1593 | } 1594 | }, 1595 | "buffer": { 1596 | "version": "5.7.1", 1597 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 1598 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 1599 | "dev": true, 1600 | "requires": { 1601 | "base64-js": "^1.3.1", 1602 | "ieee754": "^1.1.13" 1603 | } 1604 | }, 1605 | "buffer-crc32": { 1606 | "version": "0.2.13", 1607 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 1608 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 1609 | "dev": true 1610 | }, 1611 | "builtin-modules": { 1612 | "version": "1.1.1", 1613 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 1614 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 1615 | "dev": true 1616 | }, 1617 | "call-bind": { 1618 | "version": "1.0.2", 1619 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1620 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1621 | "dev": true, 1622 | "requires": { 1623 | "function-bind": "^1.1.1", 1624 | "get-intrinsic": "^1.0.2" 1625 | } 1626 | }, 1627 | "chalk": { 1628 | "version": "2.4.2", 1629 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1630 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1631 | "dev": true, 1632 | "requires": { 1633 | "ansi-styles": "^3.2.1", 1634 | "escape-string-regexp": "^1.0.5", 1635 | "supports-color": "^5.3.0" 1636 | } 1637 | }, 1638 | "cheerio": { 1639 | "version": "1.0.0-rc.12", 1640 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 1641 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 1642 | "dev": true, 1643 | "requires": { 1644 | "cheerio-select": "^2.1.0", 1645 | "dom-serializer": "^2.0.0", 1646 | "domhandler": "^5.0.3", 1647 | "domutils": "^3.0.1", 1648 | "htmlparser2": "^8.0.1", 1649 | "parse5": "^7.0.0", 1650 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 1651 | } 1652 | }, 1653 | "cheerio-select": { 1654 | "version": "2.1.0", 1655 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 1656 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 1657 | "dev": true, 1658 | "requires": { 1659 | "boolbase": "^1.0.0", 1660 | "css-select": "^5.1.0", 1661 | "css-what": "^6.1.0", 1662 | "domelementtype": "^2.3.0", 1663 | "domhandler": "^5.0.3", 1664 | "domutils": "^3.0.1" 1665 | } 1666 | }, 1667 | "chownr": { 1668 | "version": "1.1.4", 1669 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1670 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 1671 | "dev": true 1672 | }, 1673 | "color-convert": { 1674 | "version": "1.9.3", 1675 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1676 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1677 | "dev": true, 1678 | "requires": { 1679 | "color-name": "1.1.3" 1680 | } 1681 | }, 1682 | "color-name": { 1683 | "version": "1.1.3", 1684 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1685 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1686 | "dev": true 1687 | }, 1688 | "commander": { 1689 | "version": "2.20.3", 1690 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1691 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1692 | "dev": true 1693 | }, 1694 | "concat-map": { 1695 | "version": "0.0.1", 1696 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1697 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 1698 | }, 1699 | "css-select": { 1700 | "version": "5.1.0", 1701 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 1702 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 1703 | "dev": true, 1704 | "requires": { 1705 | "boolbase": "^1.0.0", 1706 | "css-what": "^6.1.0", 1707 | "domhandler": "^5.0.2", 1708 | "domutils": "^3.0.1", 1709 | "nth-check": "^2.0.1" 1710 | } 1711 | }, 1712 | "css-what": { 1713 | "version": "6.1.0", 1714 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 1715 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 1716 | "dev": true 1717 | }, 1718 | "decompress-response": { 1719 | "version": "6.0.0", 1720 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 1721 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 1722 | "dev": true, 1723 | "requires": { 1724 | "mimic-response": "^3.1.0" 1725 | } 1726 | }, 1727 | "deep-extend": { 1728 | "version": "0.6.0", 1729 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 1730 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 1731 | "dev": true 1732 | }, 1733 | "detect-libc": { 1734 | "version": "2.0.1", 1735 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", 1736 | "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", 1737 | "dev": true 1738 | }, 1739 | "diff": { 1740 | "version": "4.0.1", 1741 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 1742 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 1743 | "dev": true 1744 | }, 1745 | "dom-serializer": { 1746 | "version": "2.0.0", 1747 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 1748 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1749 | "dev": true, 1750 | "requires": { 1751 | "domelementtype": "^2.3.0", 1752 | "domhandler": "^5.0.2", 1753 | "entities": "^4.2.0" 1754 | } 1755 | }, 1756 | "domelementtype": { 1757 | "version": "2.3.0", 1758 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1759 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1760 | "dev": true 1761 | }, 1762 | "domhandler": { 1763 | "version": "5.0.3", 1764 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 1765 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1766 | "dev": true, 1767 | "requires": { 1768 | "domelementtype": "^2.3.0" 1769 | } 1770 | }, 1771 | "domutils": { 1772 | "version": "3.0.1", 1773 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", 1774 | "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", 1775 | "dev": true, 1776 | "requires": { 1777 | "dom-serializer": "^2.0.0", 1778 | "domelementtype": "^2.3.0", 1779 | "domhandler": "^5.0.1" 1780 | } 1781 | }, 1782 | "end-of-stream": { 1783 | "version": "1.4.4", 1784 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1785 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1786 | "dev": true, 1787 | "requires": { 1788 | "once": "^1.4.0" 1789 | } 1790 | }, 1791 | "entities": { 1792 | "version": "4.3.1", 1793 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", 1794 | "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", 1795 | "dev": true 1796 | }, 1797 | "escape-string-regexp": { 1798 | "version": "1.0.5", 1799 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1800 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1801 | "dev": true 1802 | }, 1803 | "esprima": { 1804 | "version": "4.0.1", 1805 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1806 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1807 | "dev": true 1808 | }, 1809 | "esutils": { 1810 | "version": "2.0.3", 1811 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1812 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1813 | "dev": true 1814 | }, 1815 | "expand-template": { 1816 | "version": "2.0.3", 1817 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 1818 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 1819 | "dev": true 1820 | }, 1821 | "fd-slicer": { 1822 | "version": "1.1.0", 1823 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1824 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 1825 | "dev": true, 1826 | "requires": { 1827 | "pend": "~1.2.0" 1828 | } 1829 | }, 1830 | "fs-constants": { 1831 | "version": "1.0.0", 1832 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1833 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 1834 | "dev": true 1835 | }, 1836 | "fs.realpath": { 1837 | "version": "1.0.0", 1838 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1839 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1840 | "dev": true 1841 | }, 1842 | "function-bind": { 1843 | "version": "1.1.1", 1844 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1845 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1846 | "dev": true 1847 | }, 1848 | "get-intrinsic": { 1849 | "version": "1.1.2", 1850 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 1851 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 1852 | "dev": true, 1853 | "requires": { 1854 | "function-bind": "^1.1.1", 1855 | "has": "^1.0.3", 1856 | "has-symbols": "^1.0.3" 1857 | } 1858 | }, 1859 | "github-from-package": { 1860 | "version": "0.0.0", 1861 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1862 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 1863 | "dev": true 1864 | }, 1865 | "glob": { 1866 | "version": "7.1.6", 1867 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1868 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1869 | "dev": true, 1870 | "requires": { 1871 | "fs.realpath": "^1.0.0", 1872 | "inflight": "^1.0.4", 1873 | "inherits": "2", 1874 | "minimatch": "^3.0.4", 1875 | "once": "^1.3.0", 1876 | "path-is-absolute": "^1.0.0" 1877 | } 1878 | }, 1879 | "has": { 1880 | "version": "1.0.3", 1881 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1882 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1883 | "dev": true, 1884 | "requires": { 1885 | "function-bind": "^1.1.1" 1886 | } 1887 | }, 1888 | "has-flag": { 1889 | "version": "3.0.0", 1890 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1891 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1892 | "dev": true 1893 | }, 1894 | "has-symbols": { 1895 | "version": "1.0.3", 1896 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1897 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1898 | "dev": true 1899 | }, 1900 | "hosted-git-info": { 1901 | "version": "4.1.0", 1902 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", 1903 | "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", 1904 | "dev": true, 1905 | "requires": { 1906 | "lru-cache": "^6.0.0" 1907 | } 1908 | }, 1909 | "htmlparser2": { 1910 | "version": "8.0.1", 1911 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", 1912 | "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", 1913 | "dev": true, 1914 | "requires": { 1915 | "domelementtype": "^2.3.0", 1916 | "domhandler": "^5.0.2", 1917 | "domutils": "^3.0.1", 1918 | "entities": "^4.3.0" 1919 | } 1920 | }, 1921 | "ieee754": { 1922 | "version": "1.2.1", 1923 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1924 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1925 | "dev": true 1926 | }, 1927 | "inflight": { 1928 | "version": "1.0.6", 1929 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1930 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1931 | "dev": true, 1932 | "requires": { 1933 | "once": "^1.3.0", 1934 | "wrappy": "1" 1935 | } 1936 | }, 1937 | "inherits": { 1938 | "version": "2.0.4", 1939 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1940 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1941 | "dev": true 1942 | }, 1943 | "ini": { 1944 | "version": "1.3.8", 1945 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1946 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1947 | "dev": true 1948 | }, 1949 | "js-tokens": { 1950 | "version": "4.0.0", 1951 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1952 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1953 | "dev": true 1954 | }, 1955 | "js-yaml": { 1956 | "version": "3.13.1", 1957 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1958 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1959 | "dev": true, 1960 | "requires": { 1961 | "argparse": "^1.0.7", 1962 | "esprima": "^4.0.0" 1963 | } 1964 | }, 1965 | "keytar": { 1966 | "version": "7.9.0", 1967 | "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", 1968 | "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", 1969 | "dev": true, 1970 | "requires": { 1971 | "node-addon-api": "^4.3.0", 1972 | "prebuild-install": "^7.0.1" 1973 | } 1974 | }, 1975 | "leven": { 1976 | "version": "3.1.0", 1977 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 1978 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 1979 | "dev": true 1980 | }, 1981 | "linkify-it": { 1982 | "version": "3.0.3", 1983 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", 1984 | "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", 1985 | "dev": true, 1986 | "requires": { 1987 | "uc.micro": "^1.0.1" 1988 | } 1989 | }, 1990 | "lru-cache": { 1991 | "version": "6.0.0", 1992 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1993 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1994 | "dev": true, 1995 | "requires": { 1996 | "yallist": "^4.0.0" 1997 | } 1998 | }, 1999 | "luxon": { 2000 | "version": "2.0.2", 2001 | "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.2.tgz", 2002 | "integrity": "sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg==" 2003 | }, 2004 | "markdown-it": { 2005 | "version": "12.3.2", 2006 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", 2007 | "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", 2008 | "dev": true, 2009 | "requires": { 2010 | "argparse": "^2.0.1", 2011 | "entities": "~2.1.0", 2012 | "linkify-it": "^3.0.1", 2013 | "mdurl": "^1.0.1", 2014 | "uc.micro": "^1.0.5" 2015 | }, 2016 | "dependencies": { 2017 | "argparse": { 2018 | "version": "2.0.1", 2019 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2020 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2021 | "dev": true 2022 | }, 2023 | "entities": { 2024 | "version": "2.1.0", 2025 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 2026 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", 2027 | "dev": true 2028 | } 2029 | } 2030 | }, 2031 | "mdurl": { 2032 | "version": "1.0.1", 2033 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 2034 | "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", 2035 | "dev": true 2036 | }, 2037 | "mime": { 2038 | "version": "1.6.0", 2039 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2040 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2041 | "dev": true 2042 | }, 2043 | "mimic-response": { 2044 | "version": "3.1.0", 2045 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 2046 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 2047 | "dev": true 2048 | }, 2049 | "minimatch": { 2050 | "version": "3.0.4", 2051 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2052 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2053 | "requires": { 2054 | "brace-expansion": "^1.1.7" 2055 | } 2056 | }, 2057 | "minimist": { 2058 | "version": "0.0.8", 2059 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2060 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2061 | "dev": true 2062 | }, 2063 | "mkdirp": { 2064 | "version": "0.5.1", 2065 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2066 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2067 | "dev": true, 2068 | "requires": { 2069 | "minimist": "0.0.8" 2070 | } 2071 | }, 2072 | "mkdirp-classic": { 2073 | "version": "0.5.3", 2074 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 2075 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 2076 | "dev": true 2077 | }, 2078 | "mobx": { 2079 | "version": "5.14.2", 2080 | "resolved": "https://registry.npmjs.org/mobx/-/mobx-5.14.2.tgz", 2081 | "integrity": "sha512-yx5Xe6o2WSYFgeytzZt6jGaYghJdQbd1ElR7S2s93x7/+5SYfJBfutvZF1O5gPEsUyTAFZ5IMYGu1KyhkPk+oQ==" 2082 | }, 2083 | "mute-stream": { 2084 | "version": "0.0.8", 2085 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 2086 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 2087 | "dev": true 2088 | }, 2089 | "napi-build-utils": { 2090 | "version": "1.0.2", 2091 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 2092 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 2093 | "dev": true 2094 | }, 2095 | "node-abi": { 2096 | "version": "3.24.0", 2097 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", 2098 | "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", 2099 | "dev": true, 2100 | "requires": { 2101 | "semver": "^7.3.5" 2102 | }, 2103 | "dependencies": { 2104 | "semver": { 2105 | "version": "7.3.7", 2106 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 2107 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 2108 | "dev": true, 2109 | "requires": { 2110 | "lru-cache": "^6.0.0" 2111 | } 2112 | } 2113 | } 2114 | }, 2115 | "node-addon-api": { 2116 | "version": "4.3.0", 2117 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", 2118 | "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", 2119 | "dev": true 2120 | }, 2121 | "nth-check": { 2122 | "version": "2.1.1", 2123 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 2124 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 2125 | "dev": true, 2126 | "requires": { 2127 | "boolbase": "^1.0.0" 2128 | } 2129 | }, 2130 | "object-inspect": { 2131 | "version": "1.12.2", 2132 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 2133 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 2134 | "dev": true 2135 | }, 2136 | "once": { 2137 | "version": "1.4.0", 2138 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2139 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2140 | "dev": true, 2141 | "requires": { 2142 | "wrappy": "1" 2143 | } 2144 | }, 2145 | "parse-semver": { 2146 | "version": "1.1.1", 2147 | "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", 2148 | "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", 2149 | "dev": true, 2150 | "requires": { 2151 | "semver": "^5.1.0" 2152 | } 2153 | }, 2154 | "parse5": { 2155 | "version": "7.0.0", 2156 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", 2157 | "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", 2158 | "dev": true, 2159 | "requires": { 2160 | "entities": "^4.3.0" 2161 | } 2162 | }, 2163 | "parse5-htmlparser2-tree-adapter": { 2164 | "version": "7.0.0", 2165 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 2166 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 2167 | "dev": true, 2168 | "requires": { 2169 | "domhandler": "^5.0.2", 2170 | "parse5": "^7.0.0" 2171 | } 2172 | }, 2173 | "path-is-absolute": { 2174 | "version": "1.0.1", 2175 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2176 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2177 | "dev": true 2178 | }, 2179 | "path-parse": { 2180 | "version": "1.0.6", 2181 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2182 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2183 | "dev": true 2184 | }, 2185 | "pend": { 2186 | "version": "1.2.0", 2187 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 2188 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 2189 | "dev": true 2190 | }, 2191 | "prebuild-install": { 2192 | "version": "7.1.1", 2193 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", 2194 | "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", 2195 | "dev": true, 2196 | "requires": { 2197 | "detect-libc": "^2.0.0", 2198 | "expand-template": "^2.0.3", 2199 | "github-from-package": "0.0.0", 2200 | "minimist": "^1.2.3", 2201 | "mkdirp-classic": "^0.5.3", 2202 | "napi-build-utils": "^1.0.1", 2203 | "node-abi": "^3.3.0", 2204 | "pump": "^3.0.0", 2205 | "rc": "^1.2.7", 2206 | "simple-get": "^4.0.0", 2207 | "tar-fs": "^2.0.0", 2208 | "tunnel-agent": "^0.6.0" 2209 | }, 2210 | "dependencies": { 2211 | "minimist": { 2212 | "version": "1.2.6", 2213 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2214 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 2215 | "dev": true 2216 | } 2217 | } 2218 | }, 2219 | "pump": { 2220 | "version": "3.0.0", 2221 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2222 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2223 | "dev": true, 2224 | "requires": { 2225 | "end-of-stream": "^1.1.0", 2226 | "once": "^1.3.1" 2227 | } 2228 | }, 2229 | "qs": { 2230 | "version": "6.11.0", 2231 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2232 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2233 | "dev": true, 2234 | "requires": { 2235 | "side-channel": "^1.0.4" 2236 | } 2237 | }, 2238 | "rc": { 2239 | "version": "1.2.8", 2240 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2241 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2242 | "dev": true, 2243 | "requires": { 2244 | "deep-extend": "^0.6.0", 2245 | "ini": "~1.3.0", 2246 | "minimist": "^1.2.0", 2247 | "strip-json-comments": "~2.0.1" 2248 | }, 2249 | "dependencies": { 2250 | "minimist": { 2251 | "version": "1.2.6", 2252 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2253 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 2254 | "dev": true 2255 | } 2256 | } 2257 | }, 2258 | "read": { 2259 | "version": "1.0.7", 2260 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 2261 | "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", 2262 | "dev": true, 2263 | "requires": { 2264 | "mute-stream": "~0.0.4" 2265 | } 2266 | }, 2267 | "readable-stream": { 2268 | "version": "3.6.0", 2269 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2270 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2271 | "dev": true, 2272 | "requires": { 2273 | "inherits": "^2.0.3", 2274 | "string_decoder": "^1.1.1", 2275 | "util-deprecate": "^1.0.1" 2276 | } 2277 | }, 2278 | "resolve": { 2279 | "version": "1.14.1", 2280 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", 2281 | "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", 2282 | "dev": true, 2283 | "requires": { 2284 | "path-parse": "^1.0.6" 2285 | } 2286 | }, 2287 | "rimraf": { 2288 | "version": "3.0.2", 2289 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2290 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2291 | "dev": true, 2292 | "requires": { 2293 | "glob": "^7.1.3" 2294 | } 2295 | }, 2296 | "safe-buffer": { 2297 | "version": "5.2.1", 2298 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2299 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2300 | "dev": true 2301 | }, 2302 | "sax": { 2303 | "version": "1.2.4", 2304 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2305 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 2306 | "dev": true 2307 | }, 2308 | "semver": { 2309 | "version": "5.7.1", 2310 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2311 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2312 | "dev": true 2313 | }, 2314 | "side-channel": { 2315 | "version": "1.0.4", 2316 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2317 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2318 | "dev": true, 2319 | "requires": { 2320 | "call-bind": "^1.0.0", 2321 | "get-intrinsic": "^1.0.2", 2322 | "object-inspect": "^1.9.0" 2323 | } 2324 | }, 2325 | "simple-concat": { 2326 | "version": "1.0.1", 2327 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2328 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 2329 | "dev": true 2330 | }, 2331 | "simple-get": { 2332 | "version": "4.0.1", 2333 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 2334 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 2335 | "dev": true, 2336 | "requires": { 2337 | "decompress-response": "^6.0.0", 2338 | "once": "^1.3.1", 2339 | "simple-concat": "^1.0.0" 2340 | } 2341 | }, 2342 | "sprintf-js": { 2343 | "version": "1.0.3", 2344 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2345 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2346 | "dev": true 2347 | }, 2348 | "string_decoder": { 2349 | "version": "1.3.0", 2350 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2351 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2352 | "dev": true, 2353 | "requires": { 2354 | "safe-buffer": "~5.2.0" 2355 | } 2356 | }, 2357 | "strip-json-comments": { 2358 | "version": "2.0.1", 2359 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2360 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2361 | "dev": true 2362 | }, 2363 | "supports-color": { 2364 | "version": "5.5.0", 2365 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2366 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2367 | "dev": true, 2368 | "requires": { 2369 | "has-flag": "^3.0.0" 2370 | } 2371 | }, 2372 | "tar-fs": { 2373 | "version": "2.1.1", 2374 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 2375 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 2376 | "dev": true, 2377 | "requires": { 2378 | "chownr": "^1.1.1", 2379 | "mkdirp-classic": "^0.5.2", 2380 | "pump": "^3.0.0", 2381 | "tar-stream": "^2.1.4" 2382 | } 2383 | }, 2384 | "tar-stream": { 2385 | "version": "2.2.0", 2386 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2387 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2388 | "dev": true, 2389 | "requires": { 2390 | "bl": "^4.0.3", 2391 | "end-of-stream": "^1.4.1", 2392 | "fs-constants": "^1.0.0", 2393 | "inherits": "^2.0.3", 2394 | "readable-stream": "^3.1.1" 2395 | } 2396 | }, 2397 | "tmp": { 2398 | "version": "0.2.1", 2399 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 2400 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 2401 | "dev": true, 2402 | "requires": { 2403 | "rimraf": "^3.0.0" 2404 | } 2405 | }, 2406 | "tslib": { 2407 | "version": "1.10.0", 2408 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 2409 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 2410 | "dev": true 2411 | }, 2412 | "tslint": { 2413 | "version": "5.20.1", 2414 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", 2415 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", 2416 | "dev": true, 2417 | "requires": { 2418 | "@babel/code-frame": "^7.0.0", 2419 | "builtin-modules": "^1.1.1", 2420 | "chalk": "^2.3.0", 2421 | "commander": "^2.12.1", 2422 | "diff": "^4.0.1", 2423 | "glob": "^7.1.1", 2424 | "js-yaml": "^3.13.1", 2425 | "minimatch": "^3.0.4", 2426 | "mkdirp": "^0.5.1", 2427 | "resolve": "^1.3.2", 2428 | "semver": "^5.3.0", 2429 | "tslib": "^1.8.0", 2430 | "tsutils": "^2.29.0" 2431 | } 2432 | }, 2433 | "tsutils": { 2434 | "version": "2.29.0", 2435 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 2436 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 2437 | "dev": true, 2438 | "requires": { 2439 | "tslib": "^1.8.1" 2440 | } 2441 | }, 2442 | "tunnel": { 2443 | "version": "0.0.6", 2444 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 2445 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 2446 | "dev": true 2447 | }, 2448 | "tunnel-agent": { 2449 | "version": "0.6.0", 2450 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2451 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2452 | "dev": true, 2453 | "requires": { 2454 | "safe-buffer": "^5.0.1" 2455 | } 2456 | }, 2457 | "typed-rest-client": { 2458 | "version": "1.8.9", 2459 | "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", 2460 | "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", 2461 | "dev": true, 2462 | "requires": { 2463 | "qs": "^6.9.1", 2464 | "tunnel": "0.0.6", 2465 | "underscore": "^1.12.1" 2466 | } 2467 | }, 2468 | "typescript": { 2469 | "version": "4.7.4", 2470 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 2471 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 2472 | "dev": true 2473 | }, 2474 | "uc.micro": { 2475 | "version": "1.0.6", 2476 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 2477 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 2478 | "dev": true 2479 | }, 2480 | "underscore": { 2481 | "version": "1.13.4", 2482 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", 2483 | "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", 2484 | "dev": true 2485 | }, 2486 | "url-join": { 2487 | "version": "4.0.1", 2488 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", 2489 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", 2490 | "dev": true 2491 | }, 2492 | "util-deprecate": { 2493 | "version": "1.0.2", 2494 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2495 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2496 | "dev": true 2497 | }, 2498 | "vsce": { 2499 | "version": "2.10.0", 2500 | "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.10.0.tgz", 2501 | "integrity": "sha512-b+wB3XMapEi368g64klSM6uylllZdNutseqbNY+tUoHYSy6g2NwnlWuAGKDQTYc0IqfDUjUFRQBpPgA89Q+Fyw==", 2502 | "dev": true, 2503 | "requires": { 2504 | "azure-devops-node-api": "^11.0.1", 2505 | "chalk": "^2.4.2", 2506 | "cheerio": "^1.0.0-rc.9", 2507 | "commander": "^6.1.0", 2508 | "glob": "^7.0.6", 2509 | "hosted-git-info": "^4.0.2", 2510 | "keytar": "^7.7.0", 2511 | "leven": "^3.1.0", 2512 | "markdown-it": "^12.3.2", 2513 | "mime": "^1.3.4", 2514 | "minimatch": "^3.0.3", 2515 | "parse-semver": "^1.1.1", 2516 | "read": "^1.0.7", 2517 | "semver": "^5.1.0", 2518 | "tmp": "^0.2.1", 2519 | "typed-rest-client": "^1.8.4", 2520 | "url-join": "^4.0.1", 2521 | "xml2js": "^0.4.23", 2522 | "yauzl": "^2.3.1", 2523 | "yazl": "^2.2.2" 2524 | }, 2525 | "dependencies": { 2526 | "commander": { 2527 | "version": "6.2.1", 2528 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 2529 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 2530 | "dev": true 2531 | } 2532 | } 2533 | }, 2534 | "wrappy": { 2535 | "version": "1.0.2", 2536 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2537 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2538 | "dev": true 2539 | }, 2540 | "xml2js": { 2541 | "version": "0.4.23", 2542 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 2543 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 2544 | "dev": true, 2545 | "requires": { 2546 | "sax": ">=0.6.0", 2547 | "xmlbuilder": "~11.0.0" 2548 | } 2549 | }, 2550 | "xmlbuilder": { 2551 | "version": "11.0.1", 2552 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2553 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2554 | "dev": true 2555 | }, 2556 | "yallist": { 2557 | "version": "4.0.0", 2558 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2559 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2560 | "dev": true 2561 | }, 2562 | "yauzl": { 2563 | "version": "2.10.0", 2564 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2565 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 2566 | "dev": true, 2567 | "requires": { 2568 | "buffer-crc32": "~0.2.3", 2569 | "fd-slicer": "~1.1.0" 2570 | } 2571 | }, 2572 | "yazl": { 2573 | "version": "2.5.1", 2574 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 2575 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 2576 | "dev": true, 2577 | "requires": { 2578 | "buffer-crc32": "~0.2.3" 2579 | } 2580 | } 2581 | } 2582 | } 2583 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitdoc", 3 | "displayName": "GitDoc", 4 | "publisher": "vsls-contrib", 5 | "icon": "images/icon.png", 6 | "description": "Automatically commit/push/pull changes on save, so you can edit a Git repo like a multi-file, versioned document.", 7 | "version": "0.2.3", 8 | "extensionKind": [ 9 | "workspace" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/lostintangent/gitdoc.git" 14 | }, 15 | "engines": { 16 | "vscode": "^1.90.0" 17 | }, 18 | "categories": [ 19 | "Other" 20 | ], 21 | "keywords": [ 22 | "commit", 23 | "sync", 24 | "git", 25 | "github-copilot" 26 | ], 27 | "activationEvents": [ 28 | "onStartupFinished" 29 | ], 30 | "main": "./out/extension.js", 31 | "contributes": { 32 | "commands": [ 33 | { 34 | "command": "gitdoc.disable", 35 | "title": "Disable", 36 | "category": "GitDoc" 37 | }, 38 | { 39 | "command": "gitdoc.enable", 40 | "title": "Enable", 41 | "category": "GitDoc" 42 | }, 43 | { 44 | "command": "gitdoc.restoreVersion", 45 | "title": "Restore Version" 46 | }, 47 | { 48 | "command": "gitdoc.squashVersions", 49 | "title": "Squash Version(s) Above" 50 | }, 51 | { 52 | "command": "gitdoc.undoVersion", 53 | "title": "Undo Version" 54 | }, 55 | { 56 | "command": "gitdoc.commit", 57 | "title": "Commit", 58 | "category": "GitDoc" 59 | } 60 | ], 61 | "configuration": { 62 | "title": "GitDoc", 63 | "properties": { 64 | "gitdoc.autoCommitDelay": { 65 | "type": "number", 66 | "default": 30000, 67 | "markdownDescription": "Controls the delay in ms after which any changes are automatically committed. Only applies when `GitDoc: Enabled` is set to `true`." 68 | }, 69 | "gitdoc.autoPull": { 70 | "type": "string", 71 | "enum": [ 72 | "afterDelay", 73 | "onCommit", 74 | "onPush", 75 | "off" 76 | ], 77 | "default": "onPush", 78 | "description": "Specifies whether to automatically pull changes from the current remote." 79 | }, 80 | "gitdoc.autoPullDelay": { 81 | "type": "number", 82 | "default": 30000, 83 | "markdownDescription": "Controls the delay in ms after which any commits are automatically pulled. Only applies when `GitDoc: Auto Pull` is set to `afterDelay`." 84 | }, 85 | "gitdoc.autoPush": { 86 | "type": "string", 87 | "enum": [ 88 | "afterDelay", 89 | "onCommit", 90 | "off" 91 | ], 92 | "default": "onCommit", 93 | "description": "Specifies whether to automatically push your changes to the current remote." 94 | }, 95 | "gitdoc.autoPushDelay": { 96 | "type": "number", 97 | "default": 30000, 98 | "markdownDescription": "Controls the delay in ms after which any commits are automatically pushed. Only applies when `GitDoc: Auto Push` is set to `afterDelay`." 99 | }, 100 | "gitdoc.commitMessageFormat": { 101 | "type": "string", 102 | "default": "ff", 103 | "markdownDescription": "Specifies the date/time format string (using Luxon) to use when generating auto-commit messages. Views [the docs](https://moment.github.io/luxon/#/formatting?id=table-of-tokens) for more details." 104 | }, 105 | "gitdoc.commitValidationLevel": { 106 | "type": "string", 107 | "enum": [ 108 | "error", 109 | "warning", 110 | "none" 111 | ], 112 | "default": "error", 113 | "description": "Specifies whether to validate that a file is free of problems, before attempting to commit changes to it." 114 | }, 115 | "gitdoc.commitOnClose": { 116 | "type": "boolean", 117 | "default": true, 118 | "description": "Specifies whether to automatically commit changes when you close VS Code." 119 | }, 120 | "gitdoc.enabled": { 121 | "type": "boolean", 122 | "default": false, 123 | "description": "Specifies whether to automatically create a commit each time you save a file." 124 | }, 125 | "gitdoc.filePattern": { 126 | "type": "string", 127 | "default": "**/*", 128 | "description": "Specifies a glob that indicates the specific files that should be automatically committed." 129 | }, 130 | "gitdoc.noVerify": { 131 | "type": "boolean", 132 | "default": false, 133 | "markdownDescription": "Specifies whether to ignore any configured git hooks. Defaults to `false`." 134 | }, 135 | "gitdoc.pullOnOpen": { 136 | "type": "boolean", 137 | "default": true, 138 | "description": "Specifies whether to automatically pull remote changes when you open a repo." 139 | }, 140 | "gitdoc.pushMode": { 141 | "type": "string", 142 | "enum": [ 143 | "forcePush", 144 | "forcePushWithLease", 145 | "push" 146 | ], 147 | "default": "forcePush", 148 | "description": "Specifies how changes should be pushed after they're committed. This setting only applies when auto-pushing is enabled." 149 | }, 150 | "gitdoc.timeZone": { 151 | "type": "string", 152 | "default": null, 153 | "markdownDescription": "Specifies the timezone (as a [tz database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) that commit message dates should be offset to. Defaults to UTC." 154 | }, 155 | "gitdoc.excludeBranches": { 156 | "type": "array", 157 | "default": [], 158 | "description": "Specifies a list of branches that should be excluded from auto-commits." 159 | }, 160 | "gitdoc.ai.enabled": { 161 | "type": "boolean", 162 | "default": false, 163 | "description": "Specifies whether to use AI to generate commit messages. This setting only applies when you have the Copilot extension installed and setup." 164 | }, 165 | "gitdoc.ai.model": { 166 | "type": "string", 167 | "default": "gpt-4o", 168 | "enum": [ 169 | "gpt-4o", 170 | "o1-ga", 171 | "o1-mini", 172 | "claude-3.5-sonnet", 173 | "gemini-1.5-pro" 174 | ], 175 | "markdownDescription": "Specifies the AI model to use when generating commit messages. This setting only applies when `GitDoc > AI: Enabled` is set to `true`. Defaults to `gpt-4o`." 176 | }, 177 | "gitdoc.ai.useEmojis": { 178 | "type": "boolean", 179 | "default": false, 180 | "markdownDescription": "Specifies whether to prepend AI-generated commit messages with an emoji. This setting only applies when `GitDoc > AI: Enabled` is set to `true`. Defaults to `false`." 181 | }, 182 | "gitdoc.ai.customInstructions": { 183 | "type": "string", 184 | "default": null, 185 | "markdownDescription": "Specifies custom instructions to use when generating commit messages (e.g. use conventional commit syntax, use emojis). This setting only applies when `GitDoc > AI: Enabled` is set to `true`." 186 | } 187 | } 188 | }, 189 | "menus": { 190 | "commandPalette": [ 191 | { 192 | "command": "gitdoc.disable", 193 | "when": "gitOpenRepositoryCount != 0 && gitdoc:enabled" 194 | }, 195 | { 196 | "command": "gitdoc.enable", 197 | "when": "gitOpenRepositoryCount != 0 && !gitdoc:enabled" 198 | }, 199 | { 200 | "command": "gitdoc.restoreVersion", 201 | "when": "false" 202 | }, 203 | { 204 | "command": "gitdoc.squashVersions", 205 | "when": "false" 206 | }, 207 | { 208 | "command": "gitdoc.undoVersion", 209 | "when": "false" 210 | }, 211 | { 212 | "command": "gitdoc.commit", 213 | "when": "gitdoc:enabled" 214 | } 215 | ], 216 | "timeline/item/context": [ 217 | { 218 | "command": "gitdoc.restoreVersion", 219 | "when": "gitdoc:enabled && timelineItem =~ /git:file:commit\\b/", 220 | "group": "gitdoc@1" 221 | }, 222 | { 223 | "command": "gitdoc.undoVersion", 224 | "when": "gitdoc:enabled && timelineItem =~ /git:file:commit\\b/", 225 | "group": "gitdoc@2" 226 | }, 227 | { 228 | "command": "gitdoc.squashVersions", 229 | "when": "gitdoc:enabled && timelineItem =~ /git:file:commit\\b/", 230 | "group": "gitdoc@3" 231 | } 232 | ] 233 | } 234 | }, 235 | "scripts": { 236 | "vscode:prepublish": "npm run compile", 237 | "compile": "tsc -p ./", 238 | "watch": "tsc -watch -p ./", 239 | "package": "vsce package" 240 | }, 241 | "devDependencies": { 242 | "@types/debounce": "^1.2.0", 243 | "@types/luxon": "^2.0.5", 244 | "@types/minimatch": "^3.0.3", 245 | "@types/node": "^18.6.5", 246 | "@types/vscode": "1.90.0", 247 | "tslint": "^5.8.0", 248 | "typescript": "^4.7.4", 249 | "vsce": "^2.10.0" 250 | }, 251 | "dependencies": { 252 | "luxon": "^2.0.2", 253 | "minimatch": "^3.0.4", 254 | "mobx": "^5.14.2" 255 | } 256 | } -------------------------------------------------------------------------------- /src/commands.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { EXTENSION_NAME } from "./constants"; 3 | import { getGitApi } from "./git"; 4 | import { updateContext } from "./utils"; 5 | import { commit } from "./watcher"; 6 | 7 | interface GitTimelineItem { 8 | message: string; 9 | ref: string; 10 | previousRef: string; 11 | } 12 | 13 | export function registerCommands(context: vscode.ExtensionContext) { 14 | function registerCommand(name: string, callback: (...args: any[]) => any) { 15 | context.subscriptions.push( 16 | vscode.commands.registerCommand(`${EXTENSION_NAME}.${name}`, callback) 17 | ); 18 | } 19 | 20 | registerCommand("enable", updateContext.bind(null, true)); 21 | registerCommand("disable", updateContext.bind(null, false)); 22 | 23 | registerCommand("restoreVersion", async (item: GitTimelineItem) => { 24 | if (!vscode.window.activeTextEditor) { 25 | return; 26 | } 27 | 28 | const path = vscode.workspace.asRelativePath( 29 | vscode.window.activeTextEditor.document.uri.path 30 | ); 31 | 32 | const git = await getGitApi(); 33 | 34 | // @ts-ignore 35 | await git?.repositories[0].repository.repository.checkout(item.ref, [ 36 | path, 37 | ]); 38 | 39 | // TODO: Look into why the checkout 40 | // doesn't trigger the watcher. 41 | commit(git?.repositories[0]!); 42 | }); 43 | 44 | registerCommand("squashVersions", async (item: GitTimelineItem) => { 45 | const message = await vscode.window.showInputBox({ 46 | prompt: "Enter the name to give to the new squashed version", 47 | value: item.message, 48 | }); 49 | 50 | if (message) { 51 | const git = await getGitApi(); 52 | // @ts-ignore 53 | await git?.repositories[0].repository.reset(`${item.ref}~1`); 54 | await commit(git?.repositories[0]!, message); 55 | } 56 | }); 57 | 58 | registerCommand("undoVersion", async (item: GitTimelineItem) => { 59 | const git = await getGitApi(); 60 | 61 | // @ts-ignore 62 | await git?.repositories[0].repository.repository.run([ 63 | "revert", 64 | "-n", // Tell Git not to create a commit, so that we can make one with the right message format 65 | item.ref, 66 | ]); 67 | 68 | await commit(git?.repositories[0]!); 69 | }); 70 | 71 | registerCommand("commit", async () => { 72 | const git = await getGitApi(); 73 | if (git && git.repositories.length > 0) { 74 | await commit(git.repositories[0]); 75 | } 76 | }); 77 | } 78 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | 3 | const DEFAULT_DELAY_MS = 30000; 4 | const ENABLED_KEY = "enabled"; 5 | 6 | export type AutoPull = AutoPush | "onPush"; 7 | export type AutoPush = "onCommit" | "afterDelay" | "off"; 8 | export type CommitValidationLevel = "error" | "warning" | "none"; 9 | export type PushMode = "forcePush" | "forcePushWithLease" | "push"; 10 | 11 | function config() { 12 | return vscode.workspace.getConfiguration("gitdoc"); 13 | } 14 | 15 | export default { 16 | get autoCommitDelay(): number { 17 | return config().get("autoCommitDelay", DEFAULT_DELAY_MS); 18 | }, 19 | get autoPull(): AutoPull { 20 | return config().get("autoPull", "onPush"); 21 | }, 22 | get autoPullDelay(): number { 23 | return config().get("autoPullDelay", DEFAULT_DELAY_MS); 24 | }, 25 | get autoPush(): AutoPush { 26 | return config().get("autoPush", "onCommit"); 27 | }, 28 | get autoPushDelay(): number { 29 | return config().get("autoPushDelay", DEFAULT_DELAY_MS); 30 | }, 31 | get commitMessageFormat(): string { 32 | return config().get("commitMessageFormat", "lll"); 33 | }, 34 | get commitValidationLevel(): CommitValidationLevel { 35 | return config().get("commitValidationLevel", "error"); 36 | }, 37 | get commitOnClose() { 38 | return config().get("commitOnClose", true); 39 | }, 40 | get enabled() { 41 | return config().get(ENABLED_KEY, false); 42 | }, 43 | set enabled(value: boolean) { 44 | config().update(ENABLED_KEY, value, vscode.ConfigurationTarget.Workspace); 45 | }, 46 | get excludeBranches(): string[] { 47 | return config().get("excludeBranches", []); 48 | }, 49 | get filePattern() { 50 | return config().get("filePattern", "**/*"); 51 | }, 52 | get noVerify(): boolean { 53 | return config().get("noVerify", false); 54 | }, 55 | get pullOnOpen() { 56 | return config().get("pullOnOpen", true); 57 | }, 58 | get pushMode(): PushMode { 59 | return config().get("pushMode", "forcePush"); 60 | }, 61 | get timeZone(): string | null { 62 | return config().get("timeZone", null); 63 | }, 64 | get aiEnabled() { 65 | return config().get("ai.enabled", false); 66 | }, 67 | get aiModel() { 68 | return config().get("ai.model", "gpt-4o"); 69 | }, 70 | get aiCustomInstructions() { 71 | return config().get("ai.customInstructions", null); 72 | }, 73 | get aiUseEmojis() { 74 | return config().get("ai.useEmojis", false); 75 | } 76 | }; 77 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const EXTENSION_NAME = "gitdoc"; 2 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import { reaction } from "mobx"; 2 | import * as vscode from "vscode"; 3 | import { registerCommands } from "./commands"; 4 | import config from "./config"; 5 | import { getGitApi, GitAPI, RefType } from "./git"; 6 | import { store } from "./store"; 7 | import { commit, watchForChanges } from "./watcher"; 8 | import { updateContext } from "./utils"; 9 | 10 | export async function activate(context: vscode.ExtensionContext) { 11 | const git = await getGitApi(); 12 | if (!git) { 13 | return; 14 | } 15 | 16 | // Initialize the store based on the 17 | // user/workspace configuration. 18 | store.enabled = config.enabled; 19 | 20 | registerCommands(context); 21 | 22 | // Enable/disable the auto-commit watcher as the user 23 | // opens/closes Git repos, modifies their settings 24 | // and/or manually enables it via the command palette. 25 | context.subscriptions.push(git.onDidOpenRepository(() => checkEnabled(git))); 26 | context.subscriptions.push(git.onDidCloseRepository(() => checkEnabled(git))); 27 | 28 | reaction( 29 | () => [store.enabled], 30 | () => checkEnabled(git) 31 | ); 32 | 33 | context.subscriptions.push( 34 | vscode.workspace.onDidChangeConfiguration((e) => { 35 | if (e.affectsConfiguration("gitdoc.enabled") || 36 | e.affectsConfiguration("gitdoc.excludeBranches") || 37 | e.affectsConfiguration("gitdoc.autoCommitDelay") || 38 | e.affectsConfiguration("gitdoc.filePattern")) { 39 | checkEnabled(git); 40 | } 41 | }) 42 | ); 43 | } 44 | 45 | let watcher: vscode.Disposable | null; 46 | async function checkEnabled(git: GitAPI) { 47 | if (watcher) { 48 | watcher.dispose(); 49 | watcher = null; 50 | } 51 | 52 | let branchName = git.repositories[0]?.state?.HEAD?.name; 53 | 54 | if (!branchName) { 55 | const refs = await git.repositories[0]?.getRefs(); 56 | branchName = refs?.find((ref) => ref.type === RefType.Head)?.name; 57 | } 58 | 59 | const enabled = 60 | git.repositories.length > 0 && 61 | store.enabled && !!branchName && !config.excludeBranches.includes(branchName); 62 | 63 | updateContext(enabled, false); 64 | 65 | if (enabled) { 66 | watcher = watchForChanges(git); 67 | } 68 | } 69 | 70 | export async function deactivate() { 71 | if (store.enabled && config.commitOnClose) { 72 | const git = await getGitApi(); 73 | if (git && git.repositories.length > 0) { 74 | return commit(git.repositories[0]); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/git.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | 3 | interface CommitOptions { 4 | all?: boolean | "tracked"; 5 | noVerify?: boolean; 6 | } 7 | 8 | export const enum RefType { 9 | Head, 10 | RemoteHead, 11 | Tag 12 | } 13 | 14 | interface Branch { 15 | readonly name: string; 16 | type: RefType; 17 | } 18 | 19 | interface RepositoryState { 20 | HEAD: Branch | undefined | null; 21 | refs: Branch[]; 22 | workingTreeChanges: Change[]; 23 | indexChanges: Change[]; 24 | mergeChanges: Change[]; 25 | onDidChange: vscode.Event; 26 | } 27 | 28 | export interface Change { 29 | readonly uri: vscode.Uri; 30 | } 31 | 32 | export enum ForcePushMode { 33 | Force, 34 | ForceWithLease, 35 | } 36 | 37 | export interface Repository { 38 | state: RepositoryState; 39 | 40 | createBranch(name: string, checkout: boolean, ref?: string): Promise; 41 | deleteBranch(name: string, force?: boolean): Promise; 42 | 43 | checkout(treeish: string): Promise; 44 | 45 | pull(unshallow?: boolean): Promise; 46 | 47 | push( 48 | remoteName?: string, 49 | branchName?: string, 50 | setUpstream?: boolean, 51 | forcePush?: ForcePushMode 52 | ): Promise; 53 | 54 | commit(message: string, opts?: CommitOptions): Promise; 55 | 56 | getRefs(): Promise; 57 | 58 | diffWithHEAD(path: string): Promise; 59 | } 60 | 61 | export interface GitAPI { 62 | repositories: Repository[]; 63 | 64 | getRepository(uri: vscode.Uri): Repository | null; 65 | onDidOpenRepository: vscode.Event; 66 | onDidCloseRepository: vscode.Event; 67 | } 68 | 69 | export async function getGitApi(): Promise { 70 | const extension = vscode.extensions.getExtension("vscode.git"); 71 | if (!extension) { 72 | return; 73 | } 74 | 75 | if (!extension.isActive) { 76 | await extension.activate(); 77 | } 78 | 79 | return extension.exports.getAPI(1); 80 | } 81 | -------------------------------------------------------------------------------- /src/store.ts: -------------------------------------------------------------------------------- 1 | import { observable } from "mobx"; 2 | 3 | export const store = observable({ 4 | enabled: false, 5 | isPulling: false, 6 | isPushing: false, 7 | }); 8 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import config from "./config"; 3 | import { EXTENSION_NAME } from "./constants"; 4 | import { store } from "./store"; 5 | 6 | const ENABLED_KEY = `${EXTENSION_NAME}:enabled`; 7 | 8 | export function updateContext(enabled: boolean, updateConfig: boolean = true) { 9 | store.enabled = enabled; 10 | vscode.commands.executeCommand("setContext", ENABLED_KEY, enabled); 11 | 12 | if (updateConfig) { 13 | config.enabled = enabled; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/watcher.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import config from "./config"; 3 | import { ForcePushMode, GitAPI, Repository, RefType } from "./git"; 4 | import { DateTime } from "luxon"; 5 | import { store } from "./store"; 6 | import { reaction } from "mobx"; 7 | import * as minimatch from "minimatch"; 8 | 9 | const REMOTE_NAME = "origin"; 10 | 11 | async function pushRepository( 12 | repository: Repository, 13 | forcePush: boolean = false 14 | ) { 15 | if (!(await hasRemotes(repository))) return; 16 | 17 | store.isPushing = true; 18 | 19 | try { 20 | if (config.autoPull === "onPush") { 21 | await pullRepository(repository); 22 | } 23 | 24 | const pushArgs: any[] = [REMOTE_NAME, repository.state.HEAD?.name, false]; 25 | 26 | if (forcePush) { 27 | pushArgs.push(ForcePushMode.Force); 28 | } else if (config.pushMode !== "push") { 29 | const pushMode = 30 | config.pushMode === "forcePush" 31 | ? ForcePushMode.Force 32 | : ForcePushMode.ForceWithLease; 33 | 34 | pushArgs.push(pushMode); 35 | } 36 | 37 | await repository.push(...pushArgs); 38 | 39 | store.isPushing = false; 40 | } catch { 41 | store.isPushing = false; 42 | 43 | if ( 44 | await vscode.window.showWarningMessage( 45 | "Remote repository contains conflicting changes.", 46 | "Force Push" 47 | ) 48 | ) { 49 | await pushRepository(repository, true); 50 | } 51 | } 52 | } 53 | 54 | async function pullRepository(repository: Repository) { 55 | if (!(await hasRemotes(repository))) return; 56 | 57 | store.isPulling = true; 58 | 59 | await repository.pull(); 60 | 61 | store.isPulling = false; 62 | } 63 | 64 | async function hasRemotes(repository: Repository): Promise { 65 | const refs = await repository.getRefs(); 66 | return refs.some((ref) => ref.type === RefType.RemoteHead); 67 | } 68 | 69 | function matches(uri: vscode.Uri) { 70 | return minimatch(uri.path, config.filePattern, { dot: true }); 71 | } 72 | 73 | async function generateCommitMessage(repository: Repository, changedUris: vscode.Uri[]): Promise { 74 | const diffs = await Promise.all( 75 | changedUris.map(async (uri) => { 76 | const filePath = vscode.workspace.asRelativePath(uri); 77 | const fileDiff = await repository.diffWithHEAD(filePath); 78 | 79 | return `## ${filePath} 80 | --- 81 | ${fileDiff}`; 82 | })); 83 | 84 | const model = await vscode.lm.selectChatModels({ family: config.aiModel }); 85 | if (!model || model.length === 0) return null; 86 | 87 | const prompt = `# Instructions 88 | 89 | You are a developer working on a project that uses Git for version control. You have made some changes to the codebase and are preparing to commit them to the repository. Your task is to summarize the changes that you have made into a concise commit message that describes the essence of the changes that were made. 90 | 91 | * Always start the commit message with a present tense verb such as "Update", "Fix", "Modify", "Add", "Improve", "Organize", "Arrange", "Mark", etc. 92 | * Respond in plain text, with no markdown formatting, and without any extra content. Simply respond with the commit message, and without a trailing period. 93 | * Don't reference the file paths that were changed, but make sure summarize all significant changes (using your best judgement). 94 | * When multiple files have been changed, give priority to edited files, followed by added files, and then renamed/deleted files. 95 | * When a change includes adding an emoji to a list item in markdown, then interpret a runner emoji as marking it as in progress, a checkmark emoji as meaning its completed, and a muscle emoji as meaning its a stretch goal. 96 | ${config.aiUseEmojis ? "* Prepend an emoji to the message that expresses the nature of the changes, and is as specific/relevant to the subject and/or action of the changes as possible.\n" : ""} 97 | # Code change diffs 98 | 99 | ${diffs.join("\n\n")} 100 | 101 | ${config.aiCustomInstructions ? `# Additional Instructions (Important!) 102 | 103 | ${config.aiCustomInstructions} 104 | ` : ""} 105 | # Commit message 106 | 107 | `; 108 | 109 | const response = await model[0].sendRequest([{ 110 | role: vscode.LanguageModelChatMessageRole.User, 111 | name: "User", 112 | content: prompt 113 | }]); 114 | 115 | let summary = ""; 116 | for await (const part of response.text) { 117 | summary += part; 118 | } 119 | 120 | return summary; 121 | } 122 | 123 | export async function commit(repository: Repository, message?: string) { 124 | // This function shouldn't ever be called when GitDoc 125 | // is disabled, but we're checking it just in case. 126 | if (store.enabled === false) return; 127 | 128 | const changes = [ 129 | ...repository.state.workingTreeChanges, 130 | ...repository.state.mergeChanges, 131 | ...repository.state.indexChanges, 132 | ]; 133 | 134 | if (changes.length === 0) return; 135 | 136 | const changedUris = changes 137 | .filter((change) => matches(change.uri)) 138 | .map((change) => change.uri); 139 | 140 | if (changedUris.length === 0) return; 141 | 142 | if (config.commitValidationLevel !== "none") { 143 | const diagnostics = vscode.languages 144 | .getDiagnostics() 145 | .filter(([uri, diagnostics]) => { 146 | const isChanged = changedUris.find( 147 | (changedUri) => 148 | changedUri.toString().localeCompare(uri.toString()) === 0 149 | ); 150 | 151 | return isChanged 152 | ? diagnostics.some( 153 | (diagnostic) => 154 | diagnostic.severity === vscode.DiagnosticSeverity.Error || 155 | (config.commitValidationLevel === "warning" && 156 | diagnostic.severity === vscode.DiagnosticSeverity.Warning) 157 | ) 158 | : false; 159 | }); 160 | 161 | if (diagnostics.length > 0) { 162 | return; 163 | } 164 | } 165 | 166 | let currentTime = DateTime.now(); 167 | 168 | // Ensure that the commit dates are formatted 169 | // as UTC, so that other clients can properly 170 | // re-offset them based on the user's locale. 171 | const commitDate = currentTime.toUTC().toString(); 172 | process.env.GIT_AUTHOR_DATE = commitDate; 173 | process.env.GIT_COMMITTER_DATE = commitDate; 174 | 175 | if (config.timeZone) { 176 | currentTime = currentTime.setZone(config.timeZone); 177 | } 178 | 179 | let commitMessage = message || currentTime.toFormat(config.commitMessageFormat); 180 | 181 | if (config.aiEnabled) { 182 | const aiMessage = await generateCommitMessage(repository, changedUris); 183 | if (aiMessage) { 184 | commitMessage = aiMessage; 185 | } 186 | } 187 | 188 | await repository.commit(commitMessage, { all: true, noVerify: config.noVerify }); 189 | 190 | delete process.env.GIT_AUTHOR_DATE; 191 | delete process.env.GIT_COMMITTER_DATE; 192 | 193 | if (config.autoPush === "onCommit") { 194 | await pushRepository(repository); 195 | } 196 | 197 | if (config.autoPull === "onCommit") { 198 | await pullRepository(repository); 199 | } 200 | } 201 | 202 | // TODO: Clear the timeout when GitDoc is disabled. 203 | function debounce(fn: Function, delay: number) { 204 | let timeout: NodeJS.Timeout | null = null; 205 | 206 | return (...args: any[]) => { 207 | if (timeout) { 208 | clearTimeout(timeout); 209 | } 210 | 211 | timeout = setTimeout(() => { 212 | fn(...args); 213 | }, delay); 214 | }; 215 | } 216 | 217 | const commitMap = new Map(); 218 | function debouncedCommit(repository: Repository) { 219 | if (!commitMap.has(repository)) { 220 | commitMap.set( 221 | repository, 222 | debounce(() => commit(repository), config.autoCommitDelay) 223 | ); 224 | } 225 | 226 | return commitMap.get(repository); 227 | } 228 | 229 | let statusBarItem: vscode.StatusBarItem | null = null; 230 | export function ensureStatusBarItem() { 231 | if (!statusBarItem) { 232 | statusBarItem = vscode.window.createStatusBarItem( 233 | vscode.StatusBarAlignment.Left 234 | ); 235 | 236 | statusBarItem.text = "$(mirror)"; 237 | statusBarItem.tooltip = "GitDoc: Auto-commiting files on save"; 238 | statusBarItem.command = "gitdoc.disable"; 239 | statusBarItem.show(); 240 | } 241 | 242 | return statusBarItem; 243 | } 244 | 245 | let disposables: vscode.Disposable[] = []; 246 | export function watchForChanges(git: GitAPI): vscode.Disposable { 247 | const commitAfterDelay = debouncedCommit(git.repositories[0]); 248 | disposables.push(git.repositories[0].state.onDidChange(commitAfterDelay)); 249 | 250 | ensureStatusBarItem(); 251 | 252 | disposables.push( 253 | vscode.window.onDidChangeActiveTextEditor((editor) => { 254 | if (editor && matches(editor.document.uri)) { 255 | statusBarItem?.show(); 256 | } else { 257 | statusBarItem?.hide(); 258 | } 259 | }) 260 | ); 261 | 262 | if ( 263 | vscode.window.activeTextEditor && 264 | matches(vscode.window.activeTextEditor.document.uri) 265 | ) { 266 | statusBarItem?.show(); 267 | } else { 268 | statusBarItem?.hide(); 269 | } 270 | 271 | disposables.push({ 272 | dispose: () => { 273 | statusBarItem?.dispose(); 274 | statusBarItem = null; 275 | }, 276 | }); 277 | 278 | if (config.autoPush === "afterDelay") { 279 | const interval = setInterval(async () => { 280 | pushRepository(git.repositories[0]); 281 | }, config.autoPushDelay); 282 | 283 | disposables.push({ 284 | dispose: () => { 285 | clearInterval(interval); 286 | }, 287 | }); 288 | } 289 | 290 | if (config.autoPull === "afterDelay") { 291 | const interval = setInterval( 292 | async () => pullRepository(git.repositories[0]), 293 | config.autoPullDelay 294 | ); 295 | 296 | disposables.push({ 297 | dispose: () => clearInterval(interval), 298 | }); 299 | } 300 | 301 | const reactionDisposable = reaction( 302 | () => [store.isPushing, store.isPulling], 303 | () => { 304 | const suffix = store.isPushing 305 | ? " (Pushing...)" 306 | : store.isPulling 307 | ? " (Pulling...)" 308 | : ""; 309 | statusBarItem!.text = `$(mirror)${suffix}`; 310 | } 311 | ); 312 | 313 | disposables.push({ 314 | dispose: reactionDisposable, 315 | }); 316 | 317 | if (config.pullOnOpen) { 318 | pullRepository(git.repositories[0]); 319 | } 320 | 321 | return { 322 | dispose: () => { 323 | disposables.forEach((disposable) => disposable.dispose()); 324 | disposables = []; 325 | }, 326 | }; 327 | } 328 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | /* Strict Type-Checking Option */ 12 | "strict": true, /* enable all strict type-checking options */ 13 | /* Additional Checks */ 14 | "noUnusedLocals": true /* Report errors on unused locals. */ 15 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 16 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 17 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 18 | }, 19 | "exclude": [ 20 | "node_modules", 21 | ".vscode-test" 22 | ] 23 | } 24 | --------------------------------------------------------------------------------