diff --git a/ .vscodeignore b/ .vscodeignore deleted file mode 100755 index f72581b..0000000 --- a/ .vscodeignore +++ /dev/null @@ -1,6 +0,0 @@ -.vscode/** -.gitignore -.github -.editorconfig -*.vsix -*.code-workspace \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..2fe59f7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[package.json] +indent_style = space +indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f43fecb --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,36 @@ +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + ecmaVersion: 8, + }, + env: { + es6: true, + node: true, + browser: true, + jest: true, + }, + plugins: ['prettier'], + extends: ['eslint:recommended', 'prettier'], + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + bracketSpacing: true, + semi: false, + printWidth: 500, + }, + ], + 'no-empty': [ + 'error', + { + allowEmptyCatch: true, + }, + ], + 'no-console': 0, + 'no-control-regex': 0, + 'no-useless-escape': 0, + }, + globals: {}, + } diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..43b7944 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at me@peterschmalfeldt.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 751defc..a26152c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,27 +1,52 @@ -![Logo](https://sfccdevops.s3.amazonaws.com/logo-128.png "Logo") - -Thank you for Contributing +Contributing Guide === -We want to make it as easy as possible to contribute changes. +Issues & Feature Requests +--- -Follow the requirements below for __[Creating Issues](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues/new)__ and __[Pull Requests](https://github.com/sfccdevops/explorer-exclude-vscode-extension/pull/new)__, to keep everything simple for everyone :) +[![Create Issue](https://img.shields.io/badge/Github-Create_Issue-red.svg?style=for-the-badge&logo=github&logoColor=ffffff&logoWidth=16)](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues/new/choose) - +### Bug Fix -Creating an Issue ---- +> We're sorry things are not working as expected, and want to get things fixed ASAP. In order to help us do that, we need a few things from you. + +1. Create a [New Issue](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues/new/choose) +2. Enter a Short but Descriptive Title for the Issue +3. Use the Template Provided and fill in as much as you can, if something does not apply, enter `N/A` +4. Look for the `Labels` section, and select `Bug Report` from the drop down menu +5. Click `Submit new issue` button + +### Feature Request -Use the Prepopulated Template that we provide. Issues reported that do not use the template will be rejected. +> Got an idea for a new feature? We'd love to hear it! In order to get this knocked out, we will need a few things from you. +1. Create a [New Issue](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues/new/choose) +2. Enter a Short but Descriptive Title for the Feature Request +3. Use the Template Provided and fill in as much as you can, if something does not apply, enter `N/A` ( you can delete the `Steps to Duplicate:` section as that does not apply ) +4. Look for the `Labels` section, and select `Feature Request` from the drop down menu +5. Click `Submit new issue` button -Creating a Pull Request +Pull Requests --- -Before you can submit a PR, you will need to: +[![Create Pull Request](https://img.shields.io/badge/Github-Create_Pull_Request-blue.svg?style=for-the-badge&logo=github&logoColor=ffffff&logoWidth=16)](https://github.com/sfccdevops/explorer-exclude-vscode-extension/compare) + +### Bug Fix + +> Each Bug Fix reported on GitHub should have its own `fix/*` branch. The branch name should be formatted `fix/###-issue-name` where `###` is the GitHub Issue Number, and `issue-name` is a 1-3 word summary of the issue. + +1. Checkout latest `develop` branch +2. Pull down the latest changes via `git pull` +3. Create a new branch with the structure `fix/*`, e.g. `fix/123-broken-form` +4. When you are ready to submit your code, submit a new Pull Request that merges your code into `develop` +5. Tag your new Pull Request with `Ready for Code Review` + +### Feature Request + +> Each New Feature should reside in its own `feature/` branch. The branch name should be formatted `feature/###-feature-name` where `###` is the GitHub Issue Number, and `feature-name` is a 1-3 word summary of the feature. -1. Make a New Branch off of `master` ( ideally you will name your branch for the issue you are fixing, e,g, `issue-3-fix-menu` ) -2. Commit & Push your New Branch, with a comment like `Fixes #3` to auto trigger a status change for that issue -3. Make your Pull Request -4. Set `Reviewers` and `Assignees` to `Peter Schmalfeldt` ( or other project administrator ) -5. Choose an appropriate label from the `Labels` +1. Checkout latest `develop` branch +2. Pull down the latest changes via `git pull` +3. Create a new branch with the structure `feature/*`, e.g. `feature/123-search-form` +4. When you are ready to submit your code, submit a new Pull Request that merges your code into `develop` +5. Tag your new Pull Request with `Ready for Code Review` diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 4baf30f..0000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,19 +0,0 @@ -#### Overview: - -_( a detailed overview of the problem this ticket will solve and the targeted audience )_ - -#### Acceptance Criteria: - -_( issue will not be considered complete unless this list of criteria is met, e.g. intended usage, expected functionality, specific metrics met, etc. )_ - -#### Steps to Duplicate _( required for bug reports )_: - -_( a step by step guide written for a person who might be looking at this for the first time )_ - -#### System Info _( required for bug reports )_: - -_( e.g. "MacOS 10.14.2 with ZSH terminal" )_ - -#### Relevant Documentation _( optional )_ - -_( e.g. Screenshots, Github Issues, etc )_ diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..8ee726d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,76 @@ +name: Bug Report +description: I would like to Report a Bug +labels: [Bug Report] +assignees: + - manifestinteractive +body: + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true + - type: textarea + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: Extension Output + description: Paste the `Explorer Exclude` Output Log to your ticket. + placeholder: | + 1. Select `View` > `Output` from the Main Menu + 2. Select `Explorer Exclude` from Output Select List + 3. Copy all Output from log and paste in this text field + validations: + required: true + - type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. Go to ... + 2. Click on ... + 3. Scroll down to ... + 4. See error ... + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A concise description of what you expected to happen. + validations: + required: false + - type: textarea + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem. + validations: + required: false + - type: textarea + attributes: + label: Environment + description: | + examples: + - **OS**: Ubuntu 20.04 + - **Node**: 13.14.0 + - **npm**: 7.6.3 + value: | + - OS: + - Node: + - npm: + render: markdown + validations: + required: false + - type: textarea + attributes: + label: Additional Context + description: | + Links? References? Anything that will give us more context about the issue you are encountering! + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..aa97d8e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,36 @@ +name: Feature Request +description: This is a new Feature Request for this project +labels: [Feature Request] +assignees: + - manifestinteractive +body: + - type: textarea + attributes: + label: Describe the Problem + description: Is your feature request related to a problem? Please describe. + placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true + - type: textarea + attributes: + label: Describe the Solution + description: Describe the solution you'd like + placeholder: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Alternatives + description: Describe alternatives you've considered + placeholder: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + - type: textarea + attributes: + label: Additional Context + description: | + Add any other context or screenshots about the feature request here. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 0000000..3562627 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,12 @@ +name: Question +description: I have a Question about this project +labels: [Question] +assignees: + - manifestinteractive +body: + - type: textarea + attributes: + label: Question + description: Please Write your Question Below. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/requested-change.yml b/.github/ISSUE_TEMPLATE/requested-change.yml new file mode 100644 index 0000000..a2dfe5a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/requested-change.yml @@ -0,0 +1,36 @@ +name: Requested Change +description: This is a Requested Change to the project +labels: [Requested Change] +assignees: + - manifestinteractive +body: + - type: textarea + attributes: + label: Describe the Problem + description: Is your requested change related to a problem? Please describe. + placeholder: A clear and concise description of what the request is. + validations: + required: true + - type: textarea + attributes: + label: Describe the Solution + description: Describe the solution you'd like + placeholder: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Alternatives + description: Describe alternatives you've considered + placeholder: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + - type: textarea + attributes: + label: Additional Context + description: | + Add any other context or screenshots about the feature request here. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a1ab10..d1d1a1f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,33 +1,31 @@ -#### What's this PR do? +Overview +--- -_[write_something]_ +TEXT -#### Where should the reviewer start? +Reviewer +--- -_[write_something]_ +> Where should the reviewer start? How to Test? Background Context? etc ( required ) -#### How should this be manually tested? +TEXT -_[write_something]_ +Checklist +--- -#### Any background context you want to provide? +> I have tested each of the following, and they work as expected: ( required ) -_[write_something]_ +- [ ] Meets [Contributing Guide](https://github.com/sfccdevops/explorer-exclude-vscode-extension/blob/develop/.github/CONTRIBUTING.md) Requirements +- [ ] Pulled in the Latest Code from the `develop` branch +- [ ] Works on a Desktop / Laptop Device -#### What are the relevant github issue? +Documentation +--- -_[write_something]_ +> Screenshots, Attachments, Linked GitHub Issues, etc ( optional ) -#### Screenshots (if appropriate) -_[drag_and_drop_here]_ -#### What gif best describes this PR or how it makes you feel? +#### What GIF best describes this PR or how it makes you feel? -_[drag_and_drop_something_fun_here]_ - -#### Definition of Done: - -- [ ] You have actually run this locally and can verify it works -- [ ] You have verified that `npm test` passes without issue -- [ ] You have updated the README file (if appropriate) +> Drag & Drop Something Fun Here ( optional ) diff --git a/.github/workflows/assign-to-project.yml b/.github/workflows/assign-to-project.yml new file mode 100644 index 0000000..d1e284c --- /dev/null +++ b/.github/workflows/assign-to-project.yml @@ -0,0 +1,20 @@ +name: Assign to Project +on: + issues: + types: + - opened + pull_request: + types: + - opened +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +jobs: + assign_to_project: + runs-on: ubuntu-latest + name: Assign to Project + steps: + - name: Check GitHub Event Action + uses: srggrs/assign-one-project-github-action@1.2.0 + if: github.event.action == 'opened' + with: + project: 'https://github.com/sfccdevops/explorer-exclude-vscode-extension/projects/1' diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml new file mode 100644 index 0000000..d006076 --- /dev/null +++ b/.github/workflows/build-test.yml @@ -0,0 +1,21 @@ +name: Build & Test +on: + push: + branches: + - develop + pull_request: + branches: + - develop +jobs: + build_and_test: + name: Build Application and Run Tests + runs-on: ubuntu-latest + steps: + - name: Check out Repository + uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: '14.x' + - run: npm install + - run: npm test diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 0000000..3a0dab3 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,25 @@ +name: Create Release +on: + push: + tags: + - 'v*' +jobs: + release: + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Build Changelog + id: github_release + uses: mikepenz/release-changelog-builder-action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create Release + uses: actions/create-release@v1 + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + body: ${{steps.github_release.outputs.changelog}} + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish-vs-code-extension.yml b/.github/workflows/publish-vs-code-extension.yml new file mode 100644 index 0000000..11991dd --- /dev/null +++ b/.github/workflows/publish-vs-code-extension.yml @@ -0,0 +1,26 @@ +name: Deploy Extension +on: + push: + tags: + - 'v*' +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 + - run: npm ci + # - name: Publish to Open VSX Registry + # uses: HaaLeo/publish-vscode-extension@v1 + # id: publishToOpenVSX + # with: + # pat: ${{ secrets.OPEN_VSX_TOKEN }} + - name: Publish to Visual Studio Marketplace + uses: HaaLeo/publish-vscode-extension@v1 + id: publishToMarketplace + with: + pat: ${{ secrets.VS_MARKETPLACE_TOKEN }} + registryUrl: https://marketplace.visualstudio.com + extensionFile: ${{ steps.publishToOpenVSX.outputs.vsixPath }} diff --git a/.gitignore b/.gitignore index 91d64de..ab765f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -*.vsix +!.nvmrc +.vscode/settings.json *.code-workspace +*.vsix node_modules -.vscode/settings.json \ No newline at end of file +!extension.code-workspace diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..7b16f79 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.19.0 diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..c2e585f --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,12 @@ +.vscode/** +.gitignore +.github +.editorconfig +.eslintrc.js +.gitattributes +.gitignore +.nvmrc +*.vsix +*.code-workspace +DEVELOPERS.md +TROUBLESHOOTING.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 680bdb4..0e2d86f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ Change Log > Here's our record of all notable changes made to to this project +v1.3.0 +--- + +* Added JSON Settings Linter Fix ( Thanks @MatthewTh0 ) +* Updated default null settings to `{}` vs `null` ( Thanks @Himadu2000 ) +* Add ability to not show picker and just directly exclude selected file ( Thanks @rw3iss ) +* Updated Workspace Detection to handle a few more unique use cases + v1.2.0 --- @@ -26,4 +34,4 @@ v1.0.1 v1.0.0 --- -* Initial Release \ No newline at end of file +* Initial Release diff --git a/DEVELOPERS.md b/DEVELOPERS.md new file mode 100644 index 0000000..e1b9bd1 --- /dev/null +++ b/DEVELOPERS.md @@ -0,0 +1,38 @@ +Developer Setup +=== + +Extension Development +--- + +### Downloading Extension + +> To get started developing this extension, you will first need to download the source code: + +```bash +git clone git@github.com:sfccdevops/explorer-exclude-vscode-extension.git +cd explorer-exclude-vscode-extension +npm install +``` + +### Testing Extension + +> To develop this extension in VS Code: + +1. Open File `extension.code-workspace` in VS Code +2. Run `npm install` in VS Code Terminal +3. Press `F5` to launch extension in a new VS Code window + +NOTE: The first time you press `F5` it may launch in an empty workspace. You will likely need to open an SFCC project into this new VS Code window in order to test the extension. + +Multilingual Support +--- + +> Want this extension in another language? Translations for [VS Code Supported Locales](https://code.visualstudio.com/docs/getstarted/locales#_available-locales) can easily be added: + +**To make a Translation:** + +1. Open `package.nls.json` +2. Save as a new file with language code, e.g. `Spanish` would be `package.nls.es.json` +3. Update JSON Values with your custom language +4. Double check everything works +5. Submit a Pull Request with a new translation file diff --git a/README.md b/README.md index 9c6cceb..dd204e1 100755 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ Explorer Exclude - VS Code Extension --- -> Context Menu and Explorer Panel to Manage Showing & Hiding Excluded Files & Folders ( for VS Code version 1.32 or newer ) +> Context Menu and Explorer Panel to Manage Showing & Hiding Excluded Files & Folders ( for VS Code version 1.60 or newer ) -![screenshot](https://explorer-exclude.s3.amazonaws.com/screenshot.png?v=1.2.0) +![screenshot](https://explorer-exclude.s3.amazonaws.com/screenshot.png?v=1.3.0) - [X] Easily Hide Files & Folders from Explorer, Search Results & Quick Open - [X] New Hidden Items Explorer Pane to Manage Hidden Items @@ -13,7 +13,6 @@ Explorer Exclude - VS Code Extension - [X] Quickly Toggle Visibility of Hidden Items - [X] Translations for [VS Code Supported Locales](https://code.visualstudio.com/docs/getstarted/locales#_available-locales): _( English, Simplified Chinese, Traditional Chinese, French, German, Italian, Spanish, Japanese, Korean, Russian, Bulgarian, Hungarian, Portuguese & Turkish )_ - Usage --- @@ -21,11 +20,11 @@ Usage Right-click on any File or Folder in Explorer List to Hide Items -![explorer](https://explorer-exclude.s3.amazonaws.com/explorer.gif?v=1.2.0) +![explorer](https://explorer-exclude.s3.amazonaws.com/explorer.gif?v=1.3.0) Select Filter Options you wish to Hide Files & Folders -![picker](https://explorer-exclude.s3.amazonaws.com/picker.gif?v=1.2.0) +![picker](https://explorer-exclude.s3.amazonaws.com/picker.gif?v=1.3.0) You can disable the filter option popup, and by default only allow the selected item to be hidden, by adding this setting in VSCode: @@ -39,5 +38,22 @@ New `HIDDEN ITEMS` Explorer Pane to Manage Hidden Files: * Right-click an item to view Context Menu where you can Permanently Remove item * Use Hidden Items Menu to manage multiple items at once -![view-pane](https://explorer-exclude.s3.amazonaws.com/view-pane.gif?v=1.2.0) -![pane-menu](https://explorer-exclude.s3.amazonaws.com/pane-menu.gif?v=1.2.0) +![view-pane](https://explorer-exclude.s3.amazonaws.com/view-pane.gif?v=1.3.0) +![pane-menu](https://explorer-exclude.s3.amazonaws.com/pane-menu.gif?v=1.3.0) + +Need Help? +--- + +> Check out or Troubleshooting Page for help with any known issues or report new ones. + +[![Create Issue](https://img.shields.io/badge/Get_Help-Troubleshooting-red.svg?style=for-the-badge&logo=github&logoColor=ffffff&logoWidth=16)](https://github.com/sfccdevops/explorer-exclude-vscode-extension/blob/develop/TROUBLESHOOTING.md) + +About the Author +--- + +> [Peter Schmalfeldt](https://peterschmalfeldt.com/) is a Certified Senior Salesforce Commerce Cloud Developer with over 20 years of experience building eCommerce websites, providing everything you need to design, develop & deploy eCommerce applications for Web, Mobile & Desktop platforms. + +Disclaimer +--- + +> The trademarks and product names of Salesforce®, including the mark Salesforce®, are the property of Salesforce.com. SFCC DevOps is not affiliated with Salesforce.com, nor does Salesforce.com sponsor or endorse the SFCC DevOps products or website. The use of the Salesforce® trademark on this project does not indicate an endorsement, recommendation, or business relationship between Salesforce.com and SFCC DevOps. diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md index 4d5f54e..1131b45 100644 --- a/TROUBLESHOOTING.md +++ b/TROUBLESHOOTING.md @@ -9,9 +9,26 @@ Troubleshooting If you are getting an error like this one: ``` -Unable to install Extension 'sfccdevops.explorer-exclude-vscode-extension-1.1.0' as it is not compatible with Code '1.26.0'. +Unable to install Extension 'sfccdevops.explorer-exclude-vscode-extension-1.3.0' as it is not compatible with Code '1.26.0'. ``` It is because you downloaded the Extension from the VS Code Marketplace Website manually ( and not through VS Code's internal extension listing ) and tried to install it into an older, unsupported version of VS Code. -This extension requires VS Code v1.32 or newer. If you would like to install this extension, you will need to [update VS Code](https://code.visualstudio.com/download) to version v1.32 or newer. +This extension requires VS Code v1.60 or newer. If you would like to install this extension, you will need to [update VS Code](https://code.visualstudio.com/download) to version v1.60 or newer. + +Need Help? +=== + +> Did not find what you are looking for? Check out our current reported issues to see if someone else is having the same problem. + +[![Create Issue](https://img.shields.io/badge/Get_Help-View_Issues-blue.svg?style=for-the-badge&logo=github&logoColor=ffffff&logoWidth=16)](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues) + +> Still did not find what you were looking for? + +[![Create Issue](https://img.shields.io/badge/Get_Help-Submit_Issue-red.svg?style=for-the-badge&logo=github&logoColor=ffffff&logoWidth=16)](https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues/new/choose) + +**NOTE**: If you're reporting a new bug, add our `Explorer Exclude` Output Log to your ticket. You can access this log at anytime to see output generated by our extension: + +1. Select `View` > `Output` from the Main Menu +2. Select `Explorer Exclude` from Output Select List +3. Copy all Output from log and paste it in the `Extension Output` section of the ticket diff --git a/extension.code-workspace b/extension.code-workspace new file mode 100644 index 0000000..9ac8fa7 --- /dev/null +++ b/extension.code-workspace @@ -0,0 +1,16 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "cSpell.words": [ + "mikepenz", + "sfccdevops", + "srggrs", + "viewpane", + "vsix" + ] + } +} diff --git a/extension.js b/extension.js deleted file mode 100755 index 376050e..0000000 --- a/extension.js +++ /dev/null @@ -1,120 +0,0 @@ -const vscode = require('vscode'); -const { init, localize } = require('vscode-nls-i18n'); - -const util = require('./util'); -const ViewPane = require('./viewpane'); -const WelcomePane = require('./welcome'); - -function activate(context) { - init(context); - - const timeout = 25; - const pane = new ViewPane('explorerExclude.pane.items'); - - /* Get Extension Version Info */ - const currentVersion = context.globalState.get('explorer-exclude.version'); - const packageVersion = vscode.extensions.getExtension('SFCCDevOps.explorer-exclude-vscode-extension').packageJSON.version; - - /* Initialize Hidden Items Pane */ - pane.update(util.getExcludes()); - - /* Save Extension Context for later use */ - util.saveContext(context); - - /* Set Initial State of Extension */ - vscode.commands.executeCommand('setContext', 'explorerExclude:enabled', true); - - /* Check if there was a recent change to installed version */ - if (currentVersion !== packageVersion) { - context.globalState.update('explorer-exclude.version', packageVersion); - - const welcome = new WelcomePane(); - welcome.show(); - } - - const exclude = vscode.commands.registerCommand('explorer-exclude.exclude', (uri) => { - util.vscExclude(uri, function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const remove = vscode.commands.registerCommand('explorer-exclude.remove', (uri) => { - util.vscRemove(uri, function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const toggle = vscode.commands.registerCommand('explorer-exclude.toggle', (uri) => { - util.vscToggle(uri, function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const toggleAllOff = vscode.commands.registerCommand('explorer-exclude.toggleAllOff', () => { - util.vscToggleAll(function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const toggleAllOn = vscode.commands.registerCommand('explorer-exclude.toggleAllOn', () => { - util.vscToggleAll(function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const disableAll = vscode.commands.registerCommand('explorer-exclude.disableAll', () => { - util.vscDisableAll(function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const enableAll = vscode.commands.registerCommand('explorer-exclude.enableAll', () => { - util.vscEnableAll(function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - }); - - const reset = vscode.commands.registerCommand('explorer-exclude.reset',async () => { - const value = await vscode.window.showInputBox({ - prompt: localize('reset.prompt') - }); - - if (typeof value !== 'undefined') { - util.vscReset(function() { - setTimeout(function(){ - pane.update(util.getExcludes()); - }, timeout); - }); - } - }); - - context.subscriptions.push(exclude); - context.subscriptions.push(remove); - context.subscriptions.push(toggle); - context.subscriptions.push(toggleAllOff); - context.subscriptions.push(toggleAllOn); - context.subscriptions.push(disableAll); - context.subscriptions.push(enableAll); - context.subscriptions.push(reset); -} - -function deactivate() {} - -module.exports = { - activate, - deactivate -} diff --git a/extension/index.js b/extension/index.js new file mode 100755 index 0000000..5d70367 --- /dev/null +++ b/extension/index.js @@ -0,0 +1,154 @@ +'use strict' + +const vscode = require('vscode') +const { init, localize } = require('vscode-nls-i18n') + +const util = require('./util') +const ViewPane = require('./viewpane') +const WelcomePane = require('./welcome') + +/** + * Handle Activating Extension + * @param {*} context + */ +function activate(context) { + // Initialize Localization + init(context.extensionPath) + + const timeout = 25 + const pane = new ViewPane('explorerExclude.pane.items') + + // Get Extension Version Info + const currentVersion = context.globalState.get('explorer-exclude.version') + const packageVersion = vscode.extensions.getExtension('SFCCDevOps.explorer-exclude-vscode-extension').packageJSON.version + + // Check if there was a recent change to installed version + if (currentVersion !== packageVersion) { + // Update version number so we don't show this again until next update + context.globalState.update('explorer-exclude.version', packageVersion) + + // Show Welcome Modal since this is a new version or install + const welcome = new WelcomePane() + welcome.show() + } + + const disableAll = vscode.commands.registerCommand('explorer-exclude.disableAll', () => { + util.logger('Disable All Excludes', 'debug') + util.disableAll(function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + const enableAll = vscode.commands.registerCommand('explorer-exclude.enableAll', () => { + util.logger('Enable All Excludes', 'debug') + util.enableAll(function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + const exclude = vscode.commands.registerCommand('explorer-exclude.exclude', (uri) => { + util.exclude(uri, function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + const openSettings = vscode.commands.registerCommand('explorer-exclude.openSettings', () => { + util.logger('Opening Explorer Exclude Settings', 'debug') + vscode.commands.executeCommand('workbench.action.openSettings', 'explorerExclude.') + setTimeout(function () { + vscode.commands.executeCommand('workbench.action.openWorkspaceSettings') + }, 1000) + }) + + const remove = vscode.commands.registerCommand('explorer-exclude.remove', (uri) => { + util.logger(`Remove: ${uri}`, 'debug') + if (uri && uri.value) { + const value = uri.value + const key = value.substring(0, value.length - 2) + + util.deleteExclude(key, function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + } + }) + + const reset = vscode.commands.registerCommand('explorer-exclude.reset', async () => { + const value = await vscode.window.showInputBox({ + prompt: localize('reset.prompt'), + }) + + if (typeof value !== 'undefined') { + util.logger('Reset Explorer Exclude', 'debug') + + util.reset(function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + } + }) + + const toggle = vscode.commands.registerCommand('explorer-exclude.toggle', (uri) => { + util.toggleExclude(uri, function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + const toggleAllOff = vscode.commands.registerCommand('explorer-exclude.toggleAllOff', () => { + util.logger('Toggle All Excludes: OFF', 'debug') + util.toggleAll(function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + const toggleAllOn = vscode.commands.registerCommand('explorer-exclude.toggleAllOn', () => { + util.logger('Toggle All Excludes: ON', 'debug') + util.toggleAll(function () { + setTimeout(function () { + pane.update(util.getExcludes()) + }, timeout) + }) + }) + + // Set Initial State of Extension + vscode.commands.executeCommand('setContext', 'explorer-exclude.enabled', true) + + // Save Extension Context for later use + util.saveContext(context) + + // Initialize Hidden Items Pane + pane.update(util.getExcludes()) + + // Update VS Code Extension Subscriptions + context.subscriptions.push(disableAll) + context.subscriptions.push(enableAll) + context.subscriptions.push(exclude) + context.subscriptions.push(openSettings) + context.subscriptions.push(remove) + context.subscriptions.push(reset) + context.subscriptions.push(toggle) + context.subscriptions.push(toggleAllOff) + context.subscriptions.push(toggleAllOn) +} + +/** + * Handle Deactivating Extension + */ +function deactivate() {} + +module.exports = { + activate, + deactivate, +} diff --git a/resources/dark/checked.svg b/extension/resources/dark/checked.svg similarity index 100% rename from resources/dark/checked.svg rename to extension/resources/dark/checked.svg diff --git a/resources/dark/reset.svg b/extension/resources/dark/reset.svg similarity index 100% rename from resources/dark/reset.svg rename to extension/resources/dark/reset.svg diff --git a/extension/resources/dark/settings.svg b/extension/resources/dark/settings.svg new file mode 100644 index 0000000..57e1b5e --- /dev/null +++ b/extension/resources/dark/settings.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/dark/toggle-off.svg b/extension/resources/dark/toggle-off.svg similarity index 100% rename from resources/dark/toggle-off.svg rename to extension/resources/dark/toggle-off.svg diff --git a/resources/dark/toggle-on.svg b/extension/resources/dark/toggle-on.svg similarity index 100% rename from resources/dark/toggle-on.svg rename to extension/resources/dark/toggle-on.svg diff --git a/resources/dark/unchecked.svg b/extension/resources/dark/unchecked.svg similarity index 100% rename from resources/dark/unchecked.svg rename to extension/resources/dark/unchecked.svg diff --git a/resources/icon.png b/extension/resources/icon.png similarity index 100% rename from resources/icon.png rename to extension/resources/icon.png diff --git a/resources/light/checked.svg b/extension/resources/light/checked.svg similarity index 100% rename from resources/light/checked.svg rename to extension/resources/light/checked.svg diff --git a/resources/light/reset.svg b/extension/resources/light/reset.svg similarity index 100% rename from resources/light/reset.svg rename to extension/resources/light/reset.svg diff --git a/extension/resources/light/settings.svg b/extension/resources/light/settings.svg new file mode 100644 index 0000000..57e1b5e --- /dev/null +++ b/extension/resources/light/settings.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/light/toggle-off.svg b/extension/resources/light/toggle-off.svg similarity index 100% rename from resources/light/toggle-off.svg rename to extension/resources/light/toggle-off.svg diff --git a/resources/light/toggle-on.svg b/extension/resources/light/toggle-on.svg similarity index 100% rename from resources/light/toggle-on.svg rename to extension/resources/light/toggle-on.svg diff --git a/resources/light/unchecked.svg b/extension/resources/light/unchecked.svg similarity index 100% rename from resources/light/unchecked.svg rename to extension/resources/light/unchecked.svg diff --git a/resources/welcome.html b/extension/resources/welcome.html similarity index 100% rename from resources/welcome.html rename to extension/resources/welcome.html diff --git a/extension/util.js b/extension/util.js new file mode 100755 index 0000000..b5270a1 --- /dev/null +++ b/extension/util.js @@ -0,0 +1,530 @@ +'use strict' + +const fs = require('fs') +const path = require('path') +const util = require('util') +const vscode = require('vscode') + +const { init, localize } = require('vscode-nls-i18n') + +// Create custom Output Channel to Log Helpful Messages +const output = vscode.window.createOutputChannel('Explorer Exclude') + +// Setup Workspace Variables +let workspace = vscode.workspace.rootPath +let context = null + +/** + * Custom Await Method for Processing Hidden File Config + */ +const _await = + (this && this._await) || + function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)) + } catch (err) { + reject(err) + } + } + function rejected(value) { + try { + step(generator['throw'](value)) + } catch (err) { + reject(err) + } + } + function step(result) { + result.done + ? resolve(result.value) + : new P(function (resolve) { + resolve(result.value) + }).then(fulfilled, rejected) + } + step((generator = generator.apply(thisArg, _arguments || [])).next()) + }) + } + +/** + * Get VS Code Workspace Base + * @param {*} context + * @returns + */ +const getWorkspace = (context) => { + // Initialize Localization + init(context.extensionPath) + + let root + let workspace + + // Check for missing VS Code Workspace, if present, otherwise use context path + if (context && !vscode.workspace && !vscode.workspace.workspaceFolders) { + workspace = vscode.workspace.rootPath ? vscode.workspace.rootPath : path.dirname(context.fsPath) + } else { + // We have a Workspace, now let's figure out if it's single or multiroot + if (vscode.workspace && vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length === 1) { + // There was only one Workspace, so we can just use it + root = vscode.workspace.workspaceFolders[0] + workspace = root && root.uri ? root.uri.fsPath : null + } else if (vscode.workspace && vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1) { + // There is more than one Workspace, so let's grab the active one + if (vscode.window.activeTextEditor) { + // Since there is a file active, let's find the workspace from that file + root = vscode.workspace.workspaceFolders.find((wsFolder) => { + const relative = path.relative(wsFolder.uri.fsPath, vscode.window.activeTextEditor.document.uri.path) + return relative && !relative.startsWith('..') && !path.isAbsolute(relative) + }) + workspace = root && root.uri ? root.uri.fsPath : null + } else { + // No file was open, so just grab the first available workspace + root = vscode.workspace.workspaceFolders[0] + workspace = root && root.uri ? root.uri.fsPath : null + } + } else if (context && vscode.workspace) { + // Something else is going on, let's see if we can still figure it out + try { + root = vscode.workspace.getWorkspaceFolder(context) + workspace = root && root.uri ? root.uri.fsPath : null + } catch (err) { + logger(localize('debug.logger.error', 'getWorkspace:fetch', err.toString()), 'error') + } + } + } + + // If we did not get Workspace, let the user know + if (!workspace) { + const message = localize('debug.logger.missingWorkspace') + logger(localize('debug.logger.error', 'getWorkspace', message), 'error') + vscode.window.showErrorMessage(`${localize('extension.title')}: ${message}`) + } + + // Debug Cartridge Path + logger(localize('debug.logger.workspace', workspace)) + + return workspace +} + +/** + * Check if Path Exists + * @param {string} _path + */ +const ifExists = (_path) => { + if (isUnavailable(_path)) { + return Promise.reject(new Error(localize('error.ifExists', _path))) + } + return new Promise((res, rej) => { + fs.access(_path, (error) => { + if (util.isNullOrUndefined(error)) { + res(true) + } else { + rej(error) + } + }) + }) +} + +/** + * Check if path is defined + * @param {string} _path + */ +const isUnavailable = (_path) => { + return util.isNullOrUndefined(_path) || _path === '' +} + +/** + * Parse File Path + * @param {string} _file + * @param {string} _root + */ +const parseFilePath = (_file, _root = '') => { + return _await(this, void 0, void 0, function* () { + if (isUnavailable(_file)) { + return Promise.reject(new Error(localize('error.parseFilePath', _file))) + } + + try { + yield ifExists(_file) + + const ext = path.extname(_file) + const base = path.basename(_file) + const dir = path.relative(_root, path.dirname(_file)) + + return { + path: _file, + ext, + base, + dir, + } + } catch (err) { + logger(localize('debug.logger.error', 'parseFilePath', err.toString()), 'error') + return Promise.reject(err) + } + }) +} + +/** + * Show Item Select Menu + * @param {array} items + */ +const showPicker = (items) => { + return vscode.window.showQuickPick(items, { + placeHolder: localize('picker.placeholder'), + canPickMany: true, + }) +} + +/** + * Write Exclude Updates to Config File + * @param {object} excludes + * @param {function} callback + * @param {string} message + */ +const updateConfig = (excludes, callback, message) => { + try { + vscode.commands.executeCommand('setContext', 'explorer-exclude.enabled', true) + + // Update Main VS Code File Exclude + vscode.workspace + .getConfiguration() + .update('files.exclude', excludes, vscode.ConfigurationTarget.Workspace) + .then(() => { + // Remove Backup since we made a manual change + vscode.workspace + .getConfiguration() + .update('explorerExclude.backup', {}, vscode.ConfigurationTarget.Workspace) + .then(() => { + if (message) { + vscode.window.showInformationMessage(message) + } + + if (typeof callback === 'function') { + callback() + } + }) + }) + } catch (err) { + logger(localize('debug.logger.error', 'updateConfig', err.toString()), 'error') + vscode.window.showErrorMessage(err.message || err) + } +} + +/** + * Delete Key from Exclude Config + * @param {string} key + * @param {function} callback + */ +function deleteExclude(key, callback) { + if (!key) { + return false + } + + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + // Remove if already set + if (key && Object.prototype.hasOwnProperty.call(excludes, key)) { + const newExcludes = Object.keys(excludes) + .filter((k) => k !== key) + .reduce((obj, k) => { + obj[k] = excludes[k] + return obj + }, {}) + updateConfig(newExcludes, callback, localize('config.removedKey', key)) + } +} + +/** + * Disable All + * @param {function} callback + */ +function disableAll(callback) { + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + for (let key in excludes) { + if (Object.prototype.hasOwnProperty.call(excludes, key)) { + excludes[key] = false + } + } + + updateConfig(excludes, callback) +} + +/** + * Enable All + * @param {function} callback + */ +function enableAll(callback) { + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + for (let key in excludes) { + if (Object.prototype.hasOwnProperty.call(excludes, key)) { + excludes[key] = true + } + } + + updateConfig(excludes, callback) +} + +/** + * VS Code Action - Handle Mapping URI Exclusion to possible Regex Pattern Matches + * @param {string} uri + * @param {function} callback + */ +function exclude(uri, callback) { + return _await(this, void 0, void 0, function* () { + try { + const _path = uri.fsPath + const _root = workspace + const _meta = yield parseFilePath(_path, _root) + + let selections + let options = [] + + let _showPicker = vscode.workspace.getConfiguration().get('explorerExclude.showPicker', vscode.ConfigurationTarget.Workspace) + if (typeof _showPicker == 'undefined') { + _showPicker = true + } + + logger(`Using Picker: ${_showPicker ? 'YES' : 'NO'}`, 'debug') + + if (_showPicker) { + Object.keys(_meta).forEach((key) => { + let regex = undefined + switch (key) { + case 'path': + break + case 'ext': + regex = _meta[key] ? `**${path.sep}*${_meta[key]}` : undefined + break + case 'base': + regex = _meta[key] + break + case 'dir': + if (_showPicker) regex = _meta[key] ? `${_meta[key] + path.sep}*.*` : undefined + break + } + if (regex) { + options.push(regex) + } + }) + + if (_meta['dir'] && _meta['ext']) { + options.push(`${_meta['dir']}${path.sep}*${_meta['ext']}`) + } else if (_meta['ext']) { + options.push(`*${_meta['ext']}`) + } + + if (_meta['base']) { + options.push(`**${path.sep}${_meta['base']}`) + if (_meta['dir']) { + options.push(`${_meta['dir']}${path.sep}${_meta['base']}`) + } + } + + selections = yield showPicker(options.reverse()) + } else { + selections = [path.relative(_root, uri.fsPath)] + } + + if (selections && selections.length > 0) { + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + logger('Current Excludes:', 'debug') + logger(excludes) + + logger('Adding Exclude:', 'debug') + logger(selections) + + try { + const newExcludes = Object.assign({}, excludes) + Array.from(new Set(selections)) + .filter((v) => v !== '*') + .forEach((rule) => { + newExcludes[rule] = true + }) + updateConfig(newExcludes, callback) + } catch (err) { + logger(localize('debug.logger.error', 'exclude:update', err.toString()), 'error') + vscode.window.showErrorMessage(err.message || err) + } + } + } catch (err) { + logger(localize('debug.logger.error', 'exclude', err.toString()), 'error') + vscode.window.showErrorMessage(err.message || err) + } + }) +} + +/** + * Get Excluded Fils + */ +function getExcludes() { + if (!workspace || workspace === '') { + return [] + } + + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + let list = excludes ? Object.keys(excludes) : [] + + for (let i = 0; i < list.length; i++) { + let enabled = excludes[list[i]] ? 1 : 0 + list[i] = `${list[i]}|${enabled}` + } + + return list +} + +/** + * Get Resource Path + * @param {string} file + * @param {string} theme + */ +function getResourcePath(file, theme) { + return theme ? context.asAbsolutePath(path.join('extension', 'resources', theme, file)) : context.asAbsolutePath(path.join('extension', 'resources', file)) +} + +/** + * Get Root Path + * @param {string} file + */ +function getRootPath(file) { + return context.asAbsolutePath(file) +} + +/** + * Log output to "SFCC Cartridge Overrides" Output Terminal + * @param {String} message Debug Message + * @param {String} type Debug Type + */ +function logger(message, type) { + let icon = '' + + // Convert message to String if it was not already + if (typeof message !== 'string') { + message = JSON.stringify(message, null, 2) + } + + // Prefix Logger Messages with Icons + if (type === 'debug') { + icon = '› ' + } else if (type === 'error') { + icon = '✖ ' + } else if (type === 'success') { + icon = '✔ ' + } else if (type === 'warn') { + icon = '⚠ ' + } + + // Write Output to Terminal + output.appendLine(`${icon}${message}`) +} + +/** + * Reset All + * @param {function} callback + */ +function reset(callback) { + updateConfig( + { + '**/.git': true, + '**/.svn': true, + '**/.hg': true, + '**/CVS': true, + '**/.DS_Store': true, + '**/Thumbs.db': true, + '**/*.git': true, + }, + callback + ) +} + +/** + * Save VS Code Context for Pane Reference + * @param {object} _context + */ +function saveContext(_context) { + context = _context + workspace = getWorkspace(_context) +} + +/** + * Toggle All Excludes + * @param {Function} callback Callback Command + */ +function toggleAll(callback) { + try { + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) + const backup = vscode.workspace.getConfiguration().get('explorerExclude.backup', vscode.ConfigurationTarget.Workspace) + const restore = JSON.stringify(backup) !== '{}' + + let newExcludes = Object.assign({}, excludes) + + if (!newExcludes) { + newExcludes = {} + } + + for (let key in newExcludes) { + if (Object.prototype.hasOwnProperty.call(newExcludes, key)) { + newExcludes[key] = false + } + } + + const newBackup = restore ? {} : excludes + const newExclude = restore ? backup : newExcludes + + vscode.commands.executeCommand('setContext', 'explorer-exclude.enabled', restore) + + vscode.workspace + .getConfiguration() + .update('files.exclude', newExclude, vscode.ConfigurationTarget.Workspace) + .then(() => { + vscode.workspace + .getConfiguration() + .update('explorerExclude.backup', newBackup, vscode.ConfigurationTarget.Workspace) + .then(() => { + if (typeof callback === 'function') { + callback() + } + }) + }) + } catch (err) { + logger(localize('debug.logger.error', 'toggleAll', err.toString()), 'error') + vscode.window.showErrorMessage(err.message || err) + } +} + +/** + * Toggle Visibility of Excluded Pattern + * @param {string} key + * @param {function} callback + */ +function toggleExclude(key, callback) { + if (!key) { + return false + } + + const excludes = vscode.workspace.getConfiguration().get('files.exclude', vscode.ConfigurationTarget.Workspace) || {} + + // Invert Selection + if (key && Object.prototype.hasOwnProperty.call(excludes, key)) { + logger(`Toggle: ${excludes[key] ? 'OFF' : 'ON'} | ${key}`, 'debug') + excludes[key] = !excludes[key] + updateConfig(excludes, callback) + } +} + +module.exports = { + deleteExclude, + disableAll, + enableAll, + exclude, + getExcludes, + getResourcePath, + getRootPath, + logger, + reset, + saveContext, + toggleAll, + toggleExclude, +} diff --git a/extension/viewpane.js b/extension/viewpane.js new file mode 100644 index 0000000..fe80bcf --- /dev/null +++ b/extension/viewpane.js @@ -0,0 +1,66 @@ +const jsonc_parser = require('jsonc-parser') +const vscode = require('vscode') + +const { localize } = require('vscode-nls-i18n') + +const util = require('./util') + +class ViewPane { + constructor(viewPaneName) { + this.defaultExclude = ['**/.git', '**/.svn', '**/.hg', '**/CVS', '**/.DS_Store', '**/Thumbs.db', '**/*.git'] + this.viewUpdatedEventEmitter = new vscode.EventEmitter() + this.onDidChangeTreeData = this.viewUpdatedEventEmitter.event + this.tree = { + type: 'object', + offset: 0, + length: 0, + children: [], + } + this.register(viewPaneName) + this.registerEvents() + } + + register(name = '') { + vscode.window.registerTreeDataProvider(name, this) + } + + registerEvents() { + this.onDidChangeTreeData(() => {}) + } + + update(list) { + let treeString = JSON.stringify(list) + this.tree = jsonc_parser.parseTree(treeString) + this.viewUpdatedEventEmitter.fire() + } + + getChildren() { + return Promise.resolve(this.tree.children) + } + + getTreeItem(node) { + const value = node.value + const enabled = parseInt(value[value.length - 1]) + const title = value.substring(0, value.length - 2) + const icon = enabled ? 'checked.svg' : 'unchecked.svg' + + let treeItem = new vscode.TreeItem(title, vscode.TreeItemCollapsibleState.None) + + treeItem.iconPath = { + light: util.getResourcePath(icon, 'light'), + dark: util.getResourcePath(icon, 'dark'), + } + treeItem.contextValue = title + treeItem.tooltip = enabled ? localize('tooltip.show', title) : localize('tooltip.hide', title) + treeItem.description = this.defaultExclude.indexOf(title) > -1 ? 'system' : '' + treeItem.command = { + command: 'explorer-exclude.toggle', + title: title, + arguments: [title], + } + + return treeItem + } +} + +module.exports = ViewPane diff --git a/extension/welcome.js b/extension/welcome.js new file mode 100644 index 0000000..fff2c83 --- /dev/null +++ b/extension/welcome.js @@ -0,0 +1,32 @@ +const vscode = require('vscode') +const fs = require('fs') +const marked = require('marked') + +const util = require('./util') + +class WelcomePane { + constructor() {} + + show() { + fs.readFile(util.getResourcePath('welcome.html'), function (err, html) { + if (!err) { + const panel = vscode.window.createWebviewPanel('explorerExclude', 'welcome', vscode.ViewColumn.One, {}) + + const README = fs.readFileSync(util.getRootPath('README.md'), 'utf8') + const CHANGELOG = fs.readFileSync(util.getRootPath('CHANGELOG.md'), 'utf8') + const TROUBLESHOOTING = fs.readFileSync(util.getRootPath('TROUBLESHOOTING.md'), 'utf8') + + let welcomePage = html.toString() + + welcomePage = welcomePage.replace('{{README}}', marked(README)) + welcomePage = welcomePage.replace('{{CHANGELOG}}', marked(CHANGELOG)) + welcomePage = welcomePage.replace('{{TROUBLESHOOTING}}', marked(TROUBLESHOOTING)) + + panel.title = 'Explorer Exclude Welcome' + panel.webview.html = welcomePage + } + }) + } +} + +module.exports = WelcomePane diff --git a/package-lock.json b/package-lock.json index 7a29529..4390d7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,305 @@ { - "name": "explorer-exclude-vscode-extension", - "version": "1.2.0", + "name": "explorer-exclude", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/generator": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "dev": true, + "requires": { + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", + "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", + "dev": true + }, + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/traverse": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", + "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", + "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "globals": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ajv": { @@ -25,54 +314,70 @@ "uri-js": "^4.2.2" } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -83,37 +388,93 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" } }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "concat-map": { @@ -122,128 +483,390 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "ms": "2.0.0" + "esutils": "^2.0.2" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "globals": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "prettier-linter-helpers": "^1.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "to-regex-range": "^5.0.1" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true }, "glob": { "version": "7.1.4", @@ -259,70 +882,63 @@ "path-is-absolute": "^1.0.0" } }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - } + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -340,28 +956,73 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-schema-traverse": { @@ -370,49 +1031,279 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "jsonc-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.1.0.tgz", - "integrity": "sha512-n9GrT8rrr2fhvBbANa1g+xFmgGK5X91KFeDwlKQ3+SJfmH5+tKv/M/kahx/TXOMflfWHKGKqKyfHQaLKTNzJ6w==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, + "lint-staged": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", + "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "dev": true, + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.17", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" + }, + "dependencies": { + "commander": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", + "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } } }, "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==" + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.18.tgz", + "integrity": "sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==" }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "mime-db": "1.40.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -422,65 +1313,39 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "path-key": "^4.0.0" }, "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "once": { @@ -492,238 +1357,419 @@ "wrappy": "1" } }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "tslib": "^2.1.0" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "shebang-regex": "^3.0.0" } }, - "subdir": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/subdir/-/subdir-0.0.3.tgz", - "integrity": "sha1-2afT+MIhoNlRscoc/PWjFH3D4aE=" + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + } } }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "ansi-regex": "^5.0.1" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "is-number": "^7.0.0" } }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "prelude-ls": "^1.2.1" } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "punycode": "^2.1.0" } }, - "vscode": { - "version": "1.1.34", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.34.tgz", - "integrity": "sha512-GuT3tCT2N5Qp26VG4C+iGmWMgg/MuqtY5G5TSOT3U/X6pgjM9LFulJEeqpyf6gdzpI4VyU3ZN/lWPo54UFPuQg==", + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vscode-nls-i18n": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vscode-nls-i18n/-/vscode-nls-i18n-0.2.4.tgz", + "integrity": "sha512-1gf+s5qznJ6d5e5FavJ/sjzx/VdRMtZcVc8bjKo32mQPqAx+Bzgm0ur46/el1vAO4UGmCMQjlH8sHQdjEln7zQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "glob": "^7.1.2", - "mocha": "^4.0.1", - "request": "^2.88.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "url-parse": "^1.4.4", - "vscode-test": "^0.4.1" + "isexe": "^2.0.0" } }, - "vscode-nls-i18n": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-nls-i18n/-/vscode-nls-i18n-0.1.1.tgz", - "integrity": "sha512-LYXU+71VqlwWCyQ494CzYkqsMlkCUseoaH0tzg0mz2Poa4ojQhsxjji8FAg26R7wlH479OIBRJrGEXNwN2GVOw==" + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, - "vscode-test": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.2.tgz", - "integrity": "sha512-ZqSh1WNQ1It3SVLnuDMS3HmadM86k2dXvv4ZtdT6+ezxZ1NIQRTbE5SZroV0EvIf5KGjhYNbj5HHqUjBsGjV6Q==", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "wrappy": { @@ -731,6 +1777,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true } } } diff --git a/package.json b/package.json index 5da7601..319d186 100755 --- a/package.json +++ b/package.json @@ -1,14 +1,15 @@ { - "name": "explorer-exclude-vscode-extension", + "name": "explorer-exclude", "displayName": "Explorer Exclude", - "version": "1.2.0", + "version": "1.3.0", "description": "Explorer Exclude lets you easily Hide Files & Folders with Dynamic Filter Options. Add a New 'Hidden Items' Explorer Pane for you to Manage and Quickly Toggle Visibility of Hidden Items.", "license": "MIT", - "publisher": "SFCCDevOps", + "publisher": "PeterSchmalfeldt", "categories": [ "Other" ], - "icon": "resources/icon.png", + "main": "extension/index.js", + "icon": "extension/resources/icon.png", "galleryBanner": { "color": "#1c1c1c", "theme": "dark" @@ -21,7 +22,8 @@ "url": "https://github.com/sfccdevops/explorer-exclude-vscode-extension/issues" }, "engines": { - "vscode": "^1.32.0" + "vscode": "^1.60.0", + "node": "^14.19.0" }, "keywords": [ "context-menu", @@ -45,8 +47,9 @@ } ], "activationEvents": [ - "*", + "onStartupFinished", "onView:extension", + "onCommand:explorer-exclude.enabled", "onCommand:explorer-exclude.exclude", "onCommand:explorer-exclude.remove", "onCommand:explorer-exclude.toggle", @@ -56,18 +59,28 @@ "onCommand:explorer-exclude.enableAll", "onCommand:explorer-exclude.reset" ], - "main": "./extension", "contributes": { "configuration": [ { - "title": "%package.pane%", + "title": "%extension.title%", "properties": { "explorerExclude.backup": { - "type": ["object","null"], - "default": {}, - "description": "Resource configuration: Configure files using glob patterns to have an empty last line always", - "scope": "resource" - } + "order": 1, + "type": [ + "object", + "null" + ], + "default": {}, + "description": "%config.properties.backup%", + "scope": "window" + }, + "explorerExclude.showPicker": { + "order": 2, + "type": "boolean", + "default": true, + "description": "%config.properties.showPicker%", + "scope": "window" + } } } ], @@ -97,8 +110,8 @@ "title": "%package.toggle%", "category": "ExplorerExclude", "icon": { - "dark": "resources/dark/toggle-on.svg", - "light": "resources/light/toggle-on.svg" + "dark": "extension/resources/dark/toggle-on.svg", + "light": "extension/resources/light/toggle-on.svg" } }, { @@ -106,8 +119,8 @@ "title": "%package.toggle%", "category": "ExplorerExclude", "icon": { - "dark": "resources/dark/toggle-off.svg", - "light": "resources/light/toggle-off.svg" + "dark": "extension/resources/dark/toggle-off.svg", + "light": "extension/resources/light/toggle-off.svg" } }, { @@ -115,8 +128,8 @@ "title": "%package.disableAll%", "category": "ExplorerExclude", "icon": { - "dark": "resources/dark/unchecked.svg", - "light": "resources/light/unchecked.svg" + "dark": "extension/resources/dark/unchecked.svg", + "light": "extension/resources/light/unchecked.svg" } }, { @@ -124,8 +137,8 @@ "title": "%package.enableAll%", "category": "ExplorerExclude", "icon": { - "dark": "resources/dark/checked.svg", - "light": "resources/light/checked.svg" + "dark": "extension/resources/dark/checked.svg", + "light": "extension/resources/light/checked.svg" } }, { @@ -133,8 +146,17 @@ "title": "%package.reset%", "category": "ExplorerExclude", "icon": { - "dark": "resources/dark/reset.svg", - "light": "resources/light/reset.svg" + "dark": "extension/resources/dark/reset.svg", + "light": "extension/resources/light/reset.svg" + } + }, + { + "command": "explorer-exclude.openSettings", + "title": "%command.openSettings.title%", + "category": "ExplorerExclude", + "icon": { + "dark": "extension/resources/dark/settings.svg", + "light": "extension/resources/light/settings.svg" } } ], @@ -150,20 +172,10 @@ { "command": "explorer-exclude.remove", "group": "explorer-exclude@1", - "when": "view == explorerExclude.pane.items && viewItem" + "when": "view == explorerExclude.pane.items && viewItem && viewItem != '**/.git' && viewItem != '**/.svn'&& viewItem != '**/.hg'&& viewItem != '**/CVS'&& viewItem != '**/.DS_Store' && viewItem != '**/Thumbs.db' && viewItem != '**/*.git'" } ], "view/title": [ - { - "command": "explorer-exclude.toggleAllOn", - "group": "navigation@10", - "when": "view == explorerExclude.pane.items && !explorerExclude:enabled" - }, - { - "command": "explorer-exclude.toggleAllOff", - "group": "navigation@10", - "when": "view == explorerExclude.pane.items && explorerExclude:enabled" - }, { "command": "explorer-exclude.disableAll", "group": "navigation@10", @@ -171,28 +183,48 @@ }, { "command": "explorer-exclude.enableAll", - "group": "navigation@10", + "group": "navigation@11", "when": "view == explorerExclude.pane.items" }, + { + "command": "explorer-exclude.toggleAllOn", + "group": "navigation@12", + "when": "view == explorerExclude.pane.items && !explorer-exclude.enabled" + }, + { + "command": "explorer-exclude.toggleAllOff", + "group": "navigation@12", + "when": "view == explorerExclude.pane.items && explorer-exclude.enabled" + }, { "command": "explorer-exclude.reset", - "group": "navigation@10", + "group": "navigation@13", + "when": "view == explorerExclude.pane.items" + }, + { + "command": "explorer-exclude.openSettings", + "group": "navigation@14", "when": "view == explorerExclude.pane.items" } ] } }, "scripts": { - "postinstall": "node ./node_modules/vscode/bin/install", - "publish": "vsce package && vsce publish" + "test": "npm run -s test:lint && npm run -s test:unit", + "test:unit": "echo 'No Unit Tests'", + "test:lint": "eslint --ext .js ./extension --fix && echo '\n【ツ】CODE PERFECTION !!!\n'" }, "dependencies": { - "jsonc-parser": "^2.1.0", - "marked": "^0.6.2", - "subdir": "0.0.3", - "vscode-nls-i18n": "^0.1.1" + "jsonc-parser": "^3.1.0", + "marked": "^4.0.18", + "vscode-nls-i18n": "^0.2.4" }, "devDependencies": { - "vscode": "^1.1.34" + "babel-eslint": "^10.1.0", + "eslint": "^8.20.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "lint-staged": "^13.0.3", + "prettier": "^2.7.1" } } diff --git a/package.nls.bg.json b/package.nls.bg.json index 8e29ed2..f3ce444 100644 --- a/package.nls.bg.json +++ b/package.nls.bg.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Актуализиране на настройките на разширението", + "config.properties.backup": "Конфигурация на ресурси: Конфигурирайте файловете, като използвате глобални модели, за да имате винаги празен последен ред.", + "config.properties.showPicker": "Показване на инструмента за избор на шаблон на файл, когато е активиран, или Изключване на точното съвпадение, когато е деактивиран.", "config.removedKey": "{0} бе премахнат от скритите елементи", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Папката на работното пространство не е намерена. Отворете папка или работно пространство и опитайте отново.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} не съществува", "error.parseFilePath": "{0} не е налице", + "extension.title": "Explorer Exclude", "package.exclude": "Добавяне към скрити елементи ...", "package.pane": "Скрити елементи", "package.remove": "Премахване от скритите елементи", @@ -13,4 +20,4 @@ "tooltip.hide": "Скриване на {0}", "tooltip.show": "Показване на {0}", "reset.prompt": "Нулиране на скритите елементи? Това не може да бъде отменено." -} \ No newline at end of file +} diff --git a/package.nls.de.json b/package.nls.de.json index 12d093f..02c2b54 100644 --- a/package.nls.de.json +++ b/package.nls.de.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Erweiterungseinstellungen aktualisieren", + "config.properties.backup": "Ressourcenkonfiguration: Konfigurieren Sie Dateien mit Glob-Mustern so, dass sie immer eine leere letzte Zeile haben.", + "config.properties.showPicker": "Dateimusterauswahl anzeigen, wenn aktiviert, oder Exakte Übereinstimmung ausschließen, wenn deaktiviert.", "config.removedKey": "{0} aus ausgeblendeten Objekten entfernt", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Arbeitsbereichsordner nicht gefunden. Öffnen Sie den Ordner oder Arbeitsbereich und versuchen Sie es erneut.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} existiert nicht", "error.parseFilePath": "{0} ist nicht verfügbar", + "extension.title": "Explorer Exclude", "package.exclude": "Zu ausgeblendeten Objekten hinzufügen ...", "package.pane": "Versteckte Gegenstände", "package.remove": "Aus ausgeblendeten Objekten entfernen", @@ -13,4 +20,4 @@ "tooltip.hide": "{0} ausblenden", "tooltip.show": "{0} anzeigen", "reset.prompt": "Versteckte Objekte zurücksetzen? Das kann nicht rückgängig gemacht werden." -} \ No newline at end of file +} diff --git a/package.nls.es.json b/package.nls.es.json index 805dc1c..3a7e3af 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Actualizar la configuración de la extensión", + "config.properties.backup": "Configuración de recursos: configure archivos usando patrones globales para tener siempre una última línea vacía.", + "config.properties.showPicker": "Mostrar selector de patrón de archivo cuando está habilitado o excluir coincidencia exacta cuando está deshabilitado.", "config.removedKey": "Se eliminó {0} de los elementos ocultos", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Carpeta del espacio de trabajo no encontrada. Abra Carpeta o Área de trabajo y vuelva a intentarlo.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} no existe", "error.parseFilePath": "{0} no está disponible", + "extension.title": "Explorer Exclude", "package.exclude": "Añadir a objetos ocultos ...", "package.pane": "Objetos ocultos", "package.remove": "Eliminar de los elementos ocultos", @@ -13,4 +20,4 @@ "tooltip.hide": "Ocultar {0}", "tooltip.show": "Show {0}", "reset.prompt": "¿Desea restablecer los elementos ocultos? Esto no se puede deshacer." -} \ No newline at end of file +} diff --git a/package.nls.fr.json b/package.nls.fr.json index 3627d95..684bb37 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Mettre à jour les paramètres d'extension", + "config.properties.backup": "Configuration des ressources : configurez les fichiers à l'aide de modèles glob pour qu'ils aient toujours une dernière ligne vide.", + "config.properties.showPicker": "Afficher le sélecteur de modèle de fichier lorsqu'il est activé ou exclure la correspondance exacte lorsqu'il est désactivé.", "config.removedKey": "Suppression de {0} des éléments masqués", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Dossier d'espace de travail introuvable. Ouvrez le dossier ou l'espace de travail et réessayez.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} n'existe pas", "error.parseFilePath": "{0} n'est pas disponible", + "extension.title": "Explorer Exclude", "package.exclude": "Ajouter aux éléments cachés ...", "package.pane": "Objets Cachés", "package.remove": "Supprimer des éléments cachés", @@ -13,4 +20,4 @@ "tooltip.hide": "Masquer {0}", "tooltip.show": "Montrer {0}", "reset.prompt": "Réinitialiser les éléments cachés? Ça ne peut pas être annulé." -} \ No newline at end of file +} diff --git a/package.nls.hu.json b/package.nls.hu.json index f349e06..98d56f0 100644 --- a/package.nls.hu.json +++ b/package.nls.hu.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Frissítse a bővítmény beállításait", + "config.properties.backup": "Erőforrás-konfiguráció: Állítsa be a fájlokat glob-mintákkal úgy, hogy az utolsó sor mindig üres legyen.", + "config.properties.showPicker": "Fájlmintaválasztó megjelenítése, ha engedélyezve van, vagy Pontos egyezés kizárása, ha le van tiltva.", "config.removedKey": "{0} eltávolítása a rejtett elemekből", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "A munkaterület mappa nem található. Nyissa meg a mappát vagy a munkaterületet, és próbálja újra.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} nem létezik", "error.parseFilePath": "{0} nem érhető el", + "extension.title": "Explorer Exclude", "package.exclude": "Hozzáadás a rejtett elemekhez ...", "package.pane": "Rejtett elemek", "package.remove": "Eltávolítás a rejtett elemekből", @@ -13,4 +20,4 @@ "tooltip.hide": "{0} elrejtése", "tooltip.show": "{0} megjelenítése", "reset.prompt": "A rejtett elemek visszaállítása? Ezt nem lehet visszacsinálni." -} \ No newline at end of file +} diff --git a/package.nls.it.json b/package.nls.it.json index 971daf4..9802612 100644 --- a/package.nls.it.json +++ b/package.nls.it.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Aggiorna le impostazioni dell'estensione", + "config.properties.backup": "Configurazione delle risorse: configura i file utilizzando i modelli glob per avere sempre un'ultima riga vuota.", + "config.properties.showPicker": "Mostra Selettore modello file quando abilitato o Escludi corrispondenza esatta quando disabilitato.", "config.removedKey": "Rimosso {0} da oggetti nascosti", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Cartella dell'area di lavoro non trovata. Apri la cartella o l'area di lavoro e riprova.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} non esiste", "error.parseFilePath": "{0} non è disponibile", + "extension.title": "Explorer Exclude", "package.exclude": "Aggiungi a oggetti nascosti ...", "package.pane": "Oggetti nascosti", "package.remove": "Rimuovi da oggetti nascosti", @@ -13,4 +20,4 @@ "tooltip.hide": "Nascondi {0}", "tooltip.show": "Mostra {0}", "reset.prompt": "Reimposta elementi nascosti? Questo non può essere annullato." -} \ No newline at end of file +} diff --git a/package.nls.ja.json b/package.nls.ja.json index 1819c89..4419976 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "拡張設定の更新", + "config.properties.backup": "リソース構成:globパターンを使用してファイルを構成し、常に最後の行が空になるようにします。", + "config.properties.showPicker": "有効な場合はファイルパターンピッカーを表示し、無効な場合は完全一致を除外します。", "config.removedKey": "隠しアイテムから{0}を削除しました", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "ワークスペースフォルダが見つかりません。フォルダまたはワークスペースを開いて、再試行してください。", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0}は存在しません", "error.parseFilePath": "{0}は利用できません", + "extension.title": "Explorer Exclude", "package.exclude": "隠しアイテムに追加...", "package.pane": "隠しアイテム", "package.remove": "隠しアイテムから削除", @@ -13,4 +20,4 @@ "tooltip.hide": "{0}を非表示", "tooltip.show": "{0}を表示", "reset.prompt": "隠しアイテムをリセットしますか?これは、元に戻すことはできません。" -} \ No newline at end of file +} diff --git a/package.nls.json b/package.nls.json index eb0ea5f..0dc483e 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Update Extension Settings", + "config.properties.backup": "Resource configuration: Configure files using glob patterns to have an empty last line always.", + "config.properties.showPicker": "Show File Pattern Picker when Enabled or Exclude Exact Match when disabled.", "config.removedKey": "Removed {0} from Hidden Items", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Workspace Folder Not Found. Open Folder or Workspace and try again.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} does not exist", "error.parseFilePath": "{0} is not available", + "extension.title": "Explorer Exclude", "package.exclude": "Add to Hidden Items ...", "package.pane": "Hidden Items", "package.remove": "Remove from Hidden Items", @@ -13,4 +20,4 @@ "tooltip.hide": "Hide {0}", "tooltip.show": "Show {0}", "reset.prompt": "Reset Hidden Items? This cannot be undone." -} \ No newline at end of file +} diff --git a/package.nls.ko.json b/package.nls.ko.json index 84718f8..1aaaa8c 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "확장 설정 업데이트", + "config.properties.backup": "리소스 구성: 항상 마지막 줄이 비어 있도록 glob 패턴을 사용하여 파일을 구성합니다.", + "config.properties.showPicker": "활성화된 경우 파일 패턴 선택기를 표시하거나 비활성화된 경우 정확히 일치를 제외합니다.", "config.removedKey": "숨겨진 항목에서 {0}을 (를) 제거했습니다.", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "작업 공간 폴더를 찾을 수 없습니다. 폴더 또는 작업 공간을 열고 다시 시도하십시오.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0}이 (가) 존재하지 않습니다.", "error.parseFilePath": "{0}을 (를) 사용할 수 없습니다.", + "extension.title": "Explorer Exclude", "package.exclude": "숨겨진 항목에 추가 ...", "package.pane": "숨겨진 항목", "package.remove": "숨겨진 항목에서 제거", @@ -13,4 +20,4 @@ "tooltip.hide": "{0} 숨기기", "tooltip.show": "{0} 표시", "reset.prompt": "숨겨진 항목 재설정? 이 취소 할 수 없습니다." -} \ No newline at end of file +} diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json index 4dd05eb..72bf2b8 100644 --- a/package.nls.pt-br.json +++ b/package.nls.pt-br.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Atualizar configurações de extensão", + "config.properties.backup": "Configuração de recursos: configure arquivos usando padrões glob para ter sempre uma última linha vazia.", + "config.properties.showPicker": "Mostrar seletor de padrão de arquivo quando ativado ou Excluir correspondência exata quando desativado.", "config.removedKey": "Removido {0} dos itens ocultos", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Pasta do espaço de trabalho não encontrada. Abra a pasta ou área de trabalho e tente novamente.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} não existe", "error.parseFilePath": "{0} não está disponível", + "extension.title": "Explorer Exclude", "package.exclude": "Adicionar aos itens ocultos ...", "package.pane": "Itens ocultos", "package.remove": "Remover de itens ocultos", @@ -13,4 +20,4 @@ "tooltip.hide": "Esconder {0}", "tooltip.show": "Mostrar {0}", "reset.prompt": "Redefinir itens ocultos? Isto não pode ser desfeito." -} \ No newline at end of file +} diff --git a/package.nls.ru.json b/package.nls.ru.json index 88bcf78..c9c3427 100644 --- a/package.nls.ru.json +++ b/package.nls.ru.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Обновить настройки расширения", + "config.properties.backup": "Конфигурация ресурсов: настройте файлы с использованием шаблонов универсальных объектов, чтобы последняя строка всегда была пустой.", + "config.properties.showPicker": "Показывать средство выбора шаблона файла, если оно включено, или исключать точное совпадение, если оно отключено.", "config.removedKey": "Удалено {0} из скрытых предметов", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Папка рабочей области не найдена. Откройте папку или рабочую область и повторите попытку.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} не существует", "error.parseFilePath": "{0} недоступен", + "extension.title": "Explorer Exclude", "package.exclude": "Добавить в скрытые объекты ...", "package.pane": "Скрытые предметы", "package.remove": "Удалить из скрытых предметов", @@ -13,4 +20,4 @@ "tooltip.hide": "Скрыть {0}", "tooltip.show": "Показать {0}", "reset.prompt": "Сбросить скрытые предметы? Это не может быть отменено." -} \ No newline at end of file +} diff --git a/package.nls.tr.json b/package.nls.tr.json index 99e9526..9de29ad 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "Uzantı Ayarlarını Güncelle", + "config.properties.backup": "Kaynak yapılandırması: Her zaman boş bir son satıra sahip olmak için glob kalıplarını kullanarak dosyaları yapılandırın.", + "config.properties.showPicker": "Etkinleştirildiğinde Dosya Desen Seçici'yi göster veya devre dışı bırakıldığında Tam Eşleşmeyi Hariç Tut.", "config.removedKey": "Gizli Öğelerden {0} kaldırıldı", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "Çalışma Alanı Klasörü Bulunamadı. Klasör veya Çalışma Alanı'nı açın ve tekrar deneyin.", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0} mevcut değil", "error.parseFilePath": "{0} mevcut değil", + "extension.title": "Explorer Exclude", "package.exclude": "Gizli Öğelere Ekle ...", "package.pane": "Gizli Öğeler", "package.remove": "Gizli Öğelerden Kaldır", @@ -13,4 +20,4 @@ "tooltip.hide": "{0} sakla", "tooltip.show": "{0} göster", "reset.prompt": "Gizli Öğeleri Sıfırla? Bu geri alınamaz." -} \ No newline at end of file +} diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 3b6297f..5e1406e 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "更新扩展设置", + "config.properties.backup": "资源配置:使用模式配置文件以始终有一个空的最后一行。", + "config.properties.showPicker": "启用时显示文件模式选择器或禁用时排除完全匹配。", "config.removedKey": "从隐藏项目中删除了{0}", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "未找到工作区文件夹。打开文件夹或工作区,然后重试。", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0}不存在", "error.parseFilePath": "{0}不可用", + "extension.title": "Explorer Exclude", "package.exclude": "添加到隐藏物品...", "package.pane": "隐藏物品", "package.remove": "从隐藏物品中删除", @@ -13,4 +20,4 @@ "tooltip.hide": "隐藏{0}", "tooltip.show": "显示{0}", "reset.prompt": "重置隐藏物品?这不能被撤消。" -} \ No newline at end of file +} diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 6461a3c..531f174 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -1,7 +1,14 @@ { + "command.openSettings.title": "更新擴展設置", + "config.properties.backup": "資源配置:使用模式配置文件以始終有一個空的最後一行。", + "config.properties.showPicker": "啟用時顯示文件模式選擇器或禁用時排除完全匹配。", "config.removedKey": "從隱藏項目中刪除了{0}", + "debug.logger.error": "⚠ ERROR: [{0}] {1}", + "debug.logger.missingWorkspace": "未找到工作區文件夾。打開文件夾或工作區,然後重試。", + "debug.logger.workspace": "\nWorkspace: {0}", "error.ifExists": "{0}不存在", "error.parseFilePath": "{0}不可用", + "extension.title": "Explorer Exclude", "package.exclude": "添加到隱藏物品...", "package.pane": "隱藏物品", "package.remove": "從隱藏物品中刪除", @@ -13,4 +20,4 @@ "tooltip.hide": "隱藏{0}", "tooltip.show": "顯示{0}", "reset.prompt": "重置隱藏物品?這不能被撤消。" -} \ No newline at end of file +} diff --git a/util.js b/util.js deleted file mode 100755 index c204bd0..0000000 --- a/util.js +++ /dev/null @@ -1,504 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const subdir = require('subdir'); -const util = require('util'); -const vscode = require('vscode'); - -const { localize } = require('vscode-nls-i18n'); - -const rootPath = vscode.workspace.rootPath; - -let VS_CONTEXT = null; - -/** - * Custom Await Method for Processing Hidden File Config - */ -var _await = (this && this._await) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator['throw'](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -/** - * Delete Key from Exclude Config - * @param {string} key - * @param {string} uri - * @param {function} callback - */ -function deleteExclude(key, uri, callback) { - if (!key) { - return false; - } - - const config = vscode.workspace.getConfiguration('files', null); - - let excludes = config.get('exclude'); - if (!excludes) { - excludes = {}; - } - - // Remove if already set - if (key && excludes.hasOwnProperty(key)) { - delete excludes[key]; - updateConfig(excludes, uri, callback, localize('config.removedKey', key)) - } -} - -/** - * Get Excluded Fils - */ -function getExcludes() { - if (!rootPath || rootPath === '') { - return []; - } - - const config = vscode.workspace.getConfiguration('files', null); - const excludes = config.get('exclude'); - - let list = excludes ? Object.keys(config.get('exclude')) : []; - - for (let i = 0; i < list.length; i++) { - let enabled = (excludes[list[i]]) ? 1 : 0; - list[i] = `${list[i]}|${enabled}` - } - - return list; -} - -/** - * Get Resource Path - * @param {string} file - * @param {string} theme - */ -function getResourcePath(file, theme) { - return (theme) ? VS_CONTEXT.asAbsolutePath(path.join('resources', theme, file)) : VS_CONTEXT.asAbsolutePath(path.join('resources', file)); -} - -/** - * Get Root Path - * @param {string} file - */ -function getRootPath(file) { - return VS_CONTEXT.asAbsolutePath(file); -} - -/** - * Get Root Workspace Directory - * @param {string} uri - */ -function getRoot(uri) { - if (isMultiRoot()) { - let matchRoot = vscode.workspace.workspaceFolders.filter((wf) => { - return isParentPath(uri.fsPath, wf.uri.fsPath); - }).map(v => v.uri.fsPath); - - return matchRoot[0]; - } - else { - return rootPath || ''; - } -} - -/** - * Check if Path Exists - * @param {string} _path - */ -function ifExists(_path) { - if (isUnavailable(_path)) { - return Promise.reject(new Error(localize('error.ifExists', _path))); - } - return new Promise((res, rej) => { - fs.access(_path, (error) => { - if (util.isNullOrUndefined(error)) { - res(true); - } - else { - rej(error); - } - }); - }); -} - -/** - * Check if this is a Multi Root Workspace - */ -function isMultiRoot() { - if (vscode.workspace.workspaceFolders) { - return vscode.workspace.workspaceFolders.length > 1; - } - return false; -} - -/** - * Check if Path is a Parent Directory - * @param {string} source - * @param {integer} target - */ -function isParentPath(source, target) { - return target !== '/' && subdir(target, source); -} - -/** - * Check if path is defined - * @param {string} _path - */ -function isUnavailable(_path) { - return util.isNullOrUndefined(_path) || _path === ''; -} - -/** - * Parse File Path - * @param {string} _file - * @param {string} rootPath - */ -function parseFilePath(_file, _root = '') { - return _await(this, void 0, void 0, function* () { - if (isUnavailable(_file)) { - return Promise.reject(new Error(localize('error.parseFilePath', _file))); - } - - try { - yield ifExists(_file); - - const ext = path.extname(_file); - const base = path.basename(_file); - const dir = path.relative(_root, path.dirname(_file)); - - return { - path: _file, - ext, - base, - dir - }; - } - catch (error) { - return Promise.reject(error); - } - }); -} - -/** - * Save VS Code Context for Pane Reference - * @param {object} context - */ -function saveContext(context) { - VS_CONTEXT = context; -} - -/** - * Show Item Select Menu - * @param {array} items - */ -function showPicker(items) { - return vscode.window.showQuickPick(items, { - placeHolder: localize('picker.placeholder'), - canPickMany: true - }); -} - -/** - * Toggle Visibility of Excluded Pattern - * @param {string} key - * @param {function} callback - */ -function toggleExclude(key, callback) { - if (!key) { - return false; - } - - const config = vscode.workspace.getConfiguration('files', null); - - let excludes = config.get('exclude'); - if (!excludes) { - excludes = {}; - } - - // Invert Selection - if (key && excludes.hasOwnProperty(key)) { - excludes[key] = !(excludes[key]); - updateConfig(excludes, key, callback); - } -} - -/** - * Disable All - * @param {function} callback - */ -function disableAll(callback) { - const config = vscode.workspace.getConfiguration('files', null); - - let excludes = config.get('exclude'); - if (!excludes) { - excludes = {}; - } - - for (let key in excludes) { - if (excludes.hasOwnProperty(key)) { - excludes[key] = false; - } - } - - updateConfig(excludes, null, callback); -} - -/** - * Enable All - * @param {function} callback - */ -function enableAll(callback) { - const config = vscode.workspace.getConfiguration('files', null); - - let excludes = config.get('exclude'); - if (!excludes) { - excludes = {}; - } - - for (let key in excludes) { - if (excludes.hasOwnProperty(key)) { - excludes[key] = true; - } - } - - updateConfig(excludes, null, callback); -} - -function toggleAll(callback) { - if (!rootPath || rootPath === '') { - return; - } - - try { - const config = vscode.workspace.getConfiguration('files', null); - - const excludes = config.get('exclude'); - const backup = vscode.workspace.getConfiguration(null, null).get('explorerExclude.backup'); - - let newExcludes = Object.assign({}, excludes); - - if (!newExcludes) { - newExcludes = {}; - } - - for (let key in newExcludes) { - if (newExcludes.hasOwnProperty(key)) { - newExcludes[key] = false; - } - } - - let target = vscode.ConfigurationTarget.Workspace || null; - - if (isMultiRoot()) { - const multiConfig = vscode.workspace.getConfiguration('explorerExclude', null); - let isExcludeFolder = multiConfig.get('folder'); - target = isExcludeFolder ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Workspace; - } - - const newBackup = (backup) ? null : excludes; - const newExclude = (backup) ? backup : newExcludes; - - vscode.commands.executeCommand('setContext', 'explorerExclude:enabled', (backup)); - - config.update('exclude', newExclude, target).then(() => { - vscode.workspace.getConfiguration(null, null).update('explorerExclude.backup', newBackup).then(() => { - if (typeof callback === 'function') { - callback(); - } - }); - }); - } - catch (error) { - vscode.window.showErrorMessage(error.message || error); - } -} - -/** - * Reset All - * @param {function} callback - */ -function reset(callback) { - updateConfig({}, null, callback); -} - -/** - * Write Exclude Updates to Config File - * @param {object} excludes - * @param {string} uri - * @param {function} callback - * @param {string} message - */ -function updateConfig(excludes, uri, callback, message) { - if (!rootPath || rootPath === '') { - return; - } - - try { - const config = vscode.workspace.getConfiguration('files', null); - - let target = vscode.ConfigurationTarget.Workspace || null; - - if (isMultiRoot()) { - const multiConfig = vscode.workspace.getConfiguration('explorerExclude', uri); - let isExcludeFolder = multiConfig.get('folder'); - target = isExcludeFolder ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Workspace; - } - - vscode.commands.executeCommand('setContext', 'explorerExclude:enabled', true); - - config.update('exclude', excludes, target).then(() => { - // Remove Backup since we made a manual change - vscode.workspace.getConfiguration(null, null).update('explorerExclude.backup', {}).then(() => { - if (message) { - vscode.window.showInformationMessage(message); - } - - if (typeof callback === 'function') { - callback(); - } - }); - }); - } - catch (error) { - vscode.window.showErrorMessage(error.message || error); - } -} - -/** - * VS Code Action - Handle Mapping URI Exclusion to possible Regex Pattern Matches - * @param {string} uri - * @param {function} callback - */ -function vscExclude(uri, callback) { - return _await(this, void 0, void 0, function* () { - try { - const _path = uri.fsPath; - const _root = getRoot(uri) || ''; - const _meta = (yield parseFilePath(_path, _root)); - - let selections; - let options = []; - - const _showPicker = vscode.workspace.getConfiguration(null, null).get('explorerExclude.showPicker'); - if (typeof _showPicker == 'undefined') - _showPicker = true; - - if (_showPicker) { - Object.keys(_meta).forEach(key => { - let regex = undefined; - switch (key) { - case 'path': - break; - case 'ext': - regex = _meta[key] ? `**/*${_meta[key]}` : undefined; - break; - case 'base': - regex = _meta[key]; - break; - case 'dir': - if (_showPicker) - regex = _meta[key] ? `${_meta[key] + '/'}*.*` : undefined; - break; - } - if (regex) { - options.push(regex); - } - }); - - if (_meta['dir'] && _meta['ext']) { - options.push(`${_meta['dir']}/*${_meta['ext']}`); - } - else if (_meta['ext']) { - options.push(`*${_meta['ext']}`); - } - - if (_meta['base']) { - options.push(`**/${_meta['base']}`); - if (_meta['dir']) { - options.push(`${_meta['dir']}/${_meta['base']}`); - } - } - - selections = yield showPicker(options.reverse()); - } else { - if (_meta['base']) - selections = [_meta['base']]; - } - - if (selections && selections.length > 0) { - const config = vscode.workspace.getConfiguration('files', null); - - let excludes = config.get('exclude'); - if (!excludes) { - excludes = {}; - } - - try { - Array.from(new Set(selections)).filter(v => v !== '*').forEach((rule) => { excludes[rule] = true; }); - updateConfig(excludes, uri, callback); - } - catch (error) { - vscode.window.showErrorMessage(error.message || error); - } - } - } - catch (error) { - vscode.window.showErrorMessage(error.message || error); - } - }); -} - -/** - * VS Code Action - Remove item from Excluded Patterns - * @param {*} item - * @param {*} callback - */ -function vscRemove (item, callback) { - if (item && item.value) { - const value = item.value; - const title = value.substring(0, value.length - 2); - deleteExclude(title, null, callback); - } -} - -/** - * VS Code Action - Tiggle Visibility of item from Excluded Patterns - * @param {*} key - * @param {*} callback - */ -function vscToggle (key, callback) { - if (key) { - toggleExclude(key, callback); - } -} - -function vscToggleAll (callback) { - toggleAll(callback); -} - -function vscDisableAll (callback) { - disableAll(callback); -} - -function vscEnableAll (callback) { - enableAll(callback); -} - -function vscReset (callback) { - reset(callback); -} - -module.exports = { - getExcludes, - getResourcePath, - getRootPath, - saveContext, - vscDisableAll, - vscEnableAll, - vscExclude, - vscRemove, - vscReset, - vscToggle, - vscToggleAll -} diff --git a/viewpane.js b/viewpane.js deleted file mode 100644 index 3d34c7a..0000000 --- a/viewpane.js +++ /dev/null @@ -1,64 +0,0 @@ -const jsonc_parser = require('jsonc-parser'); -const vscode = require('vscode'); - -const { localize } = require('vscode-nls-i18n'); - -const util = require('./util'); - -class ViewPane { - constructor(viewPaneName) { - this.viewUpdatedEventEmitter = new vscode.EventEmitter(); - this.onDidChangeTreeData = this.viewUpdatedEventEmitter.event; - this.tree = { - type: 'object', - offset: 0, - length: 0, - children: [] - }; - this.register(viewPaneName); - this.registerEvents(); - } - - register(name = '') { - vscode.window.registerTreeDataProvider(name, this); - } - - registerEvents() { - this.onDidChangeTreeData(() => {}); - } - - update(list) { - let treeString = JSON.stringify(list); - this.tree = jsonc_parser.parseTree(treeString); - this.viewUpdatedEventEmitter.fire(); - } - - getChildren() { - return Promise.resolve(this.tree.children); - } - - getTreeItem(node) { - const value = node.value; - const enabled = parseInt(value[value.length -1]); - const title = value.substring(0, value.length - 2); - const icon = enabled ? 'checked.svg' : 'unchecked.svg'; - - let treeItem = new vscode.TreeItem(title, vscode.TreeItemCollapsibleState.None); - - treeItem.iconPath = { - light: util.getResourcePath(icon, 'light'), - dark: util.getResourcePath(icon, 'dark') - }; - treeItem.contextValue = title; - treeItem.tooltip = enabled ? localize('tooltip.show', title) : localize('tooltip.hide', title); - treeItem.command = { - command: 'explorer-exclude.toggle', - title: title, - arguments: [title] - }; - - return treeItem; - } -} - -module.exports = ViewPane; \ No newline at end of file diff --git a/welcome.js b/welcome.js deleted file mode 100644 index 802c859..0000000 --- a/welcome.js +++ /dev/null @@ -1,38 +0,0 @@ -const vscode = require('vscode'); -const fs = require('fs'); -const marked = require('marked'); - -const util = require('./util'); - -class WelcomePane { - constructor() {} - - show() { - fs.readFile(util.getResourcePath('welcome.html'), function(err, html) { - if (!err) { - const panel = vscode.window.createWebviewPanel( - 'explorerExclude', - 'welcome', - vscode.ViewColumn.One, - {} - ); - - const README = fs.readFileSync(util.getRootPath('README.md'), 'utf8'); - const CHANGELOG = fs.readFileSync(util.getRootPath('CHANGELOG.md'), 'utf8'); - const TROUBLESHOOTING = fs.readFileSync(util.getRootPath('TROUBLESHOOTING.md'), 'utf8'); - - let welcomePage = html.toString(); - - welcomePage = welcomePage.replace('{{README}}', marked(README)); - welcomePage = welcomePage.replace('{{CHANGELOG}}', marked(CHANGELOG)); - welcomePage = welcomePage.replace('{{TROUBLESHOOTING}}', marked(TROUBLESHOOTING)); - - panel.title = 'Explorer Exclude Welcome'; - panel.webview.html = welcomePage; - } - - }); - } -} - -module.exports = WelcomePane; \ No newline at end of file