├── .eslintrc.json ├── .github └── workflows │ ├── ci.yaml │ └── labelled-release.yml ├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── docs └── DEVELOPMENT.md ├── images └── icon.png ├── language ├── language-configuration.json └── teal.tmLanguage.json ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── r.bat ├── src ├── extension.ts ├── lib │ ├── file.ts │ └── log-calls.ts ├── teal-debug-adaptor.ts ├── teal-runtime.ts └── test │ ├── runTest.ts │ └── suite │ ├── extension.test.ts │ └── index.ts ├── stamp-version.js ├── test ├── basic │ └── test.teal ├── crowdfunding │ ├── crowdfunding.teal │ └── crowdfunding.teal.json ├── escrow │ ├── escrow.teal │ └── escrow.teal.json ├── opcode-tests │ ├── app_global_del.teal │ ├── app_global_get.teal │ ├── app_global_get_ex.teal │ ├── app_global_put.teal │ ├── app_local_del.teal │ ├── app_local_get.teal │ ├── app_local_get_ex.teal │ ├── app_local_put.teal │ ├── app_opted_in.teal │ ├── app_params_get.teal │ ├── arg.teal │ ├── asset_holding_get.teal │ ├── asset_params_get.teal │ ├── balance.teal │ ├── gaid.teal │ ├── global.teal │ ├── gtxn.teal │ └── txn.teal └── test-cases │ ├── .vscode │ └── launch.json │ ├── example-1.teal │ ├── example-1.teal.json │ ├── teal-1.teal │ ├── teal-1.teal.json │ ├── teal-2.teal │ ├── teal-2.teal.json │ ├── teal-3.teal │ ├── teal-3.teal.json │ ├── teal-4.teal │ ├── teal-4.teal.json │ ├── teal-5.teal │ ├── teal-5.teal.json │ ├── test.teal │ └── test.teal.json ├── tsconfig.json ├── vsc-extension-quickstart.md └── webpack.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | }, 19 | "ignorePatterns": [ 20 | "out", 21 | "dist", 22 | "**/*.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | test: 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 5 12 | 13 | steps: 14 | 15 | # Checks-out your repository under $GITHUB_WORKSPACE. 16 | - uses: actions/checkout@v2 17 | 18 | # Installs Node.js. 19 | - uses: actions/setup-node@v1 20 | with: 21 | node-version: 16 22 | 23 | - name: Install dependencies 24 | run: npm ci 25 | 26 | - name: Run tests 27 | uses: GabrielBB/xvfb-action@v1 28 | with: 29 | run: npm test 30 | 31 | -------------------------------------------------------------------------------- /.github/workflows/labelled-release.yml: -------------------------------------------------------------------------------- 1 | name: Labelled release 2 | on: 3 | push: 4 | tags: 5 | - v* 6 | 7 | jobs: 8 | get_version: 9 | runs-on: ubuntu-latest # Getting the version relies on Linux commands. 10 | name: Get version 11 | 12 | outputs: 13 | version: ${{ steps.get_version.outputs.version }} 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Get version 19 | id: get_version 20 | run: | 21 | # Strip git ref prefix from version 22 | VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/v\(.*\),\1,') 23 | 24 | echo "::set-output name=version::$VERSION" 25 | 26 | echo "Found version: $VERSION" 27 | 28 | build: 29 | needs: get_version 30 | runs-on: ubuntu-latest # Can build for all platforms on Linux. 31 | steps: 32 | - uses: actions/checkout@v2 33 | 34 | - uses: actions/setup-node@v2 35 | with: 36 | node-version: 16 37 | cache: 'npm' 38 | 39 | - name: Cache 40 | id: cache 41 | uses: actions/cache@v2 42 | with: 43 | path: cache 44 | key: ${{ runner.os }}-cache 45 | 46 | - name: Stamp version 47 | run: | 48 | export VERSION=${{ needs.get_version.outputs.version }} 49 | node stamp-version.js 50 | 51 | - name: Install dependencies 52 | run: | 53 | npm ci 54 | 55 | - name: Run tests 56 | uses: GabrielBB/xvfb-action@v1 57 | with: 58 | run: npm test 59 | 60 | - name: Create Extension Package 61 | run: | 62 | npm run package 63 | 64 | # https://github.com/actions/create-release 65 | - name: Create release 66 | id: create_release 67 | uses: actions/create-release@v1 68 | env: 69 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 70 | with: 71 | tag_name: ${{ github.ref }} 72 | release_name: Release ${{ github.ref }} 73 | body: | 74 | Release ${{ github.ref }} 75 | draft: false 76 | prerelease: false 77 | 78 | # https://github.com/actions/upload-release-asset 79 | - name: Upload release 80 | uses: actions/upload-release-asset@v1 81 | env: 82 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 83 | with: 84 | upload_url: ${{ steps.create_release.outputs.upload_url }} # Pulls the URL from the preceding step. 85 | asset_path: ./teal-debugger-extension-${{ needs.get_version.outputs.version }}.vsix 86 | asset_name: teal-debugger-extension-${{ needs.get_version.outputs.version }}.vsix 87 | asset_content_type: application/octet-stream 88 | 89 | - name: Publish 90 | run: npm run publish 91 | env: 92 | VSCE_PAT: ${{ secrets.ASHS_AZURE_DEVOPS_PAT }} 93 | 94 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | .vscode-test/ 5 | *.vsix 6 | test/opcode-tests/*.teal.json 7 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--disable-extensions", 14 | "--extensionDevelopmentPath=${workspaceFolder}", 15 | "${workspaceFolder}/test/opcode-tests" 16 | ], 17 | "outFiles": [ 18 | "${workspaceFolder}/dist/**/*.js" 19 | ], 20 | "preLaunchTask": "${defaultBuildTask}" 21 | }, 22 | { 23 | "name": "Extension Tests", 24 | "type": "extensionHost", 25 | "request": "launch", 26 | "args": [ 27 | "--disable-extensions", 28 | "--extensionDevelopmentPath=${workspaceFolder}", 29 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 30 | ], 31 | "outFiles": [ 32 | "${workspaceFolder}/out/**/*.js", 33 | "${workspaceFolder}/dist/**/*.js" 34 | ], 35 | "preLaunchTask": "tasks: watch-tests" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false, // set this to true to hide the "out" folder with the compiled JS files 5 | "dist": false // set this to true to hide the "dist" folder with the compiled JS files 6 | }, 7 | "search.exclude": { 8 | "out": true, // set this to false to include "out" folder in search results 9 | "dist": true // set this to false to include "dist" folder in search results 10 | }, 11 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 12 | "typescript.tsc.autoDetect": "off", 13 | "typescript.tsdk": "node_modules\\typescript\\lib" 14 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": [ 10 | "$ts-webpack-watch", 11 | "$tslint-webpack-watch" 12 | ], 13 | "isBackground": true, 14 | "presentation": { 15 | "reveal": "never", 16 | "group": "watchers" 17 | }, 18 | "group": { 19 | "kind": "build", 20 | "isDefault": true 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "watch-tests", 26 | "problemMatcher": "$tsc-watch", 27 | "isBackground": true, 28 | "presentation": { 29 | "reveal": "never", 30 | "group": "watchers" 31 | }, 32 | "group": "build" 33 | }, 34 | { 35 | "label": "tasks: watch-tests", 36 | "dependsOn": [ 37 | "npm: watch", 38 | "npm: watch-tests" 39 | ], 40 | "problemMatcher": [] 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/** 4 | node_modules/** 5 | src/** 6 | .gitignore 7 | .yarnrc 8 | webpack.config.js 9 | vsc-extension-quickstart.md 10 | **/tsconfig.json 11 | **/.eslintrc.json 12 | **/*.map 13 | **/*.ts 14 | check-version.js 15 | test/** 16 | .github/** 17 | .git/** 18 | r.bat 19 | *.vsix -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "teal-debugger-extension" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Optio Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # teal-debugger-extension 2 | 3 | This is TEAL debugger extension for VS Code with support up to and including TEAL 5. Support for TEAL 6 is coming in the future. 4 | 5 | It allows you to run TEAL code directly on a simulated AVM (Algorand virtual machine) without having to do any setup or configuration 6 | 7 | To run TEAL code on a real AVM you need to setup an Algorand block chain node (which is complicated and takes time). Then you have to jump through hoops to run, test and debug your code. This TEAL debugger extension allows you to test and debug your code without any of that complexity. 8 | 9 | ## Install the debugger 10 | 11 | Install this extension from the VS Code marketplace. 12 | 13 | Or install the latest version manually, downloaded from [the releases page](https://github.com/optio-labs/teal-debugger-extension/releases). 14 | 15 | ## Using the debugger 16 | 17 | With the debugger installed, open a TEAL file. 18 | 19 | Debug it like you would any other type of code: 20 | - F5 to start debugging. 21 | - F10 to single step lines of code. 22 | - View the debug pane to see the compute stack and variables. 23 | 24 | See [the VS Code Debugging guide](https://code.visualstudio.com/docs/editor/debugging) for help on using the debugger UI. 25 | 26 | ## Configuring the debugger 27 | 28 | Running TEAL code often requires a lot of *environmental context* (hereafter referred to as **the context**), things like: 29 | - The current transaction or transaction group 30 | - Global and local state 31 | - Details about the block chain account 32 | 33 | This TEAL debugger requires no initial configuration, you can simply start debugging and it asks you to choose from the following options: 34 | - Choose a new existing configuration file (if you have one) 35 | - Create a new configuration from a default (if you have some defaults) 36 | - Proceed with no configuration. 37 | 38 | The first time you use the TEAL debugger the easiest way is to *proceed with no configuration*. The debugger runs in *automatic configuration* mode: when it needs to load a value from the context, and the value doesn't yet exist, it prompts you for input. The inputs you provide are stored in the context. When the context is updated you then are prompted to save a configuration file. This is the easiest way to generate a new configuration file. 39 | 40 | The saved configuration is output into the `.teal-debugger` directory under the same directory as the TEAL file you are debugging. The name of the configuration file is automatically generated by adding `.json` to the name of the TEAL file. So if you are debugging `blah.teal` the first generated configuration will be named `.teal-debugger/blah.teal.json`. Please rename this file to give it a more meaningful name. Subsequent generated configuration files for the same TEAL file add numbers to the name, i.e. `.teal-debugger/blah.teal-1.json`, `.teal-debugger/blah.teal-2.json` and so on. 41 | 42 | You can copy existing configurations in the `.teal-debugger` directory, give them new names and tweak the values therein to create new configurations for the TEAL debugger. 43 | 44 | To create default (or template) configurations copy existing configuration file to the `.teal-debugger` directory under your home directory (you must create this directory yourself). Be sure to give these files good names so that you'll remember their purpose later. 45 | 46 | To learn more about what goes in a configuration file, please see [the configuration guide](https://github.com/optio-labs/teal-interpreter/blob/main/docs/configuration.md) for [the TEAL interpreter](https://github.com/optio-labs/teal-interpreter) (that this debugger is built on). 47 | 48 | 49 | ## Development 50 | 51 | See [the development guide](docs/DEVELOPMENT.md) for instructions on development of this extension. -------------------------------------------------------------------------------- /docs/DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # Development guide 2 | 3 | ## Pre requisites 4 | 5 | Have Node.js installed. 6 | 7 | Install a single version: https://nodejs.org/ 8 | 9 | Or manage multiples versions using `nvm`: 10 | 11 | - For Windows: https://github.com/coreybutler/nvm-windows 12 | - For Linux/MacOS: https://github.com/nvm-sh/nvm 13 | 14 | ## Get the code 15 | 16 | Clone this repo: 17 | 18 | ```bash 19 | git clone git@github.com:hone-labs/teal-debugger-extension.git 20 | ``` 21 | 22 | ## Setup 23 | 24 | Install dependencies: 25 | 26 | ```bash 27 | cd teal-debugger-extension 28 | pnpm install 29 | ``` 30 | 31 | ## Debug the debugger 32 | 33 | Open the project in VS Code: 34 | 35 | ```bash 36 | cd teal-debugger-extension 37 | code . 38 | ``` 39 | 40 | Go to the debug panel and ensure `Run extension` is selected in the dropdown. 41 | 42 | Now hit F5 to load a new instance of VS Code that loads the extenion for testing and debugging. 43 | 44 | The new instance is automatically opened to the one of the test workspaces that's under the `test` directory. 45 | 46 | Open a TEAL file that you would like to debug, then hit F5 to start debugging it. 47 | 48 | Hit F10 to single step through the TEAL file. You can view the TEAL compute stack and variables in the debugger pane. 49 | 50 | ## Rebuild and reload 51 | 52 | While debugging the extension (from the previous section) change code in the extension (it will be built automatically using Webpack watch), then in the new instance run `Developer: Reload Window` to load the new code. 53 | 54 | ## Run tests 55 | 56 | Open the project in VS Code. 57 | 58 | Go to the debug panel and ensure `Extension Tests` is selected in the dropdown. 59 | 60 | Now hit F5 to run the tests. The outcome will be reported in the debug console. 61 | 62 | You can also run in the console, but only if no VS Code instance is open: 63 | 64 | ```bash 65 | npm test 66 | ``` 67 | 68 | ## Create an installable package for the extension 69 | 70 | ```bash 71 | npm run package 72 | ``` 73 | 74 | Output is `teal-debugger-extension-.vsix`. 75 | 76 | Install the extension like this: 77 | 78 | ```bash 79 | code --install-extension teal-debugger-extension-.vsix 80 | ``` 81 | 82 | ## Deployment 83 | 84 | To deploy a new version of the TEAL debugger simply tag the commit for the new release with the version number in the following form: 85 | 86 | ```bash 87 | v0.0.5 88 | ``` 89 | 90 | Don't forget to add the `v` to the tag, this is how the deployment pipeline knows the tag is a version (and not some other tag). 91 | 92 | Now push tags: 93 | 94 | ``` 95 | git push --tags 96 | ``` 97 | 98 | The updated version will deploy automatically to npm (provided the automated tests pass). 99 | 100 | ## Resources 101 | 102 | - This code developed from the VS Code "your first extension" tutorial: 103 | - https://code.visualstudio.com/api/get-started/your-first-extension 104 | - VS Code API reference: 105 | - https://code.visualstudio.com/api/references/vscode-api 106 | - Implementing a VS Code debugger extension: 107 | - https://code.visualstudio.com/api/extension-capabilities/overview#debugging 108 | - List of debugger adaptors: 109 | - https://microsoft.github.io/debug-adapter-protocol/implementors/adapters/ 110 | - Debugger API reference: 111 | - https://code.visualstudio.com/api/references/vscode-api#debug 112 | - Debug Adaptor Protocol (this protocol is independent of VS Code): 113 | - https://microsoft.github.io/debug-adapter-protocol/ 114 | - https://microsoft.github.io/debug-adapter-protocol/overview 115 | -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hone-labs/teal-debugger-extension/b60d61a21dc1fadbd10551a303626f923a0ed59e/images/icon.png -------------------------------------------------------------------------------- /language/language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | // symbol used for single line comment. Remove this entry if your language does not support line comments 4 | "lineComment": "//", 5 | // symbols used for start and end a block comment. Remove this entry if your language does not support block comments 6 | "blockComment": ["/*", "*/"] 7 | }, 8 | // symbols used as brackets 9 | "brackets": [ 10 | ["{", "}"], 11 | ["[", "]"], 12 | ["(", ")"] 13 | ], 14 | // symbols that are auto closed when typing 15 | "autoClosingPairs": [ 16 | ["{", "}"], 17 | ["[", "]"], 18 | ["(", ")"], 19 | ["\"", "\""], 20 | ["'", "'"] 21 | ], 22 | // symbols that can be used to surround a selection 23 | "surroundingPairs": [ 24 | ["{", "}"], 25 | ["[", "]"], 26 | ["(", ")"], 27 | ["\"", "\""], 28 | ["'", "'"] 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /language/teal.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", 3 | "name": "TEAL (Algorand) Language Features", 4 | "patterns": [ 5 | { 6 | "include": "#comments" 7 | }, 8 | { 9 | "include": "#keywords" 10 | }, 11 | { 12 | "include": "#labels" 13 | }, 14 | { 15 | "include": "#pragmas" 16 | }, 17 | { 18 | "include": "#invalid" 19 | } 20 | ], 21 | "repository": { 22 | "comments": { 23 | "name": "comment.line.teal", 24 | "begin": "//", 25 | "end": "$" 26 | }, 27 | "keywords": { 28 | "patterns": [ 29 | { 30 | "match": "\\b(base64|b64|base32|b32)(?:\\(|\\s+)([a-zA-Z0-9\\+\\/\\=]+)(?:\\)|\\s?|$)", 31 | "captures": { 32 | "1": { 33 | "name": "keyword.other.unit.teal" 34 | }, 35 | "2": { 36 | "name": "string.quoted.triple.teal" 37 | } 38 | } 39 | }, 40 | { 41 | "match": "^(addr)\\s+([A-Z2-7\\=]+)", 42 | "captures": { 43 | "1": { 44 | "name": "keyword.other.teal" 45 | }, 46 | "2": { 47 | "name": "string.unquoted.teal" 48 | } 49 | } 50 | }, 51 | { 52 | "name": "keyword.other.teal", 53 | "match": "^(int|byte|addr|intcblock|intc|intc_0|intc_1|intc_2|intc_3|pushint|bytecblock|bytec|bytec_0|bytec_1|bytec_2|bytec_3|pushbytes|arg|arg_0|arg_1|arg_2|arg_3|txn|gtxn|txna|gtxna|gtxnas|gtxns|gtxnsa|gtxnsas|global|load|loads|store|stores|gload|gloads|args|log|itxn|itxna|txnas|cover|uncover|extract|itxn_submit|itxn_begin|itxn_field|itxn_next|gitxn|gitxna|gloadss|itxnas|gitxnas)\\b" 54 | }, 55 | { 56 | "name": "keyword.control.teal", 57 | "match": "^(err|bnz|bz|b|return|pop|dup|dup2|dig|swap|select|assert|callsub|retsub|gaid|gaids)\\b" 58 | }, 59 | { 60 | "name": "keyword.other.unit.teal", 61 | "match": "^(balance|min_balance|app_opted_in|app_local_get|app_local_get_ex|app_global_get|app_global_get_ex|app_local_put|app_global_put|app_local_del|app_global_del|asset_holding_get|asset_params_get|app_params_get|sha256|keccak256|sha512_256|ed25519verify|\\\u003c|\\\u003e|\\\u003c\\=|\\\u003e\\=|\u0026\u0026|len|itob|btoi|%|\\|\u0026|mulw|addw|divmodw|getbit|setbit|getbyte|setbyte|concat|substring|substring3|bitlen|ecdsa_verify|ecdsa_pk_decompress|ecdsa_pk_recover|extract3|extract_uint16|extract_uint32|extract_uint64|\\+|\\-|\\*|\\/|<=|>=|<|>|&&|\\|\\||==|!=|!|%|\\||&|\\^|~|b+|b==|b!=|b|b-|b*|b/|b%|b<|b>|b^|b&|b~|bzero|shl|shr|sqrt|exp|expw|acct_params_get|divw|bsqrt)\\s?$" 62 | }, 63 | { 64 | "name": "string.quoted.double.teal", 65 | "match": "\\b(?\u003c=byte\\s+)(0x[0-9]+)\\b" 66 | }, 67 | { 68 | "name": "support.function.teal", 69 | "match": "\\b(Sender|Fee|FirstValid|FirstValidTime|LastValid|Note|Lease|Receiver|Amount|CloseRemainderTo|VotePK|SelectionPK|VoteFirst|VoteLast|VoteKeyDilution|Type|TypeEnum|XferAsset|AssetAmount|AssetSender|AssetReceiver|AssetCloseTo|GroupIndex|TxID|ApplicationID|OnCompletion|ApplicationArgs|NumAppArgs|Accounts|NumAccounts|ApprovalProgram|ClearStateProgram|RekeyTo|ConfigAsset|ConfigAssetTotal|ConfigAssetDecimals|ConfigAssetDefaultFrozen|ConfigAssetUnitName|ConfigAssetName|ConfigAssetURL|ConfigAssetMetadataHash|ConfigAssetManager|ConfigAssetReserve|ConfigAssetFreeze|ConfigAssetClawback|FreezeAsset|FreezeAssetAccount|FreezeAssetFrozen|Assets|NumAssets|Applications|NumApplications|GlobalNumUint|GlobalNumByteSlice|LocalNumUint|LocalNumByteSlice|AssetBalance|AssetFrozen|AssetTotal|AssetDecimals|AssetDefaultFrozen|AssetUnitName|AssetName|AssetURL|AssetMetadataHash|AssetManager|AssetReserve|AssetFreeze|AssetClawback|AssetCreator|NoOp|OptIn|CloseOut|ClearState|UpdateApplication|DeleteApplication|Nonparticipation|Logs|NumLogs|CreatedAssetID|LastLog|StateProofPK)\\b" 70 | }, 71 | { 72 | "name": "support.class.teal", 73 | "match": "\\b(ZeroAddress|MinTxnFee|MinBalance|MaxTxnLife|GroupSize|LogicSigVersion|Round|LatestTimestamp|CurrentApplicationID|CurrentApplicationAddress|GroupID|CreatorAddress|pay|keyreg|acfg|axfer|afrz|appl|unknown|OpcodeBudget|CallerApplicationID|CallerApplicationAddresss)\\s?" 74 | }, 75 | { 76 | "match": "^(app_params_get)(?:\\(|\\s+)(AppApprovalProgram|AppClearStateProgram|AppGlobalNumUint|AppGlobalNumByteSlice|AppLocalNumUint|AppLocalNumByteSlice|AppExtraProgramPages|AppCreator|AppAddress)(?:\\)|\\s?|$)", 77 | "captures": { 78 | "1": { 79 | "name": "keyword.other.unit.teal" 80 | }, 81 | "2": { 82 | "name": "support.class.teal" 83 | } 84 | } 85 | } 86 | ] 87 | }, 88 | "labels": { 89 | "patterns": [ 90 | { 91 | "name": "support.control.teal", 92 | "match": "^\\w+:.*$" 93 | } 94 | ] 95 | }, 96 | "pragmas": { 97 | "name": "support.type.object.module.teal", 98 | "match": "^#pragma\\b.*$" 99 | }, 100 | "invalid": { 101 | "patterns": [ 102 | { 103 | "name": "invalid.illegal.teal", 104 | "match": "^\\s+.*$" 105 | } 106 | ] 107 | } 108 | }, 109 | "scopeName": "source.teal" 110 | } 111 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "teal-debugger-extension", 3 | "version": "0.0.0", 4 | "displayName": "TEAL debugger", 5 | "publisher": "optio-labs", 6 | "description": "A TEAL debugger extension for Visual Studio code", 7 | "icon": "images/icon.png", 8 | "author": "ashley@codecapers.com.au", 9 | "license": "SEE LICENSE IN LICENSE.md", 10 | "bugs": { 11 | "url": "https://github.com/hone-labs/teal-debugger-extension/issues", 12 | "email": "ashley@codecapers.com.au" 13 | }, 14 | "homepage": "https://github.com/hone-labs/teal-debugger-extension", 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/hone-labs/teal-debugger-extension.git" 18 | }, 19 | "engines": { 20 | "vscode": "^1.60.0" 21 | }, 22 | "categories": [ 23 | "Programming Languages", 24 | "Debuggers" 25 | ], 26 | "activationEvents": [ 27 | "onCommand:teal-debugger-extension.helloWorld", 28 | "onDebug" 29 | ], 30 | "main": "./dist/extension.js", 31 | "contributes": { 32 | "commands": [ 33 | { 34 | "command": "teal-debugger-extension.helloWorld", 35 | "title": "Hello World" 36 | } 37 | ], 38 | "languages": [ 39 | { 40 | "id": "teal", 41 | "extensions": [ 42 | ".teal" 43 | ], 44 | "aliases": [ 45 | "Teal", 46 | "teal", 47 | "TEAL" 48 | ], 49 | "configuration": "./language/language-configuration.json" 50 | } 51 | ], 52 | "grammars": [ 53 | { 54 | "language": "teal", 55 | "scopeName": "source.teal", 56 | "path": "./language/teal.tmLanguage.json" 57 | } 58 | ], 59 | "breakpoints": [ 60 | { 61 | "language": "teal" 62 | } 63 | ], 64 | "debuggers": [ 65 | { 66 | "type": "teal", 67 | "label": "Debug TEAL code", 68 | "program": "./out/debugAdapter.js", 69 | "languages": [ 70 | "teal" 71 | ], 72 | "configurationAttributes": { 73 | "launch": { 74 | "required": [ 75 | "program" 76 | ], 77 | "properties": { 78 | "program": { 79 | "type": "string", 80 | "description": "Absolute path to a text file.", 81 | "default": "${file}" 82 | }, 83 | "stopOnEntry": { 84 | "type": "boolean", 85 | "description": "Automatically stop after launch.", 86 | "default": true 87 | } 88 | } 89 | } 90 | }, 91 | "initialConfigurations": [ 92 | { 93 | "type": "teal", 94 | "request": "launch", 95 | "name": "Debug TEAL code", 96 | "program": "${file}", 97 | "stopOnEntry": true 98 | } 99 | ] 100 | } 101 | ] 102 | }, 103 | "scripts": { 104 | "vscode:prepublish": "npm run bundle", 105 | "compile": "webpack", 106 | "watch": "webpack --watch", 107 | "bundle": "webpack --mode production --devtool hidden-source-map", 108 | "compile-tests": "tsc -p . --outDir out", 109 | "watch-tests": "tsc -p -w . --outDir out", 110 | "pretest": "npm run compile-tests && npm run compile", 111 | "test": "node ./out/test/runTest.js", 112 | "package": "vsce package", 113 | "publish": "vsce publish" 114 | }, 115 | "devDependencies": { 116 | "@types/fs-extra": "^9.0.13", 117 | "@types/glob": "^7.1.4", 118 | "@types/mocha": "^9.0.0", 119 | "@types/node": "14.x", 120 | "@types/superagent": "^4.1.13", 121 | "@types/vscode": "^1.60.0", 122 | "@vscode/test-electron": "^1.6.2", 123 | "glob": "^7.1.7", 124 | "mocha": "^9.1.1", 125 | "ts-loader": "^9.2.5", 126 | "typescript": "^4.4.3", 127 | "vsce": "^2.5.0", 128 | "webpack": "^5.61.0", 129 | "webpack-cli": "^4.9.1" 130 | }, 131 | "dependencies": { 132 | "fs-extra": "^10.0.0", 133 | "json5": "^2.2.0", 134 | "teal-interpreter": "^0.0.39", 135 | "vscode-debugadapter": "^1.49.0", 136 | "vscode-debugprotocol": "^1.49.0", 137 | "yaml": "^1.10.2" 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@types/fs-extra': ^9.0.13 5 | '@types/glob': ^7.1.4 6 | '@types/mocha': ^9.0.0 7 | '@types/node': 14.x 8 | '@types/superagent': ^4.1.13 9 | '@types/vscode': ^1.60.0 10 | '@vscode/test-electron': ^1.6.2 11 | fs-extra: ^10.0.0 12 | glob: ^7.1.7 13 | json5: ^2.2.0 14 | mocha: ^9.1.1 15 | teal-interpreter: ^0.0.39 16 | ts-loader: ^9.2.5 17 | typescript: ^4.4.3 18 | vsce: ^2.5.0 19 | vscode-debugadapter: ^1.49.0 20 | vscode-debugprotocol: ^1.49.0 21 | webpack: ^5.61.0 22 | webpack-cli: ^4.9.1 23 | yaml: ^1.10.2 24 | 25 | dependencies: 26 | fs-extra: 10.0.1 27 | json5: 2.2.0 28 | teal-interpreter: 0.0.39 29 | vscode-debugadapter: 1.51.0 30 | vscode-debugprotocol: 1.51.0 31 | yaml: 1.10.2 32 | 33 | devDependencies: 34 | '@types/fs-extra': 9.0.13 35 | '@types/glob': 7.2.0 36 | '@types/mocha': 9.1.0 37 | '@types/node': 14.18.12 38 | '@types/superagent': 4.1.15 39 | '@types/vscode': 1.65.0 40 | '@vscode/test-electron': 1.6.2 41 | glob: 7.2.0 42 | mocha: 9.2.2 43 | ts-loader: 9.2.8_typescript@4.6.2+webpack@5.70.0 44 | typescript: 4.6.2 45 | vsce: 2.7.0 46 | webpack: 5.70.0_webpack-cli@4.9.2 47 | webpack-cli: 4.9.2_webpack@5.70.0 48 | 49 | packages: 50 | 51 | /@discoveryjs/json-ext/0.5.7: 52 | resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} 53 | engines: {node: '>=10.0.0'} 54 | dev: true 55 | 56 | /@tootallnate/once/1.1.2: 57 | resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 58 | engines: {node: '>= 6'} 59 | dev: true 60 | 61 | /@types/cookiejar/2.1.2: 62 | resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} 63 | dev: true 64 | 65 | /@types/eslint-scope/3.7.3: 66 | resolution: {integrity: sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==} 67 | dependencies: 68 | '@types/eslint': 8.4.1 69 | '@types/estree': 0.0.51 70 | dev: true 71 | 72 | /@types/eslint/8.4.1: 73 | resolution: {integrity: sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==} 74 | dependencies: 75 | '@types/estree': 0.0.51 76 | '@types/json-schema': 7.0.9 77 | dev: true 78 | 79 | /@types/estree/0.0.51: 80 | resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} 81 | dev: true 82 | 83 | /@types/fs-extra/9.0.13: 84 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} 85 | dependencies: 86 | '@types/node': 14.18.12 87 | dev: true 88 | 89 | /@types/glob/7.2.0: 90 | resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} 91 | dependencies: 92 | '@types/minimatch': 3.0.5 93 | '@types/node': 14.18.12 94 | dev: true 95 | 96 | /@types/json-schema/7.0.9: 97 | resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} 98 | dev: true 99 | 100 | /@types/minimatch/3.0.5: 101 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 102 | dev: true 103 | 104 | /@types/mocha/9.1.0: 105 | resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} 106 | dev: true 107 | 108 | /@types/node/14.18.12: 109 | resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==} 110 | dev: true 111 | 112 | /@types/superagent/4.1.15: 113 | resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} 114 | dependencies: 115 | '@types/cookiejar': 2.1.2 116 | '@types/node': 14.18.12 117 | dev: true 118 | 119 | /@types/vscode/1.65.0: 120 | resolution: {integrity: sha512-wQhExnh2nEzpjDMSKhUvnNmz3ucpd3E+R7wJkOhBNK3No6fG3VUdmVmMOKD0A8NDZDDDiQcLNxe3oGmX5SjJ5w==} 121 | dev: true 122 | 123 | /@ungap/promise-all-settled/1.1.2: 124 | resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} 125 | dev: true 126 | 127 | /@vscode/test-electron/1.6.2: 128 | resolution: {integrity: sha512-W01ajJEMx6223Y7J5yaajGjVs1QfW3YGkkOJHVKfAMEqNB1ZHN9wCcViehv5ZwVSSJnjhu6lYEYgwBdHtCxqhQ==} 129 | engines: {node: '>=8.9.3'} 130 | dependencies: 131 | http-proxy-agent: 4.0.1 132 | https-proxy-agent: 5.0.0 133 | rimraf: 3.0.2 134 | unzipper: 0.10.11 135 | transitivePeerDependencies: 136 | - supports-color 137 | dev: true 138 | 139 | /@webassemblyjs/ast/1.11.1: 140 | resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} 141 | dependencies: 142 | '@webassemblyjs/helper-numbers': 1.11.1 143 | '@webassemblyjs/helper-wasm-bytecode': 1.11.1 144 | dev: true 145 | 146 | /@webassemblyjs/floating-point-hex-parser/1.11.1: 147 | resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} 148 | dev: true 149 | 150 | /@webassemblyjs/helper-api-error/1.11.1: 151 | resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} 152 | dev: true 153 | 154 | /@webassemblyjs/helper-buffer/1.11.1: 155 | resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} 156 | dev: true 157 | 158 | /@webassemblyjs/helper-numbers/1.11.1: 159 | resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} 160 | dependencies: 161 | '@webassemblyjs/floating-point-hex-parser': 1.11.1 162 | '@webassemblyjs/helper-api-error': 1.11.1 163 | '@xtuc/long': 4.2.2 164 | dev: true 165 | 166 | /@webassemblyjs/helper-wasm-bytecode/1.11.1: 167 | resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} 168 | dev: true 169 | 170 | /@webassemblyjs/helper-wasm-section/1.11.1: 171 | resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} 172 | dependencies: 173 | '@webassemblyjs/ast': 1.11.1 174 | '@webassemblyjs/helper-buffer': 1.11.1 175 | '@webassemblyjs/helper-wasm-bytecode': 1.11.1 176 | '@webassemblyjs/wasm-gen': 1.11.1 177 | dev: true 178 | 179 | /@webassemblyjs/ieee754/1.11.1: 180 | resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} 181 | dependencies: 182 | '@xtuc/ieee754': 1.2.0 183 | dev: true 184 | 185 | /@webassemblyjs/leb128/1.11.1: 186 | resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} 187 | dependencies: 188 | '@xtuc/long': 4.2.2 189 | dev: true 190 | 191 | /@webassemblyjs/utf8/1.11.1: 192 | resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} 193 | dev: true 194 | 195 | /@webassemblyjs/wasm-edit/1.11.1: 196 | resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} 197 | dependencies: 198 | '@webassemblyjs/ast': 1.11.1 199 | '@webassemblyjs/helper-buffer': 1.11.1 200 | '@webassemblyjs/helper-wasm-bytecode': 1.11.1 201 | '@webassemblyjs/helper-wasm-section': 1.11.1 202 | '@webassemblyjs/wasm-gen': 1.11.1 203 | '@webassemblyjs/wasm-opt': 1.11.1 204 | '@webassemblyjs/wasm-parser': 1.11.1 205 | '@webassemblyjs/wast-printer': 1.11.1 206 | dev: true 207 | 208 | /@webassemblyjs/wasm-gen/1.11.1: 209 | resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} 210 | dependencies: 211 | '@webassemblyjs/ast': 1.11.1 212 | '@webassemblyjs/helper-wasm-bytecode': 1.11.1 213 | '@webassemblyjs/ieee754': 1.11.1 214 | '@webassemblyjs/leb128': 1.11.1 215 | '@webassemblyjs/utf8': 1.11.1 216 | dev: true 217 | 218 | /@webassemblyjs/wasm-opt/1.11.1: 219 | resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} 220 | dependencies: 221 | '@webassemblyjs/ast': 1.11.1 222 | '@webassemblyjs/helper-buffer': 1.11.1 223 | '@webassemblyjs/wasm-gen': 1.11.1 224 | '@webassemblyjs/wasm-parser': 1.11.1 225 | dev: true 226 | 227 | /@webassemblyjs/wasm-parser/1.11.1: 228 | resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} 229 | dependencies: 230 | '@webassemblyjs/ast': 1.11.1 231 | '@webassemblyjs/helper-api-error': 1.11.1 232 | '@webassemblyjs/helper-wasm-bytecode': 1.11.1 233 | '@webassemblyjs/ieee754': 1.11.1 234 | '@webassemblyjs/leb128': 1.11.1 235 | '@webassemblyjs/utf8': 1.11.1 236 | dev: true 237 | 238 | /@webassemblyjs/wast-printer/1.11.1: 239 | resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} 240 | dependencies: 241 | '@webassemblyjs/ast': 1.11.1 242 | '@xtuc/long': 4.2.2 243 | dev: true 244 | 245 | /@webpack-cli/configtest/1.1.1_webpack-cli@4.9.2+webpack@5.70.0: 246 | resolution: {integrity: sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==} 247 | peerDependencies: 248 | webpack: 4.x.x || 5.x.x 249 | webpack-cli: 4.x.x 250 | dependencies: 251 | webpack: 5.70.0_webpack-cli@4.9.2 252 | webpack-cli: 4.9.2_webpack@5.70.0 253 | dev: true 254 | 255 | /@webpack-cli/info/1.4.1_webpack-cli@4.9.2: 256 | resolution: {integrity: sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==} 257 | peerDependencies: 258 | webpack-cli: 4.x.x 259 | dependencies: 260 | envinfo: 7.8.1 261 | webpack-cli: 4.9.2_webpack@5.70.0 262 | dev: true 263 | 264 | /@webpack-cli/serve/1.6.1_webpack-cli@4.9.2: 265 | resolution: {integrity: sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==} 266 | peerDependencies: 267 | webpack-cli: 4.x.x 268 | webpack-dev-server: '*' 269 | peerDependenciesMeta: 270 | webpack-dev-server: 271 | optional: true 272 | dependencies: 273 | webpack-cli: 4.9.2_webpack@5.70.0 274 | dev: true 275 | 276 | /@xtuc/ieee754/1.2.0: 277 | resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} 278 | dev: true 279 | 280 | /@xtuc/long/4.2.2: 281 | resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 282 | dev: true 283 | 284 | /acorn-import-assertions/1.8.0_acorn@8.7.0: 285 | resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} 286 | peerDependencies: 287 | acorn: ^8 288 | dependencies: 289 | acorn: 8.7.0 290 | dev: true 291 | 292 | /acorn/8.7.0: 293 | resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} 294 | engines: {node: '>=0.4.0'} 295 | hasBin: true 296 | dev: true 297 | 298 | /agent-base/6.0.2: 299 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 300 | engines: {node: '>= 6.0.0'} 301 | dependencies: 302 | debug: 4.3.3 303 | transitivePeerDependencies: 304 | - supports-color 305 | dev: true 306 | 307 | /ajv-keywords/3.5.2_ajv@6.12.6: 308 | resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} 309 | peerDependencies: 310 | ajv: ^6.9.1 311 | dependencies: 312 | ajv: 6.12.6 313 | dev: true 314 | 315 | /ajv/6.12.6: 316 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 317 | dependencies: 318 | fast-deep-equal: 3.1.3 319 | fast-json-stable-stringify: 2.1.0 320 | json-schema-traverse: 0.4.1 321 | uri-js: 4.4.1 322 | dev: true 323 | 324 | /algo-msgpack-with-bigint/2.1.1: 325 | resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} 326 | engines: {node: '>= 10'} 327 | dev: false 328 | 329 | /algosdk/1.18.0: 330 | resolution: {integrity: sha512-+baSG0IrcZf2Qt35HyQF7wAkOykEW2iMhghUa/tcFNu4dMcvv41AUPRrB1T/bKq6dsb4OvbCzCEHAdaztBp32w==} 331 | dependencies: 332 | algo-msgpack-with-bigint: 2.1.1 333 | buffer: 6.0.3 334 | hi-base32: 0.5.1 335 | js-sha256: 0.9.0 336 | js-sha3: 0.8.0 337 | js-sha512: 0.8.0 338 | json-bigint: 1.0.0 339 | superagent: 6.1.0 340 | tweetnacl: 1.0.3 341 | url-parse: 1.5.10 342 | transitivePeerDependencies: 343 | - supports-color 344 | dev: false 345 | 346 | /ansi-colors/4.1.1: 347 | resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} 348 | engines: {node: '>=6'} 349 | dev: true 350 | 351 | /ansi-regex/2.1.1: 352 | resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} 353 | engines: {node: '>=0.10.0'} 354 | dev: true 355 | 356 | /ansi-regex/5.0.1: 357 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 358 | engines: {node: '>=8'} 359 | dev: true 360 | 361 | /ansi-styles/3.2.1: 362 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 363 | engines: {node: '>=4'} 364 | dependencies: 365 | color-convert: 1.9.3 366 | dev: true 367 | 368 | /ansi-styles/4.3.0: 369 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 370 | engines: {node: '>=8'} 371 | dependencies: 372 | color-convert: 2.0.1 373 | dev: true 374 | 375 | /anymatch/3.1.2: 376 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 377 | engines: {node: '>= 8'} 378 | dependencies: 379 | normalize-path: 3.0.0 380 | picomatch: 2.3.1 381 | dev: true 382 | 383 | /aproba/1.2.0: 384 | resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} 385 | dev: true 386 | 387 | /are-we-there-yet/1.1.7: 388 | resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} 389 | dependencies: 390 | delegates: 1.0.0 391 | readable-stream: 2.3.7 392 | dev: true 393 | 394 | /argparse/2.0.1: 395 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 396 | dev: true 397 | 398 | /asynckit/0.4.0: 399 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 400 | dev: false 401 | 402 | /azure-devops-node-api/11.1.1: 403 | resolution: {integrity: sha512-XDG91XzLZ15reP12s3jFkKS8oiagSICjnLwxEYieme4+4h3ZveFOFRA4iYIG40RyHXsiI0mefFYYMFIJbMpWcg==} 404 | dependencies: 405 | tunnel: 0.0.6 406 | typed-rest-client: 1.8.6 407 | dev: true 408 | 409 | /balanced-match/1.0.2: 410 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 411 | dev: true 412 | 413 | /base64-js/1.5.1: 414 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 415 | 416 | /big-integer/1.6.51: 417 | resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} 418 | engines: {node: '>=0.6'} 419 | dev: true 420 | 421 | /bignumber.js/9.0.2: 422 | resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==} 423 | dev: false 424 | 425 | /binary-extensions/2.2.0: 426 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 427 | engines: {node: '>=8'} 428 | dev: true 429 | 430 | /binary/0.3.0: 431 | resolution: {integrity: sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=} 432 | dependencies: 433 | buffers: 0.1.1 434 | chainsaw: 0.1.0 435 | dev: true 436 | 437 | /bl/4.1.0: 438 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 439 | dependencies: 440 | buffer: 5.7.1 441 | inherits: 2.0.4 442 | readable-stream: 3.6.0 443 | dev: true 444 | 445 | /bluebird/3.4.7: 446 | resolution: {integrity: sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=} 447 | dev: true 448 | 449 | /bn.js/4.12.0: 450 | resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} 451 | dev: false 452 | 453 | /boolbase/1.0.0: 454 | resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} 455 | dev: true 456 | 457 | /brace-expansion/1.1.11: 458 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 459 | dependencies: 460 | balanced-match: 1.0.2 461 | concat-map: 0.0.1 462 | dev: true 463 | 464 | /braces/3.0.2: 465 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 466 | engines: {node: '>=8'} 467 | dependencies: 468 | fill-range: 7.0.1 469 | dev: true 470 | 471 | /brorand/1.1.0: 472 | resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} 473 | dev: false 474 | 475 | /browser-stdout/1.3.1: 476 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 477 | dev: true 478 | 479 | /browserslist/4.20.0: 480 | resolution: {integrity: sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==} 481 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 482 | hasBin: true 483 | dependencies: 484 | caniuse-lite: 1.0.30001316 485 | electron-to-chromium: 1.4.83 486 | escalade: 3.1.1 487 | node-releases: 2.0.2 488 | picocolors: 1.0.0 489 | dev: true 490 | 491 | /buffer-crc32/0.2.13: 492 | resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} 493 | dev: true 494 | 495 | /buffer-from/1.1.2: 496 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 497 | dev: true 498 | 499 | /buffer-indexof-polyfill/1.0.2: 500 | resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} 501 | engines: {node: '>=0.10'} 502 | dev: true 503 | 504 | /buffer/5.7.1: 505 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 506 | dependencies: 507 | base64-js: 1.5.1 508 | ieee754: 1.2.1 509 | dev: true 510 | 511 | /buffer/6.0.3: 512 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 513 | dependencies: 514 | base64-js: 1.5.1 515 | ieee754: 1.2.1 516 | dev: false 517 | 518 | /buffers/0.1.1: 519 | resolution: {integrity: sha1-skV5w77U1tOWru5tmorn9Ugqt7s=} 520 | engines: {node: '>=0.2.0'} 521 | dev: true 522 | 523 | /call-bind/1.0.2: 524 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 525 | dependencies: 526 | function-bind: 1.1.1 527 | get-intrinsic: 1.1.1 528 | 529 | /camelcase/6.3.0: 530 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 531 | engines: {node: '>=10'} 532 | dev: true 533 | 534 | /caniuse-lite/1.0.30001316: 535 | resolution: {integrity: sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==} 536 | dev: true 537 | 538 | /chainsaw/0.1.0: 539 | resolution: {integrity: sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=} 540 | dependencies: 541 | traverse: 0.3.9 542 | dev: true 543 | 544 | /chalk/2.4.2: 545 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 546 | engines: {node: '>=4'} 547 | dependencies: 548 | ansi-styles: 3.2.1 549 | escape-string-regexp: 1.0.5 550 | supports-color: 5.5.0 551 | dev: true 552 | 553 | /chalk/4.1.2: 554 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 555 | engines: {node: '>=10'} 556 | dependencies: 557 | ansi-styles: 4.3.0 558 | supports-color: 7.2.0 559 | dev: true 560 | 561 | /cheerio-select/1.5.0: 562 | resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==} 563 | dependencies: 564 | css-select: 4.2.1 565 | css-what: 5.1.0 566 | domelementtype: 2.2.0 567 | domhandler: 4.3.0 568 | domutils: 2.8.0 569 | dev: true 570 | 571 | /cheerio/1.0.0-rc.10: 572 | resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} 573 | engines: {node: '>= 6'} 574 | dependencies: 575 | cheerio-select: 1.5.0 576 | dom-serializer: 1.3.2 577 | domhandler: 4.3.0 578 | htmlparser2: 6.1.0 579 | parse5: 6.0.1 580 | parse5-htmlparser2-tree-adapter: 6.0.1 581 | tslib: 2.3.1 582 | dev: true 583 | 584 | /chokidar/3.5.3: 585 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 586 | engines: {node: '>= 8.10.0'} 587 | dependencies: 588 | anymatch: 3.1.2 589 | braces: 3.0.2 590 | glob-parent: 5.1.2 591 | is-binary-path: 2.1.0 592 | is-glob: 4.0.3 593 | normalize-path: 3.0.0 594 | readdirp: 3.6.0 595 | optionalDependencies: 596 | fsevents: 2.3.2 597 | dev: true 598 | 599 | /chownr/1.1.4: 600 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 601 | dev: true 602 | 603 | /chrome-trace-event/1.0.3: 604 | resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} 605 | engines: {node: '>=6.0'} 606 | dev: true 607 | 608 | /cliui/7.0.4: 609 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 610 | dependencies: 611 | string-width: 4.2.3 612 | strip-ansi: 6.0.1 613 | wrap-ansi: 7.0.0 614 | dev: true 615 | 616 | /clone-deep/4.0.1: 617 | resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} 618 | engines: {node: '>=6'} 619 | dependencies: 620 | is-plain-object: 2.0.4 621 | kind-of: 6.0.3 622 | shallow-clone: 3.0.1 623 | dev: true 624 | 625 | /code-point-at/1.1.0: 626 | resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} 627 | engines: {node: '>=0.10.0'} 628 | dev: true 629 | 630 | /color-convert/1.9.3: 631 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 632 | dependencies: 633 | color-name: 1.1.3 634 | dev: true 635 | 636 | /color-convert/2.0.1: 637 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 638 | engines: {node: '>=7.0.0'} 639 | dependencies: 640 | color-name: 1.1.4 641 | dev: true 642 | 643 | /color-name/1.1.3: 644 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 645 | dev: true 646 | 647 | /color-name/1.1.4: 648 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 649 | dev: true 650 | 651 | /colorette/2.0.16: 652 | resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} 653 | dev: true 654 | 655 | /combined-stream/1.0.8: 656 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 657 | engines: {node: '>= 0.8'} 658 | dependencies: 659 | delayed-stream: 1.0.0 660 | dev: false 661 | 662 | /commander/2.20.3: 663 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 664 | dev: true 665 | 666 | /commander/6.2.1: 667 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} 668 | engines: {node: '>= 6'} 669 | dev: true 670 | 671 | /commander/7.2.0: 672 | resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 673 | engines: {node: '>= 10'} 674 | dev: true 675 | 676 | /component-emitter/1.3.0: 677 | resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} 678 | dev: false 679 | 680 | /concat-map/0.0.1: 681 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 682 | dev: true 683 | 684 | /console-control-strings/1.1.0: 685 | resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} 686 | dev: true 687 | 688 | /cookiejar/2.1.3: 689 | resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==} 690 | dev: false 691 | 692 | /core-util-is/1.0.3: 693 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 694 | dev: true 695 | 696 | /cross-spawn/7.0.3: 697 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 698 | engines: {node: '>= 8'} 699 | dependencies: 700 | path-key: 3.1.1 701 | shebang-command: 2.0.0 702 | which: 2.0.2 703 | dev: true 704 | 705 | /css-select/4.2.1: 706 | resolution: {integrity: sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==} 707 | dependencies: 708 | boolbase: 1.0.0 709 | css-what: 5.1.0 710 | domhandler: 4.3.0 711 | domutils: 2.8.0 712 | nth-check: 2.0.1 713 | dev: true 714 | 715 | /css-what/5.1.0: 716 | resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} 717 | engines: {node: '>= 6'} 718 | dev: true 719 | 720 | /debug/4.3.3: 721 | resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 722 | engines: {node: '>=6.0'} 723 | peerDependencies: 724 | supports-color: '*' 725 | peerDependenciesMeta: 726 | supports-color: 727 | optional: true 728 | dependencies: 729 | ms: 2.1.2 730 | 731 | /debug/4.3.3_supports-color@8.1.1: 732 | resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 733 | engines: {node: '>=6.0'} 734 | peerDependencies: 735 | supports-color: '*' 736 | peerDependenciesMeta: 737 | supports-color: 738 | optional: true 739 | dependencies: 740 | ms: 2.1.2 741 | supports-color: 8.1.1 742 | dev: true 743 | 744 | /decamelize/4.0.0: 745 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 746 | engines: {node: '>=10'} 747 | dev: true 748 | 749 | /decompress-response/6.0.0: 750 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 751 | engines: {node: '>=10'} 752 | dependencies: 753 | mimic-response: 3.1.0 754 | dev: true 755 | 756 | /deep-extend/0.6.0: 757 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 758 | engines: {node: '>=4.0.0'} 759 | dev: true 760 | 761 | /delayed-stream/1.0.0: 762 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 763 | engines: {node: '>=0.4.0'} 764 | dev: false 765 | 766 | /delegates/1.0.0: 767 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} 768 | dev: true 769 | 770 | /detect-libc/2.0.1: 771 | resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} 772 | engines: {node: '>=8'} 773 | dev: true 774 | 775 | /diff/5.0.0: 776 | resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} 777 | engines: {node: '>=0.3.1'} 778 | dev: true 779 | 780 | /dom-serializer/1.3.2: 781 | resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} 782 | dependencies: 783 | domelementtype: 2.2.0 784 | domhandler: 4.3.0 785 | entities: 2.2.0 786 | dev: true 787 | 788 | /domelementtype/2.2.0: 789 | resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} 790 | dev: true 791 | 792 | /domhandler/4.3.0: 793 | resolution: {integrity: sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==} 794 | engines: {node: '>= 4'} 795 | dependencies: 796 | domelementtype: 2.2.0 797 | dev: true 798 | 799 | /domutils/2.8.0: 800 | resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} 801 | dependencies: 802 | dom-serializer: 1.3.2 803 | domelementtype: 2.2.0 804 | domhandler: 4.3.0 805 | dev: true 806 | 807 | /duplexer2/0.1.4: 808 | resolution: {integrity: sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=} 809 | dependencies: 810 | readable-stream: 2.3.7 811 | dev: true 812 | 813 | /electron-to-chromium/1.4.83: 814 | resolution: {integrity: sha512-Wm15TA5pLMOHtsik6uQTVyzXG8IpkVxnXAoAqV4+6zbJH3n5qnVz3iNAW+65r6WSrrYo0w6B8JJ0lcv2NhSmXQ==} 815 | dev: true 816 | 817 | /elliptic/6.5.4: 818 | resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} 819 | dependencies: 820 | bn.js: 4.12.0 821 | brorand: 1.1.0 822 | hash.js: 1.1.7 823 | hmac-drbg: 1.0.1 824 | inherits: 2.0.4 825 | minimalistic-assert: 1.0.1 826 | minimalistic-crypto-utils: 1.0.1 827 | dev: false 828 | 829 | /emoji-regex/8.0.0: 830 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 831 | dev: true 832 | 833 | /end-of-stream/1.4.4: 834 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 835 | dependencies: 836 | once: 1.4.0 837 | dev: true 838 | 839 | /enhanced-resolve/5.9.2: 840 | resolution: {integrity: sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==} 841 | engines: {node: '>=10.13.0'} 842 | dependencies: 843 | graceful-fs: 4.2.9 844 | tapable: 2.2.1 845 | dev: true 846 | 847 | /entities/2.1.0: 848 | resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} 849 | dev: true 850 | 851 | /entities/2.2.0: 852 | resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} 853 | dev: true 854 | 855 | /envinfo/7.8.1: 856 | resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} 857 | engines: {node: '>=4'} 858 | hasBin: true 859 | dev: true 860 | 861 | /es-module-lexer/0.9.3: 862 | resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} 863 | dev: true 864 | 865 | /escalade/3.1.1: 866 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 867 | engines: {node: '>=6'} 868 | dev: true 869 | 870 | /escape-string-regexp/1.0.5: 871 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 872 | engines: {node: '>=0.8.0'} 873 | dev: true 874 | 875 | /escape-string-regexp/4.0.0: 876 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 877 | engines: {node: '>=10'} 878 | dev: true 879 | 880 | /eslint-scope/5.1.1: 881 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 882 | engines: {node: '>=8.0.0'} 883 | dependencies: 884 | esrecurse: 4.3.0 885 | estraverse: 4.3.0 886 | dev: true 887 | 888 | /esrecurse/4.3.0: 889 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 890 | engines: {node: '>=4.0'} 891 | dependencies: 892 | estraverse: 5.3.0 893 | dev: true 894 | 895 | /estraverse/4.3.0: 896 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 897 | engines: {node: '>=4.0'} 898 | dev: true 899 | 900 | /estraverse/5.3.0: 901 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 902 | engines: {node: '>=4.0'} 903 | dev: true 904 | 905 | /events/3.3.0: 906 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 907 | engines: {node: '>=0.8.x'} 908 | dev: true 909 | 910 | /execa/5.1.1: 911 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 912 | engines: {node: '>=10'} 913 | dependencies: 914 | cross-spawn: 7.0.3 915 | get-stream: 6.0.1 916 | human-signals: 2.1.0 917 | is-stream: 2.0.1 918 | merge-stream: 2.0.0 919 | npm-run-path: 4.0.1 920 | onetime: 5.1.2 921 | signal-exit: 3.0.7 922 | strip-final-newline: 2.0.0 923 | dev: true 924 | 925 | /expand-template/2.0.3: 926 | resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 927 | engines: {node: '>=6'} 928 | dev: true 929 | 930 | /fast-deep-equal/3.1.3: 931 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 932 | dev: true 933 | 934 | /fast-json-stable-stringify/2.1.0: 935 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 936 | dev: true 937 | 938 | /fast-safe-stringify/2.1.1: 939 | resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} 940 | dev: false 941 | 942 | /fastest-levenshtein/1.0.12: 943 | resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} 944 | dev: true 945 | 946 | /fd-slicer/1.1.0: 947 | resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} 948 | dependencies: 949 | pend: 1.2.0 950 | dev: true 951 | 952 | /fill-range/7.0.1: 953 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 954 | engines: {node: '>=8'} 955 | dependencies: 956 | to-regex-range: 5.0.1 957 | dev: true 958 | 959 | /find-up/4.1.0: 960 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 961 | engines: {node: '>=8'} 962 | dependencies: 963 | locate-path: 5.0.0 964 | path-exists: 4.0.0 965 | dev: true 966 | 967 | /find-up/5.0.0: 968 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 969 | engines: {node: '>=10'} 970 | dependencies: 971 | locate-path: 6.0.0 972 | path-exists: 4.0.0 973 | dev: true 974 | 975 | /flat/5.0.2: 976 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 977 | hasBin: true 978 | dev: true 979 | 980 | /form-data/3.0.1: 981 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 982 | engines: {node: '>= 6'} 983 | dependencies: 984 | asynckit: 0.4.0 985 | combined-stream: 1.0.8 986 | mime-types: 2.1.35 987 | dev: false 988 | 989 | /formidable/1.2.6: 990 | resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} 991 | deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' 992 | dev: false 993 | 994 | /fs-constants/1.0.0: 995 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 996 | dev: true 997 | 998 | /fs-extra/10.0.1: 999 | resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==} 1000 | engines: {node: '>=12'} 1001 | dependencies: 1002 | graceful-fs: 4.2.9 1003 | jsonfile: 6.1.0 1004 | universalify: 2.0.0 1005 | dev: false 1006 | 1007 | /fs.realpath/1.0.0: 1008 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 1009 | dev: true 1010 | 1011 | /fsevents/2.3.2: 1012 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1013 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1014 | os: [darwin] 1015 | requiresBuild: true 1016 | dev: true 1017 | optional: true 1018 | 1019 | /fstream/1.0.12: 1020 | resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} 1021 | engines: {node: '>=0.6'} 1022 | dependencies: 1023 | graceful-fs: 4.2.9 1024 | inherits: 2.0.4 1025 | mkdirp: 0.5.5 1026 | rimraf: 2.7.1 1027 | dev: true 1028 | 1029 | /function-bind/1.1.1: 1030 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1031 | 1032 | /gauge/2.7.4: 1033 | resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=} 1034 | dependencies: 1035 | aproba: 1.2.0 1036 | console-control-strings: 1.1.0 1037 | has-unicode: 2.0.1 1038 | object-assign: 4.1.1 1039 | signal-exit: 3.0.7 1040 | string-width: 1.0.2 1041 | strip-ansi: 3.0.1 1042 | wide-align: 1.1.5 1043 | dev: true 1044 | 1045 | /get-caller-file/2.0.5: 1046 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1047 | engines: {node: 6.* || 8.* || >= 10.*} 1048 | dev: true 1049 | 1050 | /get-intrinsic/1.1.1: 1051 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 1052 | dependencies: 1053 | function-bind: 1.1.1 1054 | has: 1.0.3 1055 | has-symbols: 1.0.3 1056 | 1057 | /get-stream/6.0.1: 1058 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1059 | engines: {node: '>=10'} 1060 | dev: true 1061 | 1062 | /github-from-package/0.0.0: 1063 | resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} 1064 | dev: true 1065 | 1066 | /glob-parent/5.1.2: 1067 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1068 | engines: {node: '>= 6'} 1069 | dependencies: 1070 | is-glob: 4.0.3 1071 | dev: true 1072 | 1073 | /glob-to-regexp/0.4.1: 1074 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 1075 | dev: true 1076 | 1077 | /glob/7.2.0: 1078 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 1079 | dependencies: 1080 | fs.realpath: 1.0.0 1081 | inflight: 1.0.6 1082 | inherits: 2.0.4 1083 | minimatch: 3.1.2 1084 | once: 1.4.0 1085 | path-is-absolute: 1.0.1 1086 | dev: true 1087 | 1088 | /graceful-fs/4.2.9: 1089 | resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} 1090 | 1091 | /growl/1.10.5: 1092 | resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} 1093 | engines: {node: '>=4.x'} 1094 | dev: true 1095 | 1096 | /has-flag/3.0.0: 1097 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 1098 | engines: {node: '>=4'} 1099 | dev: true 1100 | 1101 | /has-flag/4.0.0: 1102 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1103 | engines: {node: '>=8'} 1104 | dev: true 1105 | 1106 | /has-symbols/1.0.3: 1107 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1108 | engines: {node: '>= 0.4'} 1109 | 1110 | /has-unicode/2.0.1: 1111 | resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} 1112 | dev: true 1113 | 1114 | /has/1.0.3: 1115 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1116 | engines: {node: '>= 0.4.0'} 1117 | dependencies: 1118 | function-bind: 1.1.1 1119 | 1120 | /hash.js/1.1.7: 1121 | resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} 1122 | dependencies: 1123 | inherits: 2.0.4 1124 | minimalistic-assert: 1.0.1 1125 | dev: false 1126 | 1127 | /he/1.2.0: 1128 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1129 | hasBin: true 1130 | dev: true 1131 | 1132 | /hi-base32/0.5.1: 1133 | resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} 1134 | dev: false 1135 | 1136 | /hmac-drbg/1.0.1: 1137 | resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} 1138 | dependencies: 1139 | hash.js: 1.1.7 1140 | minimalistic-assert: 1.0.1 1141 | minimalistic-crypto-utils: 1.0.1 1142 | dev: false 1143 | 1144 | /hosted-git-info/4.1.0: 1145 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 1146 | engines: {node: '>=10'} 1147 | dependencies: 1148 | lru-cache: 6.0.0 1149 | dev: true 1150 | 1151 | /htmlparser2/6.1.0: 1152 | resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} 1153 | dependencies: 1154 | domelementtype: 2.2.0 1155 | domhandler: 4.3.0 1156 | domutils: 2.8.0 1157 | entities: 2.2.0 1158 | dev: true 1159 | 1160 | /http-proxy-agent/4.0.1: 1161 | resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 1162 | engines: {node: '>= 6'} 1163 | dependencies: 1164 | '@tootallnate/once': 1.1.2 1165 | agent-base: 6.0.2 1166 | debug: 4.3.3 1167 | transitivePeerDependencies: 1168 | - supports-color 1169 | dev: true 1170 | 1171 | /https-proxy-agent/5.0.0: 1172 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} 1173 | engines: {node: '>= 6'} 1174 | dependencies: 1175 | agent-base: 6.0.2 1176 | debug: 4.3.3 1177 | transitivePeerDependencies: 1178 | - supports-color 1179 | dev: true 1180 | 1181 | /human-signals/2.1.0: 1182 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1183 | engines: {node: '>=10.17.0'} 1184 | dev: true 1185 | 1186 | /ieee754/1.2.1: 1187 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1188 | 1189 | /import-local/3.1.0: 1190 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 1191 | engines: {node: '>=8'} 1192 | hasBin: true 1193 | dependencies: 1194 | pkg-dir: 4.2.0 1195 | resolve-cwd: 3.0.0 1196 | dev: true 1197 | 1198 | /inflight/1.0.6: 1199 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 1200 | dependencies: 1201 | once: 1.4.0 1202 | wrappy: 1.0.2 1203 | dev: true 1204 | 1205 | /inherits/2.0.4: 1206 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1207 | 1208 | /ini/1.3.8: 1209 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1210 | dev: true 1211 | 1212 | /interpret/2.2.0: 1213 | resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} 1214 | engines: {node: '>= 0.10'} 1215 | dev: true 1216 | 1217 | /is-binary-path/2.1.0: 1218 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1219 | engines: {node: '>=8'} 1220 | dependencies: 1221 | binary-extensions: 2.2.0 1222 | dev: true 1223 | 1224 | /is-core-module/2.8.1: 1225 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 1226 | dependencies: 1227 | has: 1.0.3 1228 | dev: true 1229 | 1230 | /is-extglob/2.1.1: 1231 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 1232 | engines: {node: '>=0.10.0'} 1233 | dev: true 1234 | 1235 | /is-fullwidth-code-point/1.0.0: 1236 | resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} 1237 | engines: {node: '>=0.10.0'} 1238 | dependencies: 1239 | number-is-nan: 1.0.1 1240 | dev: true 1241 | 1242 | /is-fullwidth-code-point/3.0.0: 1243 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1244 | engines: {node: '>=8'} 1245 | dev: true 1246 | 1247 | /is-glob/4.0.3: 1248 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1249 | engines: {node: '>=0.10.0'} 1250 | dependencies: 1251 | is-extglob: 2.1.1 1252 | dev: true 1253 | 1254 | /is-number/7.0.0: 1255 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1256 | engines: {node: '>=0.12.0'} 1257 | dev: true 1258 | 1259 | /is-plain-obj/2.1.0: 1260 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1261 | engines: {node: '>=8'} 1262 | dev: true 1263 | 1264 | /is-plain-object/2.0.4: 1265 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1266 | engines: {node: '>=0.10.0'} 1267 | dependencies: 1268 | isobject: 3.0.1 1269 | dev: true 1270 | 1271 | /is-stream/2.0.1: 1272 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1273 | engines: {node: '>=8'} 1274 | dev: true 1275 | 1276 | /is-unicode-supported/0.1.0: 1277 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1278 | engines: {node: '>=10'} 1279 | dev: true 1280 | 1281 | /isarray/1.0.0: 1282 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 1283 | dev: true 1284 | 1285 | /isexe/2.0.0: 1286 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1287 | dev: true 1288 | 1289 | /isobject/3.0.1: 1290 | resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} 1291 | engines: {node: '>=0.10.0'} 1292 | dev: true 1293 | 1294 | /jest-worker/27.5.1: 1295 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 1296 | engines: {node: '>= 10.13.0'} 1297 | dependencies: 1298 | '@types/node': 14.18.12 1299 | merge-stream: 2.0.0 1300 | supports-color: 8.1.1 1301 | dev: true 1302 | 1303 | /js-sha256/0.9.0: 1304 | resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} 1305 | dev: false 1306 | 1307 | /js-sha3/0.8.0: 1308 | resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} 1309 | dev: false 1310 | 1311 | /js-sha512/0.8.0: 1312 | resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} 1313 | dev: false 1314 | 1315 | /js-yaml/4.1.0: 1316 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1317 | hasBin: true 1318 | dependencies: 1319 | argparse: 2.0.1 1320 | dev: true 1321 | 1322 | /json-bigint/1.0.0: 1323 | resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} 1324 | dependencies: 1325 | bignumber.js: 9.0.2 1326 | dev: false 1327 | 1328 | /json-parse-better-errors/1.0.2: 1329 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1330 | dev: true 1331 | 1332 | /json-schema-traverse/0.4.1: 1333 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1334 | dev: true 1335 | 1336 | /json5/2.2.0: 1337 | resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} 1338 | engines: {node: '>=6'} 1339 | hasBin: true 1340 | dependencies: 1341 | minimist: 1.2.5 1342 | dev: false 1343 | 1344 | /jsonfile/6.1.0: 1345 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1346 | dependencies: 1347 | universalify: 2.0.0 1348 | optionalDependencies: 1349 | graceful-fs: 4.2.9 1350 | dev: false 1351 | 1352 | /keytar/7.9.0: 1353 | resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} 1354 | requiresBuild: true 1355 | dependencies: 1356 | node-addon-api: 4.3.0 1357 | prebuild-install: 7.0.1 1358 | dev: true 1359 | 1360 | /kind-of/6.0.3: 1361 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1362 | engines: {node: '>=0.10.0'} 1363 | dev: true 1364 | 1365 | /leven/3.1.0: 1366 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1367 | engines: {node: '>=6'} 1368 | dev: true 1369 | 1370 | /linkify-it/3.0.3: 1371 | resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} 1372 | dependencies: 1373 | uc.micro: 1.0.6 1374 | dev: true 1375 | 1376 | /listenercount/1.0.1: 1377 | resolution: {integrity: sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=} 1378 | dev: true 1379 | 1380 | /loader-runner/4.2.0: 1381 | resolution: {integrity: sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==} 1382 | engines: {node: '>=6.11.5'} 1383 | dev: true 1384 | 1385 | /locate-path/5.0.0: 1386 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1387 | engines: {node: '>=8'} 1388 | dependencies: 1389 | p-locate: 4.1.0 1390 | dev: true 1391 | 1392 | /locate-path/6.0.0: 1393 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1394 | engines: {node: '>=10'} 1395 | dependencies: 1396 | p-locate: 5.0.0 1397 | dev: true 1398 | 1399 | /log-symbols/4.1.0: 1400 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1401 | engines: {node: '>=10'} 1402 | dependencies: 1403 | chalk: 4.1.2 1404 | is-unicode-supported: 0.1.0 1405 | dev: true 1406 | 1407 | /lru-cache/6.0.0: 1408 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1409 | engines: {node: '>=10'} 1410 | dependencies: 1411 | yallist: 4.0.0 1412 | 1413 | /markdown-it/12.3.2: 1414 | resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} 1415 | hasBin: true 1416 | dependencies: 1417 | argparse: 2.0.1 1418 | entities: 2.1.0 1419 | linkify-it: 3.0.3 1420 | mdurl: 1.0.1 1421 | uc.micro: 1.0.6 1422 | dev: true 1423 | 1424 | /mdurl/1.0.1: 1425 | resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=} 1426 | dev: true 1427 | 1428 | /merge-stream/2.0.0: 1429 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1430 | dev: true 1431 | 1432 | /methods/1.1.2: 1433 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1434 | engines: {node: '>= 0.6'} 1435 | dev: false 1436 | 1437 | /micromatch/4.0.4: 1438 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 1439 | engines: {node: '>=8.6'} 1440 | dependencies: 1441 | braces: 3.0.2 1442 | picomatch: 2.3.1 1443 | dev: true 1444 | 1445 | /mime-db/1.52.0: 1446 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1447 | engines: {node: '>= 0.6'} 1448 | 1449 | /mime-types/2.1.35: 1450 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1451 | engines: {node: '>= 0.6'} 1452 | dependencies: 1453 | mime-db: 1.52.0 1454 | 1455 | /mime/1.6.0: 1456 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1457 | engines: {node: '>=4'} 1458 | hasBin: true 1459 | dev: true 1460 | 1461 | /mime/2.6.0: 1462 | resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} 1463 | engines: {node: '>=4.0.0'} 1464 | hasBin: true 1465 | dev: false 1466 | 1467 | /mimic-fn/2.1.0: 1468 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1469 | engines: {node: '>=6'} 1470 | dev: true 1471 | 1472 | /mimic-response/3.1.0: 1473 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1474 | engines: {node: '>=10'} 1475 | dev: true 1476 | 1477 | /minimalistic-assert/1.0.1: 1478 | resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} 1479 | dev: false 1480 | 1481 | /minimalistic-crypto-utils/1.0.1: 1482 | resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} 1483 | dev: false 1484 | 1485 | /minimatch/3.1.2: 1486 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1487 | dependencies: 1488 | brace-expansion: 1.1.11 1489 | dev: true 1490 | 1491 | /minimatch/4.2.1: 1492 | resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} 1493 | engines: {node: '>=10'} 1494 | dependencies: 1495 | brace-expansion: 1.1.11 1496 | dev: true 1497 | 1498 | /minimist/1.2.5: 1499 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1500 | 1501 | /mkdirp-classic/0.5.3: 1502 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1503 | dev: true 1504 | 1505 | /mkdirp/0.5.5: 1506 | resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} 1507 | hasBin: true 1508 | dependencies: 1509 | minimist: 1.2.5 1510 | dev: true 1511 | 1512 | /mkdirp/1.0.4: 1513 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1514 | engines: {node: '>=10'} 1515 | hasBin: true 1516 | dev: false 1517 | 1518 | /mocha/9.2.2: 1519 | resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} 1520 | engines: {node: '>= 12.0.0'} 1521 | hasBin: true 1522 | dependencies: 1523 | '@ungap/promise-all-settled': 1.1.2 1524 | ansi-colors: 4.1.1 1525 | browser-stdout: 1.3.1 1526 | chokidar: 3.5.3 1527 | debug: 4.3.3_supports-color@8.1.1 1528 | diff: 5.0.0 1529 | escape-string-regexp: 4.0.0 1530 | find-up: 5.0.0 1531 | glob: 7.2.0 1532 | growl: 1.10.5 1533 | he: 1.2.0 1534 | js-yaml: 4.1.0 1535 | log-symbols: 4.1.0 1536 | minimatch: 4.2.1 1537 | ms: 2.1.3 1538 | nanoid: 3.3.1 1539 | serialize-javascript: 6.0.0 1540 | strip-json-comments: 3.1.1 1541 | supports-color: 8.1.1 1542 | which: 2.0.2 1543 | workerpool: 6.2.0 1544 | yargs: 16.2.0 1545 | yargs-parser: 20.2.4 1546 | yargs-unparser: 2.0.0 1547 | dev: true 1548 | 1549 | /ms/2.1.2: 1550 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1551 | 1552 | /ms/2.1.3: 1553 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1554 | dev: true 1555 | 1556 | /mute-stream/0.0.8: 1557 | resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} 1558 | dev: true 1559 | 1560 | /nanoid/3.3.1: 1561 | resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} 1562 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1563 | hasBin: true 1564 | dev: true 1565 | 1566 | /napi-build-utils/1.0.2: 1567 | resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} 1568 | dev: true 1569 | 1570 | /neo-async/2.6.2: 1571 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1572 | dev: true 1573 | 1574 | /node-abi/3.8.0: 1575 | resolution: {integrity: sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==} 1576 | engines: {node: '>=10'} 1577 | dependencies: 1578 | semver: 7.3.5 1579 | dev: true 1580 | 1581 | /node-addon-api/4.3.0: 1582 | resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} 1583 | dev: true 1584 | 1585 | /node-releases/2.0.2: 1586 | resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} 1587 | dev: true 1588 | 1589 | /normalize-path/3.0.0: 1590 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1591 | engines: {node: '>=0.10.0'} 1592 | dev: true 1593 | 1594 | /npm-run-path/4.0.1: 1595 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1596 | engines: {node: '>=8'} 1597 | dependencies: 1598 | path-key: 3.1.1 1599 | dev: true 1600 | 1601 | /npmlog/4.1.2: 1602 | resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} 1603 | dependencies: 1604 | are-we-there-yet: 1.1.7 1605 | console-control-strings: 1.1.0 1606 | gauge: 2.7.4 1607 | set-blocking: 2.0.0 1608 | dev: true 1609 | 1610 | /nth-check/2.0.1: 1611 | resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} 1612 | dependencies: 1613 | boolbase: 1.0.0 1614 | dev: true 1615 | 1616 | /number-is-nan/1.0.1: 1617 | resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} 1618 | engines: {node: '>=0.10.0'} 1619 | dev: true 1620 | 1621 | /object-assign/4.1.1: 1622 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 1623 | engines: {node: '>=0.10.0'} 1624 | dev: true 1625 | 1626 | /object-inspect/1.12.0: 1627 | resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} 1628 | 1629 | /once/1.4.0: 1630 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1631 | dependencies: 1632 | wrappy: 1.0.2 1633 | dev: true 1634 | 1635 | /onetime/5.1.2: 1636 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1637 | engines: {node: '>=6'} 1638 | dependencies: 1639 | mimic-fn: 2.1.0 1640 | dev: true 1641 | 1642 | /p-limit/2.3.0: 1643 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1644 | engines: {node: '>=6'} 1645 | dependencies: 1646 | p-try: 2.2.0 1647 | dev: true 1648 | 1649 | /p-limit/3.1.0: 1650 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1651 | engines: {node: '>=10'} 1652 | dependencies: 1653 | yocto-queue: 0.1.0 1654 | dev: true 1655 | 1656 | /p-locate/4.1.0: 1657 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1658 | engines: {node: '>=8'} 1659 | dependencies: 1660 | p-limit: 2.3.0 1661 | dev: true 1662 | 1663 | /p-locate/5.0.0: 1664 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1665 | engines: {node: '>=10'} 1666 | dependencies: 1667 | p-limit: 3.1.0 1668 | dev: true 1669 | 1670 | /p-try/2.2.0: 1671 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1672 | engines: {node: '>=6'} 1673 | dev: true 1674 | 1675 | /parse-semver/1.1.1: 1676 | resolution: {integrity: sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=} 1677 | dependencies: 1678 | semver: 5.7.1 1679 | dev: true 1680 | 1681 | /parse5-htmlparser2-tree-adapter/6.0.1: 1682 | resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} 1683 | dependencies: 1684 | parse5: 6.0.1 1685 | dev: true 1686 | 1687 | /parse5/6.0.1: 1688 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 1689 | dev: true 1690 | 1691 | /path-exists/4.0.0: 1692 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1693 | engines: {node: '>=8'} 1694 | dev: true 1695 | 1696 | /path-is-absolute/1.0.1: 1697 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1698 | engines: {node: '>=0.10.0'} 1699 | dev: true 1700 | 1701 | /path-key/3.1.1: 1702 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1703 | engines: {node: '>=8'} 1704 | dev: true 1705 | 1706 | /path-parse/1.0.7: 1707 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1708 | dev: true 1709 | 1710 | /pend/1.2.0: 1711 | resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} 1712 | dev: true 1713 | 1714 | /picocolors/1.0.0: 1715 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1716 | dev: true 1717 | 1718 | /picomatch/2.3.1: 1719 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1720 | engines: {node: '>=8.6'} 1721 | dev: true 1722 | 1723 | /pkg-dir/4.2.0: 1724 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1725 | engines: {node: '>=8'} 1726 | dependencies: 1727 | find-up: 4.1.0 1728 | dev: true 1729 | 1730 | /prebuild-install/7.0.1: 1731 | resolution: {integrity: sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==} 1732 | engines: {node: '>=10'} 1733 | hasBin: true 1734 | dependencies: 1735 | detect-libc: 2.0.1 1736 | expand-template: 2.0.3 1737 | github-from-package: 0.0.0 1738 | minimist: 1.2.5 1739 | mkdirp-classic: 0.5.3 1740 | napi-build-utils: 1.0.2 1741 | node-abi: 3.8.0 1742 | npmlog: 4.1.2 1743 | pump: 3.0.0 1744 | rc: 1.2.8 1745 | simple-get: 4.0.1 1746 | tar-fs: 2.1.1 1747 | tunnel-agent: 0.6.0 1748 | dev: true 1749 | 1750 | /process-nextick-args/2.0.1: 1751 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1752 | dev: true 1753 | 1754 | /pump/3.0.0: 1755 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1756 | dependencies: 1757 | end-of-stream: 1.4.4 1758 | once: 1.4.0 1759 | dev: true 1760 | 1761 | /punycode/2.1.1: 1762 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1763 | engines: {node: '>=6'} 1764 | dev: true 1765 | 1766 | /qs/6.10.3: 1767 | resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} 1768 | engines: {node: '>=0.6'} 1769 | dependencies: 1770 | side-channel: 1.0.4 1771 | 1772 | /querystringify/2.2.0: 1773 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 1774 | dev: false 1775 | 1776 | /randombytes/2.1.0: 1777 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1778 | dependencies: 1779 | safe-buffer: 5.2.1 1780 | dev: true 1781 | 1782 | /rc/1.2.8: 1783 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1784 | hasBin: true 1785 | dependencies: 1786 | deep-extend: 0.6.0 1787 | ini: 1.3.8 1788 | minimist: 1.2.5 1789 | strip-json-comments: 2.0.1 1790 | dev: true 1791 | 1792 | /read/1.0.7: 1793 | resolution: {integrity: sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=} 1794 | engines: {node: '>=0.8'} 1795 | dependencies: 1796 | mute-stream: 0.0.8 1797 | dev: true 1798 | 1799 | /readable-stream/2.3.7: 1800 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1801 | dependencies: 1802 | core-util-is: 1.0.3 1803 | inherits: 2.0.4 1804 | isarray: 1.0.0 1805 | process-nextick-args: 2.0.1 1806 | safe-buffer: 5.1.2 1807 | string_decoder: 1.1.1 1808 | util-deprecate: 1.0.2 1809 | dev: true 1810 | 1811 | /readable-stream/3.6.0: 1812 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1813 | engines: {node: '>= 6'} 1814 | dependencies: 1815 | inherits: 2.0.4 1816 | string_decoder: 1.3.0 1817 | util-deprecate: 1.0.2 1818 | 1819 | /readdirp/3.6.0: 1820 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1821 | engines: {node: '>=8.10.0'} 1822 | dependencies: 1823 | picomatch: 2.3.1 1824 | dev: true 1825 | 1826 | /rechoir/0.7.1: 1827 | resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} 1828 | engines: {node: '>= 0.10'} 1829 | dependencies: 1830 | resolve: 1.22.0 1831 | dev: true 1832 | 1833 | /require-directory/2.1.1: 1834 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1835 | engines: {node: '>=0.10.0'} 1836 | dev: true 1837 | 1838 | /requires-port/1.0.0: 1839 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 1840 | dev: false 1841 | 1842 | /resolve-cwd/3.0.0: 1843 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1844 | engines: {node: '>=8'} 1845 | dependencies: 1846 | resolve-from: 5.0.0 1847 | dev: true 1848 | 1849 | /resolve-from/5.0.0: 1850 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1851 | engines: {node: '>=8'} 1852 | dev: true 1853 | 1854 | /resolve/1.22.0: 1855 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 1856 | hasBin: true 1857 | dependencies: 1858 | is-core-module: 2.8.1 1859 | path-parse: 1.0.7 1860 | supports-preserve-symlinks-flag: 1.0.0 1861 | dev: true 1862 | 1863 | /rimraf/2.7.1: 1864 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1865 | hasBin: true 1866 | dependencies: 1867 | glob: 7.2.0 1868 | dev: true 1869 | 1870 | /rimraf/3.0.2: 1871 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1872 | hasBin: true 1873 | dependencies: 1874 | glob: 7.2.0 1875 | dev: true 1876 | 1877 | /safe-buffer/5.1.2: 1878 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1879 | dev: true 1880 | 1881 | /safe-buffer/5.2.1: 1882 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1883 | 1884 | /sax/1.2.4: 1885 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 1886 | dev: true 1887 | 1888 | /schema-utils/3.1.1: 1889 | resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} 1890 | engines: {node: '>= 10.13.0'} 1891 | dependencies: 1892 | '@types/json-schema': 7.0.9 1893 | ajv: 6.12.6 1894 | ajv-keywords: 3.5.2_ajv@6.12.6 1895 | dev: true 1896 | 1897 | /semver/5.7.1: 1898 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1899 | hasBin: true 1900 | dev: true 1901 | 1902 | /semver/7.3.5: 1903 | resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} 1904 | engines: {node: '>=10'} 1905 | hasBin: true 1906 | dependencies: 1907 | lru-cache: 6.0.0 1908 | 1909 | /serialize-javascript/6.0.0: 1910 | resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} 1911 | dependencies: 1912 | randombytes: 2.1.0 1913 | dev: true 1914 | 1915 | /set-blocking/2.0.0: 1916 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} 1917 | dev: true 1918 | 1919 | /setimmediate/1.0.5: 1920 | resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} 1921 | dev: true 1922 | 1923 | /sha3/2.1.4: 1924 | resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} 1925 | dependencies: 1926 | buffer: 6.0.3 1927 | dev: false 1928 | 1929 | /shallow-clone/3.0.1: 1930 | resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} 1931 | engines: {node: '>=8'} 1932 | dependencies: 1933 | kind-of: 6.0.3 1934 | dev: true 1935 | 1936 | /shebang-command/2.0.0: 1937 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1938 | engines: {node: '>=8'} 1939 | dependencies: 1940 | shebang-regex: 3.0.0 1941 | dev: true 1942 | 1943 | /shebang-regex/3.0.0: 1944 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1945 | engines: {node: '>=8'} 1946 | dev: true 1947 | 1948 | /side-channel/1.0.4: 1949 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1950 | dependencies: 1951 | call-bind: 1.0.2 1952 | get-intrinsic: 1.1.1 1953 | object-inspect: 1.12.0 1954 | 1955 | /signal-exit/3.0.7: 1956 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1957 | dev: true 1958 | 1959 | /simple-concat/1.0.1: 1960 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1961 | dev: true 1962 | 1963 | /simple-get/4.0.1: 1964 | resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 1965 | dependencies: 1966 | decompress-response: 6.0.0 1967 | once: 1.4.0 1968 | simple-concat: 1.0.1 1969 | dev: true 1970 | 1971 | /source-map-support/0.5.21: 1972 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1973 | dependencies: 1974 | buffer-from: 1.1.2 1975 | source-map: 0.6.1 1976 | dev: true 1977 | 1978 | /source-map/0.6.1: 1979 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1980 | engines: {node: '>=0.10.0'} 1981 | dev: true 1982 | 1983 | /source-map/0.7.3: 1984 | resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} 1985 | engines: {node: '>= 8'} 1986 | dev: true 1987 | 1988 | /string-width/1.0.2: 1989 | resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=} 1990 | engines: {node: '>=0.10.0'} 1991 | dependencies: 1992 | code-point-at: 1.1.0 1993 | is-fullwidth-code-point: 1.0.0 1994 | strip-ansi: 3.0.1 1995 | dev: true 1996 | 1997 | /string-width/4.2.3: 1998 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1999 | engines: {node: '>=8'} 2000 | dependencies: 2001 | emoji-regex: 8.0.0 2002 | is-fullwidth-code-point: 3.0.0 2003 | strip-ansi: 6.0.1 2004 | dev: true 2005 | 2006 | /string_decoder/1.1.1: 2007 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 2008 | dependencies: 2009 | safe-buffer: 5.1.2 2010 | dev: true 2011 | 2012 | /string_decoder/1.3.0: 2013 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2014 | dependencies: 2015 | safe-buffer: 5.2.1 2016 | 2017 | /strip-ansi/3.0.1: 2018 | resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} 2019 | engines: {node: '>=0.10.0'} 2020 | dependencies: 2021 | ansi-regex: 2.1.1 2022 | dev: true 2023 | 2024 | /strip-ansi/6.0.1: 2025 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2026 | engines: {node: '>=8'} 2027 | dependencies: 2028 | ansi-regex: 5.0.1 2029 | dev: true 2030 | 2031 | /strip-final-newline/2.0.0: 2032 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2033 | engines: {node: '>=6'} 2034 | dev: true 2035 | 2036 | /strip-json-comments/2.0.1: 2037 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} 2038 | engines: {node: '>=0.10.0'} 2039 | dev: true 2040 | 2041 | /strip-json-comments/3.1.1: 2042 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2043 | engines: {node: '>=8'} 2044 | dev: true 2045 | 2046 | /superagent/6.1.0: 2047 | resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} 2048 | engines: {node: '>= 7.0.0'} 2049 | deprecated: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . 2050 | dependencies: 2051 | component-emitter: 1.3.0 2052 | cookiejar: 2.1.3 2053 | debug: 4.3.3 2054 | fast-safe-stringify: 2.1.1 2055 | form-data: 3.0.1 2056 | formidable: 1.2.6 2057 | methods: 1.1.2 2058 | mime: 2.6.0 2059 | qs: 6.10.3 2060 | readable-stream: 3.6.0 2061 | semver: 7.3.5 2062 | transitivePeerDependencies: 2063 | - supports-color 2064 | dev: false 2065 | 2066 | /supports-color/5.5.0: 2067 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2068 | engines: {node: '>=4'} 2069 | dependencies: 2070 | has-flag: 3.0.0 2071 | dev: true 2072 | 2073 | /supports-color/7.2.0: 2074 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2075 | engines: {node: '>=8'} 2076 | dependencies: 2077 | has-flag: 4.0.0 2078 | dev: true 2079 | 2080 | /supports-color/8.1.1: 2081 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2082 | engines: {node: '>=10'} 2083 | dependencies: 2084 | has-flag: 4.0.0 2085 | dev: true 2086 | 2087 | /supports-preserve-symlinks-flag/1.0.0: 2088 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2089 | engines: {node: '>= 0.4'} 2090 | dev: true 2091 | 2092 | /tapable/2.2.1: 2093 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 2094 | engines: {node: '>=6'} 2095 | dev: true 2096 | 2097 | /tar-fs/2.1.1: 2098 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 2099 | dependencies: 2100 | chownr: 1.1.4 2101 | mkdirp-classic: 0.5.3 2102 | pump: 3.0.0 2103 | tar-stream: 2.2.0 2104 | dev: true 2105 | 2106 | /tar-stream/2.2.0: 2107 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 2108 | engines: {node: '>=6'} 2109 | dependencies: 2110 | bl: 4.1.0 2111 | end-of-stream: 1.4.4 2112 | fs-constants: 1.0.0 2113 | inherits: 2.0.4 2114 | readable-stream: 3.6.0 2115 | dev: true 2116 | 2117 | /teal-interpreter/0.0.39: 2118 | resolution: {integrity: sha512-nVA1DFOumAfiNrBAAutp6kuJFyUrl6JAm3xkeFfWDBl11GpHZBMppVOuBZ/jmbpge92UrL49nE3It+I5ZpUrpA==} 2119 | hasBin: true 2120 | dependencies: 2121 | algosdk: 1.18.0 2122 | elliptic: 6.5.4 2123 | fs-extra: 10.0.1 2124 | hi-base32: 0.5.1 2125 | js-sha256: 0.9.0 2126 | js-sha512: 0.8.0 2127 | minimist: 1.2.5 2128 | sha3: 2.1.4 2129 | transitivePeerDependencies: 2130 | - supports-color 2131 | dev: false 2132 | 2133 | /terser-webpack-plugin/5.3.1_webpack@5.70.0: 2134 | resolution: {integrity: sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==} 2135 | engines: {node: '>= 10.13.0'} 2136 | peerDependencies: 2137 | '@swc/core': '*' 2138 | esbuild: '*' 2139 | uglify-js: '*' 2140 | webpack: ^5.1.0 2141 | peerDependenciesMeta: 2142 | '@swc/core': 2143 | optional: true 2144 | esbuild: 2145 | optional: true 2146 | uglify-js: 2147 | optional: true 2148 | dependencies: 2149 | jest-worker: 27.5.1 2150 | schema-utils: 3.1.1 2151 | serialize-javascript: 6.0.0 2152 | source-map: 0.6.1 2153 | terser: 5.12.1 2154 | webpack: 5.70.0_webpack-cli@4.9.2 2155 | dev: true 2156 | 2157 | /terser/5.12.1: 2158 | resolution: {integrity: sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==} 2159 | engines: {node: '>=10'} 2160 | hasBin: true 2161 | dependencies: 2162 | acorn: 8.7.0 2163 | commander: 2.20.3 2164 | source-map: 0.7.3 2165 | source-map-support: 0.5.21 2166 | dev: true 2167 | 2168 | /tmp/0.2.1: 2169 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 2170 | engines: {node: '>=8.17.0'} 2171 | dependencies: 2172 | rimraf: 3.0.2 2173 | dev: true 2174 | 2175 | /to-regex-range/5.0.1: 2176 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2177 | engines: {node: '>=8.0'} 2178 | dependencies: 2179 | is-number: 7.0.0 2180 | dev: true 2181 | 2182 | /traverse/0.3.9: 2183 | resolution: {integrity: sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=} 2184 | dev: true 2185 | 2186 | /ts-loader/9.2.8_typescript@4.6.2+webpack@5.70.0: 2187 | resolution: {integrity: sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==} 2188 | engines: {node: '>=12.0.0'} 2189 | peerDependencies: 2190 | typescript: '*' 2191 | webpack: ^5.0.0 2192 | dependencies: 2193 | chalk: 4.1.2 2194 | enhanced-resolve: 5.9.2 2195 | micromatch: 4.0.4 2196 | semver: 7.3.5 2197 | typescript: 4.6.2 2198 | webpack: 5.70.0_webpack-cli@4.9.2 2199 | dev: true 2200 | 2201 | /tslib/2.3.1: 2202 | resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} 2203 | dev: true 2204 | 2205 | /tunnel-agent/0.6.0: 2206 | resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} 2207 | dependencies: 2208 | safe-buffer: 5.2.1 2209 | dev: true 2210 | 2211 | /tunnel/0.0.6: 2212 | resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} 2213 | engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} 2214 | dev: true 2215 | 2216 | /tweetnacl/1.0.3: 2217 | resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} 2218 | dev: false 2219 | 2220 | /typed-rest-client/1.8.6: 2221 | resolution: {integrity: sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==} 2222 | dependencies: 2223 | qs: 6.10.3 2224 | tunnel: 0.0.6 2225 | underscore: 1.13.2 2226 | dev: true 2227 | 2228 | /typescript/4.6.2: 2229 | resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} 2230 | engines: {node: '>=4.2.0'} 2231 | hasBin: true 2232 | dev: true 2233 | 2234 | /uc.micro/1.0.6: 2235 | resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} 2236 | dev: true 2237 | 2238 | /underscore/1.13.2: 2239 | resolution: {integrity: sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==} 2240 | dev: true 2241 | 2242 | /universalify/2.0.0: 2243 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 2244 | engines: {node: '>= 10.0.0'} 2245 | dev: false 2246 | 2247 | /unzipper/0.10.11: 2248 | resolution: {integrity: sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==} 2249 | dependencies: 2250 | big-integer: 1.6.51 2251 | binary: 0.3.0 2252 | bluebird: 3.4.7 2253 | buffer-indexof-polyfill: 1.0.2 2254 | duplexer2: 0.1.4 2255 | fstream: 1.0.12 2256 | graceful-fs: 4.2.9 2257 | listenercount: 1.0.1 2258 | readable-stream: 2.3.7 2259 | setimmediate: 1.0.5 2260 | dev: true 2261 | 2262 | /uri-js/4.4.1: 2263 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2264 | dependencies: 2265 | punycode: 2.1.1 2266 | dev: true 2267 | 2268 | /url-join/4.0.1: 2269 | resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} 2270 | dev: true 2271 | 2272 | /url-parse/1.5.10: 2273 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 2274 | dependencies: 2275 | querystringify: 2.2.0 2276 | requires-port: 1.0.0 2277 | dev: false 2278 | 2279 | /util-deprecate/1.0.2: 2280 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 2281 | 2282 | /vsce/2.7.0: 2283 | resolution: {integrity: sha512-CKU34wrQlbKDeJCRBkd1a8iwF9EvNxcYMg9hAUH6AxFGR6Wo2IKWwt3cJIcusHxx6XdjDHWlfAS/fJN30uvVnA==} 2284 | engines: {node: '>= 14'} 2285 | hasBin: true 2286 | dependencies: 2287 | azure-devops-node-api: 11.1.1 2288 | chalk: 2.4.2 2289 | cheerio: 1.0.0-rc.10 2290 | commander: 6.2.1 2291 | glob: 7.2.0 2292 | hosted-git-info: 4.1.0 2293 | keytar: 7.9.0 2294 | leven: 3.1.0 2295 | markdown-it: 12.3.2 2296 | mime: 1.6.0 2297 | minimatch: 3.1.2 2298 | parse-semver: 1.1.1 2299 | read: 1.0.7 2300 | semver: 5.7.1 2301 | tmp: 0.2.1 2302 | typed-rest-client: 1.8.6 2303 | url-join: 4.0.1 2304 | xml2js: 0.4.23 2305 | yauzl: 2.10.0 2306 | yazl: 2.5.1 2307 | dev: true 2308 | 2309 | /vscode-debugadapter/1.51.0: 2310 | resolution: {integrity: sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==} 2311 | deprecated: This package has been renamed to @vscode/debugadapter, please update to the new name 2312 | dependencies: 2313 | mkdirp: 1.0.4 2314 | vscode-debugprotocol: 1.51.0 2315 | dev: false 2316 | 2317 | /vscode-debugprotocol/1.51.0: 2318 | resolution: {integrity: sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==} 2319 | deprecated: This package has been renamed to @vscode/debugprotocol, please update to the new name 2320 | dev: false 2321 | 2322 | /watchpack/2.3.1: 2323 | resolution: {integrity: sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==} 2324 | engines: {node: '>=10.13.0'} 2325 | dependencies: 2326 | glob-to-regexp: 0.4.1 2327 | graceful-fs: 4.2.9 2328 | dev: true 2329 | 2330 | /webpack-cli/4.9.2_webpack@5.70.0: 2331 | resolution: {integrity: sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==} 2332 | engines: {node: '>=10.13.0'} 2333 | hasBin: true 2334 | peerDependencies: 2335 | '@webpack-cli/generators': '*' 2336 | '@webpack-cli/migrate': '*' 2337 | webpack: 4.x.x || 5.x.x 2338 | webpack-bundle-analyzer: '*' 2339 | webpack-dev-server: '*' 2340 | peerDependenciesMeta: 2341 | '@webpack-cli/generators': 2342 | optional: true 2343 | '@webpack-cli/migrate': 2344 | optional: true 2345 | webpack-bundle-analyzer: 2346 | optional: true 2347 | webpack-dev-server: 2348 | optional: true 2349 | dependencies: 2350 | '@discoveryjs/json-ext': 0.5.7 2351 | '@webpack-cli/configtest': 1.1.1_webpack-cli@4.9.2+webpack@5.70.0 2352 | '@webpack-cli/info': 1.4.1_webpack-cli@4.9.2 2353 | '@webpack-cli/serve': 1.6.1_webpack-cli@4.9.2 2354 | colorette: 2.0.16 2355 | commander: 7.2.0 2356 | execa: 5.1.1 2357 | fastest-levenshtein: 1.0.12 2358 | import-local: 3.1.0 2359 | interpret: 2.2.0 2360 | rechoir: 0.7.1 2361 | webpack: 5.70.0_webpack-cli@4.9.2 2362 | webpack-merge: 5.8.0 2363 | dev: true 2364 | 2365 | /webpack-merge/5.8.0: 2366 | resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} 2367 | engines: {node: '>=10.0.0'} 2368 | dependencies: 2369 | clone-deep: 4.0.1 2370 | wildcard: 2.0.0 2371 | dev: true 2372 | 2373 | /webpack-sources/3.2.3: 2374 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 2375 | engines: {node: '>=10.13.0'} 2376 | dev: true 2377 | 2378 | /webpack/5.70.0_webpack-cli@4.9.2: 2379 | resolution: {integrity: sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==} 2380 | engines: {node: '>=10.13.0'} 2381 | hasBin: true 2382 | peerDependencies: 2383 | webpack-cli: '*' 2384 | peerDependenciesMeta: 2385 | webpack-cli: 2386 | optional: true 2387 | dependencies: 2388 | '@types/eslint-scope': 3.7.3 2389 | '@types/estree': 0.0.51 2390 | '@webassemblyjs/ast': 1.11.1 2391 | '@webassemblyjs/wasm-edit': 1.11.1 2392 | '@webassemblyjs/wasm-parser': 1.11.1 2393 | acorn: 8.7.0 2394 | acorn-import-assertions: 1.8.0_acorn@8.7.0 2395 | browserslist: 4.20.0 2396 | chrome-trace-event: 1.0.3 2397 | enhanced-resolve: 5.9.2 2398 | es-module-lexer: 0.9.3 2399 | eslint-scope: 5.1.1 2400 | events: 3.3.0 2401 | glob-to-regexp: 0.4.1 2402 | graceful-fs: 4.2.9 2403 | json-parse-better-errors: 1.0.2 2404 | loader-runner: 4.2.0 2405 | mime-types: 2.1.35 2406 | neo-async: 2.6.2 2407 | schema-utils: 3.1.1 2408 | tapable: 2.2.1 2409 | terser-webpack-plugin: 5.3.1_webpack@5.70.0 2410 | watchpack: 2.3.1 2411 | webpack-cli: 4.9.2_webpack@5.70.0 2412 | webpack-sources: 3.2.3 2413 | transitivePeerDependencies: 2414 | - '@swc/core' 2415 | - esbuild 2416 | - uglify-js 2417 | dev: true 2418 | 2419 | /which/2.0.2: 2420 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2421 | engines: {node: '>= 8'} 2422 | hasBin: true 2423 | dependencies: 2424 | isexe: 2.0.0 2425 | dev: true 2426 | 2427 | /wide-align/1.1.5: 2428 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 2429 | dependencies: 2430 | string-width: 1.0.2 2431 | dev: true 2432 | 2433 | /wildcard/2.0.0: 2434 | resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} 2435 | dev: true 2436 | 2437 | /workerpool/6.2.0: 2438 | resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} 2439 | dev: true 2440 | 2441 | /wrap-ansi/7.0.0: 2442 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2443 | engines: {node: '>=10'} 2444 | dependencies: 2445 | ansi-styles: 4.3.0 2446 | string-width: 4.2.3 2447 | strip-ansi: 6.0.1 2448 | dev: true 2449 | 2450 | /wrappy/1.0.2: 2451 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 2452 | dev: true 2453 | 2454 | /xml2js/0.4.23: 2455 | resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} 2456 | engines: {node: '>=4.0.0'} 2457 | dependencies: 2458 | sax: 1.2.4 2459 | xmlbuilder: 11.0.1 2460 | dev: true 2461 | 2462 | /xmlbuilder/11.0.1: 2463 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 2464 | engines: {node: '>=4.0'} 2465 | dev: true 2466 | 2467 | /y18n/5.0.8: 2468 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2469 | engines: {node: '>=10'} 2470 | dev: true 2471 | 2472 | /yallist/4.0.0: 2473 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2474 | 2475 | /yaml/1.10.2: 2476 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2477 | engines: {node: '>= 6'} 2478 | dev: false 2479 | 2480 | /yargs-parser/20.2.4: 2481 | resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} 2482 | engines: {node: '>=10'} 2483 | dev: true 2484 | 2485 | /yargs-unparser/2.0.0: 2486 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 2487 | engines: {node: '>=10'} 2488 | dependencies: 2489 | camelcase: 6.3.0 2490 | decamelize: 4.0.0 2491 | flat: 5.0.2 2492 | is-plain-obj: 2.1.0 2493 | dev: true 2494 | 2495 | /yargs/16.2.0: 2496 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 2497 | engines: {node: '>=10'} 2498 | dependencies: 2499 | cliui: 7.0.4 2500 | escalade: 3.1.1 2501 | get-caller-file: 2.0.5 2502 | require-directory: 2.1.1 2503 | string-width: 4.2.3 2504 | y18n: 5.0.8 2505 | yargs-parser: 20.2.4 2506 | dev: true 2507 | 2508 | /yauzl/2.10.0: 2509 | resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} 2510 | dependencies: 2511 | buffer-crc32: 0.2.13 2512 | fd-slicer: 1.1.0 2513 | dev: true 2514 | 2515 | /yazl/2.5.1: 2516 | resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} 2517 | dependencies: 2518 | buffer-crc32: 0.2.13 2519 | dev: true 2520 | 2521 | /yocto-queue/0.1.0: 2522 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2523 | engines: {node: '>=10'} 2524 | dev: true 2525 | -------------------------------------------------------------------------------- /r.bat: -------------------------------------------------------------------------------- 1 | npm run %1 2 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { logCalls } from './lib/log-calls'; 3 | import { TealDebugAdaptor as TealDebugAdaptor } from './teal-debug-adaptor'; 4 | 5 | // this method is called when your extension is activated 6 | // your extension is activated the very first time the command is executed 7 | export function activate(context: vscode.ExtensionContext) { 8 | 9 | // Use the console to output diagnostic information (console.log) and errors (console.error) 10 | // This line of code will only be executed once when your extension is activated 11 | console.log(`Teal-debugger-extension is activated`); 12 | 13 | // The command has been defined in the package.json file 14 | // Now provide the implementation of the command with registerCommand 15 | // The commandId parameter must match the command field in package.json 16 | let disposable = vscode.commands.registerCommand('teal-debugger-extension.helloWorld', () => { 17 | // The code you place here will be executed every time your command is executed 18 | // Display a message box to the user 19 | vscode.window.showInformationMessage('Hello World from teal-debugger-extension!'); 20 | }); 21 | 22 | // 23 | // Register a configuration provider. 24 | // This allows us to start debuging without having a debug configuration in the project. 25 | // 26 | context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('teal', new DebugConfigurationProvider)); 27 | 28 | // 29 | // Register the factory that creates the debugger session for the 'teal' debugger. 30 | // 31 | context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory('teal', new DebugAdapterFactory())); 32 | 33 | context.subscriptions.push(disposable); 34 | } 35 | 36 | // this method is called when your extension is deactivated 37 | export function deactivate() {} 38 | 39 | class DebugAdapterFactory implements vscode.DebugAdapterDescriptorFactory { 40 | createDebugAdapterDescriptor(_session: vscode.DebugSession): vscode.ProviderResult { 41 | //return new vscode.DebugAdapterInlineImplementation(logCalls(new TealDebugAdaptor())); 42 | return new vscode.DebugAdapterInlineImplementation(new TealDebugAdaptor()); 43 | } 44 | } 45 | 46 | class DebugConfigurationProvider implements vscode.DebugConfigurationProvider { 47 | 48 | /** 49 | * Massage a debug configuration just before a debug session is being launched, 50 | * e.g. add all missing attributes to the debug configuration. 51 | */ 52 | resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult { 53 | 54 | if (!config.type && !config.request && !config.name) { 55 | // 56 | // Launch.json is missing or empty. 57 | // 58 | const editor = vscode.window.activeTextEditor; 59 | if (editor && editor.document.languageId === 'teal') { 60 | config.type = 'teal'; 61 | config.name = 'Launch'; 62 | config.request = 'launch'; 63 | config.program = '${file}'; 64 | config.stopOnEntry = true; 65 | } 66 | } 67 | 68 | if (!config.program) { 69 | return vscode.window.showInformationMessage("Cannot find a program to debug") 70 | .then(_ => { 71 | return undefined; // abort launch 72 | }); 73 | } 74 | 75 | return config; 76 | } 77 | } -------------------------------------------------------------------------------- /src/lib/file.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | const fs = vscode.workspace.fs; 3 | 4 | // 5 | // Returns true if a file exists. 6 | // 7 | export async function fileExists(path: string): Promise { 8 | try { 9 | await fs.stat(vscode.Uri.file(path)); 10 | return true; 11 | } 12 | catch { 13 | try { 14 | await fs.stat(vscode.Uri.parse(path)); 15 | return true; 16 | } 17 | catch { 18 | return false; 19 | } 20 | } 21 | } 22 | 23 | // 24 | // Writes a file to the VS Code workspace. 25 | // 26 | export async function writeFile(path: string, content: string): Promise { 27 | const uri = vscode.Uri.file(path); 28 | await fs.writeFile(uri, Buffer.from(content)); 29 | } 30 | 31 | // 32 | // Reads a file from the VS Code workspace. 33 | // 34 | export async function readFile(path: string): Promise { 35 | try { 36 | const uri = vscode.Uri.file(path); 37 | const bytes = await fs.readFile(uri); 38 | const contents = Buffer.from(bytes).toString('utf8'); 39 | return contents; 40 | } 41 | catch (err) { 42 | const uri = vscode.Uri.parse(path); 43 | const bytes = await fs.readFile(uri); 44 | const contents = Buffer.from(bytes).toString('utf8'); 45 | return contents; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/lib/log-calls.ts: -------------------------------------------------------------------------------- 1 | // 2 | // Create proxy to log all calls to functions a target object. 3 | // 4 | export function logCalls(target: any): any { 5 | return new Proxy(target, { 6 | get: (target, prop, receiver) => { 7 | let value = Reflect.get(target, prop, receiver); 8 | if (typeof value === "function") { 9 | // 10 | // Wrap the function in another function that can log the call. 11 | // 12 | return (...args: any[]) => { 13 | console.log(`>> ${value.name}(\r\n${args.map(stringify).join(",\r\n")})`); 14 | const result = Reflect.apply(value, target, args); 15 | console.log(`<< Returns: \r\n${JSON.stringify(result, null, 4)}`); 16 | return result; 17 | }; 18 | } 19 | return value; 20 | }, 21 | }); 22 | } 23 | 24 | // 25 | // Convert the incoming value to a string that can be displayed to the user. 26 | // 27 | function stringify(value: any): string { 28 | if (value === undefined) { 29 | return "undefined"; 30 | } 31 | if (typeof value === "function") { 32 | return ""; 33 | } 34 | else { 35 | return JSON.stringify(value, null, 4); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/teal-debug-adaptor.ts: -------------------------------------------------------------------------------- 1 | // 2 | // Provides TEAL debugging capabilities to VS Code. 3 | // 4 | 5 | import * as vscode from 'vscode'; 6 | import { ContinuedEvent, InitializedEvent, LoggingDebugSession, Scope, Source, StackFrame, StoppedEvent, TerminatedEvent, Thread } from 'vscode-debugadapter'; 7 | import { DebugProtocol } from 'vscode-debugprotocol'; 8 | import { TealRuntime } from './teal-runtime'; 9 | import * as path from "path"; 10 | import { isTypedValue } from "teal-interpreter"; 11 | 12 | /** 13 | * This interface describes the specific launch attributes. 14 | * (which are not part of the Debug Adapter Protocol). 15 | * The schema for these attributes lives in the package.json of this extension. 16 | * The interface should always match this schema. 17 | */ 18 | interface ILaunchRequestArguments extends DebugProtocol.LaunchRequestArguments { 19 | // 20 | // An absolute path to the "program" to debug. 21 | // 22 | program: string; 23 | 24 | // 25 | // Automatically stop target after launch. If not specified, target does not stop. 26 | // 27 | stopOnEntry?: boolean; 28 | } 29 | 30 | // 31 | // Don't support multiple threads, so we can use a hardcoded ID for the default thread 32 | // 33 | const THREAD_ID = 1; 34 | 35 | export class TealDebugAdaptor extends LoggingDebugSession { 36 | 37 | // 38 | // Runtime for compiling, running and debugging TEAL code. 39 | // 40 | private tealRuntime = new TealRuntime(); 41 | 42 | // 43 | // Cache of breakpoints that have been set. 44 | // Because they can be set before the interprter is initialised. 45 | // 46 | private breakpointsSet: { [index: string]: number[] } = {}; 47 | 48 | // 49 | // Set to true when running code. 50 | // 51 | private running: boolean = false; 52 | 53 | /** 54 | * Creates a new debug adapter that is used for one debug session. 55 | * We configure the default implementation of a debug adapter here. 56 | */ 57 | public constructor() { 58 | super("teal-debugger.txt"); 59 | 60 | console.log(`Created Teal debug adaptor.`); 61 | 62 | // 63 | // This debugger uses zero-based lines and columns. 64 | // 65 | this.setDebuggerLinesStartAt1(false); 66 | this.setDebuggerColumnsStartAt1(false); 67 | } 68 | 69 | // 70 | // The ‘initialize’ request is sent as the first request from the client to the debug adapter 71 | // in order to configure it with client capabilities and to retrieve capabilities from the debug adapter. 72 | // 73 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Initialize 74 | // 75 | protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { 76 | response.body = response.body || {}; 77 | 78 | this.sendResponse(response); 79 | 80 | // 81 | // This event indicates that the debug adapter is ready to accept configuration requests (e.g. SetBreakpointsRequest, SetExceptionBreakpointsRequest). 82 | // 83 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Initialize 84 | // 85 | this.sendEvent(new InitializedEvent()); 86 | } 87 | 88 | // 89 | // Start a debugging session. 90 | // 91 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Launch 92 | // 93 | protected async launchRequest(response: DebugProtocol.LaunchResponse, args: ILaunchRequestArguments) { 94 | 95 | console.log(`Launch request:`); 96 | console.log(args); 97 | 98 | try { 99 | await this.tealRuntime.start(args.program); 100 | this.updateBreakpoints(); 101 | 102 | if (args.stopOnEntry) { 103 | // 104 | // Tells VS Code that we have stopped on entry. 105 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Stopped 106 | // 107 | this.sendEvent(new StoppedEvent('entry', THREAD_ID)); 108 | } 109 | else { 110 | await this.tealRuntime.continue(); 111 | 112 | // 113 | // Debugging session has ended. 114 | // 115 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Terminated 116 | // 117 | this.sendEvent(new TerminatedEvent()); 118 | } 119 | 120 | this.sendResponse(response); 121 | } 122 | catch (err: any) { 123 | console.error(`An error occured starting the TEAL debugger:`); 124 | console.error(err && err.stack || err); 125 | 126 | const msg = err.message || err.toString(); 127 | 128 | this.sendErrorResponse(response, { 129 | id: 1001, 130 | format: msg, 131 | showUser: false 132 | }); 133 | 134 | await vscode.window.showErrorMessage(msg); 135 | } 136 | } 137 | 138 | // 139 | // Updates breakpoints into the interpreter. 140 | // 141 | private updateBreakpoints(): void { 142 | const path = this.tealRuntime.getLoadedFilePath(); 143 | if (path === undefined) { 144 | // No file is loaded yet. 145 | return; 146 | } 147 | 148 | const lines = this.breakpointsSet[path]; 149 | if (lines) { 150 | this.tealRuntime.setBreakpoints(lines); 151 | } 152 | } 153 | 154 | // 155 | // Sets multiple breakpoints for a single source and clears all previous breakpoints in that source. 156 | // 157 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_SetBreakpoints 158 | // 159 | protected setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): void { 160 | if (args.source.path !== undefined) { 161 | if (args.lines === undefined || args.lines.length === 0) { 162 | delete this.breakpointsSet[args.source.path]; 163 | } 164 | else { 165 | this.breakpointsSet[args.source.path] = args.lines; 166 | } 167 | 168 | this.updateBreakpoints(); 169 | } 170 | } 171 | 172 | // 173 | // The request retrieves a list of all threads. 174 | // We supports no threads so just return a default thread. 175 | // 176 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Threads 177 | // 178 | protected threadsRequest(response: DebugProtocol.ThreadsResponse): void { 179 | response.body = { 180 | threads: [ 181 | new Thread(THREAD_ID, "thread 1"), 182 | ], 183 | }; 184 | this.sendResponse(response); 185 | } 186 | 187 | // 188 | // The request returns a stacktrace from the current execution state of a given thread. 189 | // 190 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_StackTrace 191 | // 192 | protected stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): void { 193 | 194 | const filePath = this.tealRuntime.getLoadedFilePath(); 195 | if (filePath) { 196 | // https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source 197 | const source = new Source(path.basename(filePath), this.convertDebuggerPathToClient(filePath), undefined, undefined, undefined); 198 | const line = this.tealRuntime.getCurrentLine() !== undefined && this.convertDebuggerLineToClient(this.tealRuntime.getCurrentLine()!) || undefined; 199 | 200 | // https://microsoft.github.io/debug-adapter-protocol/specification#Types_StackFrame 201 | const stackFrame = new StackFrame(0, "main", source, line); 202 | 203 | response.body = { 204 | stackFrames: [ stackFrame ], // No function calls yet, so hardcoded to a single stack frame. 205 | totalFrames: 1, 206 | }; 207 | } 208 | else { 209 | response.body = { 210 | stackFrames: [], 211 | totalFrames: 0, 212 | }; 213 | } 214 | 215 | this.sendResponse(response); 216 | } 217 | 218 | // 219 | // Caches variables requests by id. 220 | // 221 | private dynamicVariableRequests: { [index: number]: string } = {}; 222 | 223 | // 224 | // Starting point for dynamic variable requests. 225 | // 226 | private nextDynamicVariableRequestId = 20000; 227 | 228 | // 229 | // The request returns the variable scopes for a given stackframe ID. 230 | // 231 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Scopes 232 | // 233 | protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void { 234 | 235 | // 236 | // Reset the request cache. 237 | // 238 | this.dynamicVariableRequests = {}; 239 | this.nextDynamicVariableRequestId = 20000; 240 | 241 | 242 | response.body = { 243 | scopes: [ 244 | new Scope("Data stack", this.registerVariableRequest("stack"), false), 245 | new Scope("Scratch memory", this.registerVariableRequest("scratch"), false), 246 | new Scope("Global state", this.registerVariableRequest("appGlobals"), false), 247 | new Scope("Global fields", this.registerVariableRequest("globals"), false), 248 | new Scope("Accounts", this.registerVariableRequest("accounts"), false), 249 | new Scope("Asset params", this.registerVariableRequest("assetParams"), false), 250 | new Scope("App params", this.registerVariableRequest("appParams"), false), 251 | new Scope("Txn", this.registerVariableRequest("txn"), false), 252 | new Scope("Gtxn", this.registerVariableRequest("Gtxn"), false), 253 | new Scope("Itxn", this.registerVariableRequest("Itxn"), false), 254 | new Scope("Last itxn", this.registerVariableRequest("lastItxn"), false), 255 | new Scope("Txn side effects", this.registerVariableRequest("txnSideEffects"), false), 256 | new Scope("Gaid", this.registerVariableRequest("gaid"), false), 257 | ], 258 | }; 259 | this.sendResponse(response); 260 | } 261 | 262 | // 263 | // Registers a variable request. 264 | // 265 | private registerVariableRequest(requestPath: string): number { 266 | const dynamicRequestId = this.nextDynamicVariableRequestId++; 267 | this.dynamicVariableRequests[dynamicRequestId] = requestPath; 268 | return dynamicRequestId; 269 | } 270 | 271 | // 272 | // Retrieves all child variables for the given variable reference. 273 | // 274 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Variables 275 | // 276 | protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments, request?: DebugProtocol.Request): Promise { 277 | 278 | const context = this.tealRuntime.getContext(); 279 | 280 | const requestPath = this.dynamicVariableRequests[args.variablesReference]; 281 | if (requestPath) { 282 | const parts = requestPath.split("/"); 283 | let working = context as any; 284 | for (const part of parts) { 285 | working = working[part]; 286 | } 287 | 288 | const variables: DebugProtocol.Variable[] = []; 289 | if (working) { 290 | for (const [name, value] of Object.entries(working)) { 291 | const valueType = typeof value; 292 | if (valueType === "number") { 293 | variables.push({ 294 | name: name, 295 | value: value.toString(), 296 | type: "number", 297 | variablesReference: 0, 298 | }); 299 | } 300 | else { 301 | const isValue = isTypedValue(value); 302 | if (isValue) { 303 | variables.push({ 304 | name: name, 305 | value: value.value.toString(), 306 | type: value.type, 307 | variablesReference: 0, 308 | }); 309 | } 310 | else { 311 | variables.push({ 312 | name: name, 313 | value: "", 314 | variablesReference: this.registerVariableRequest(`${requestPath}/${name}`), 315 | }); 316 | } 317 | } 318 | } 319 | } 320 | 321 | response.body = { variables: variables }; 322 | } 323 | 324 | this.sendResponse(response); 325 | } 326 | 327 | // 328 | // Continue running. 329 | // 330 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Continue 331 | protected async continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): Promise { 332 | 333 | if (this.running) { 334 | // 335 | // Already running, ignore other requests. 336 | // 337 | this.sendEvent(new StoppedEvent('step', THREAD_ID)); 338 | this.sendResponse(response); 339 | return; 340 | } 341 | 342 | try { 343 | this.running = true; 344 | 345 | if (await this.tealRuntime.continue()) { 346 | // 347 | // Debugging can continue. 348 | // 349 | // Tells VS Code that we have hit a breakpoint. 350 | // 351 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Stopped 352 | // 353 | this.sendEvent(new StoppedEvent('breakpoint', THREAD_ID)); 354 | } 355 | else { 356 | // 357 | // Debugging session has ended. 358 | // 359 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Terminated 360 | // 361 | this.sendEvent(new TerminatedEvent()); 362 | } 363 | 364 | this.sendResponse(response); 365 | } 366 | catch (err: any) { 367 | console.error(`An error occured in the TEAL debugger:`); 368 | console.error(err && err.stack || err); 369 | 370 | const msg = err.message || err.toString(); 371 | 372 | this.sendErrorResponse(response, { 373 | id: 1001, 374 | format: msg, 375 | showUser: false 376 | }); 377 | 378 | await vscode.window.showErrorMessage(msg); 379 | } 380 | finally { 381 | this.running = false; 382 | } 383 | } 384 | 385 | // 386 | // Run another step. 387 | // 388 | // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Next 389 | // 390 | protected async nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): Promise { 391 | 392 | if (this.running) { 393 | // 394 | // Already running, ignore other requests. 395 | // 396 | this.sendEvent(new StoppedEvent('step', THREAD_ID)); 397 | this.sendResponse(response); 398 | return; 399 | } 400 | 401 | try { 402 | this.running = true; 403 | 404 | if (await this.tealRuntime.step()) { 405 | // 406 | // Debugging can continue. 407 | // 408 | // Tells VS Code that we have stopped ater a step. 409 | // 410 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Stopped 411 | // 412 | this.sendEvent(new StoppedEvent('step', THREAD_ID)); 413 | } 414 | else { 415 | // 416 | // Debugging session has ended. 417 | // 418 | // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Terminated 419 | // 420 | this.sendEvent(new TerminatedEvent()); 421 | } 422 | 423 | this.sendResponse(response); 424 | } 425 | catch (err: any) { 426 | console.error(`An error occured stepping the TEAL debugger:`); 427 | console.error(err && err.stack || err); 428 | 429 | const msg = err.message || err.toString(); 430 | 431 | this.sendErrorResponse(response, { 432 | id: 1001, 433 | format: msg, 434 | showUser: false 435 | }); 436 | 437 | vscode.window.showErrorMessage(msg); 438 | } 439 | finally { 440 | this.running = false; 441 | } 442 | } 443 | } 444 | 445 | -------------------------------------------------------------------------------- /src/teal-runtime.ts: -------------------------------------------------------------------------------- 1 | // 2 | // A simplified wrapper for the teal runtime. 3 | // 4 | 5 | import * as vscode from 'vscode'; 6 | import { readFile, writeFile } from "./lib/file"; 7 | import JSON5 from "json5"; 8 | import { IExecutionContext, ITealInterpreterConfig, loadValue, TealInterpreter } from "teal-interpreter"; 9 | import * as path from "path"; 10 | import * as fs from "fs-extra"; 11 | import * as os from "os"; 12 | 13 | export class TealRuntime { 14 | 15 | // 16 | /// The path for the current loaded TEAL file. 17 | // 18 | private loadedTealFilePath?: string = undefined; 19 | 20 | // 21 | // The name of the configuration that is loaded. 22 | // 23 | private loadedConfigurationFilePath?: string = undefined;; 24 | 25 | // 26 | // The TEAL interpreter. 27 | // 28 | private interpreter = new TealInterpreter(); 29 | 30 | // 31 | // The name of the directory that contains TEAL debugger configuration files. 32 | // 33 | private readonly tealConfigDir = ".teal-debugger"; 34 | 35 | // 36 | // Gets the file path for the currently loaded TEAL file. 37 | // 38 | getLoadedFilePath(): string | undefined { 39 | return this.loadedTealFilePath; 40 | } 41 | 42 | // 43 | // Get the current line of the debugger. 44 | // 45 | getCurrentLine(): number | undefined { 46 | let curLineNo = this.interpreter.getCurLineNo(); 47 | if (curLineNo !== undefined) { 48 | curLineNo = curLineNo - 1; // Convert from 1-based to 0-based. 49 | } 50 | 51 | return curLineNo; 52 | } 53 | 54 | // 55 | // Sets breakpoints on the debugger. 56 | // Clears previously set breakpoints. 57 | // 58 | setBreakpoints(lines: number[]): void { 59 | this.interpreter.setBreakpoints(lines); 60 | } 61 | 62 | // 63 | // Get the execution context of the interpreter. 64 | // 65 | getContext(): IExecutionContext { 66 | return this.interpreter.context; 67 | } 68 | 69 | // 70 | // Starts a TEAL program in the runtime. 71 | // 72 | async start(tealFilePath: string): Promise { 73 | 74 | this.loadedTealFilePath = tealFilePath; 75 | 76 | const tealCode = await readFile(tealFilePath); 77 | const configuration = await this.loadConfiguration(tealFilePath); 78 | 79 | await this.configureInterpreter(configuration, tealCode); 80 | } 81 | 82 | // 83 | // Finds an untaken file name. 84 | // 85 | private async chooseNextAvailableFileName(dirPath: string, baseName: string, ext: string): Promise { 86 | let attempt = 0; 87 | while (true) { 88 | const nextPath = attempt === 0 89 | ? path.join(dirPath, `${baseName}.${ext}`) 90 | : path.join(dirPath, `${baseName}-${attempt}.${ext}`) 91 | if (await fs.pathExists(nextPath)) { 92 | attempt += 1; // Try next one along. 93 | } 94 | else { 95 | // Have a free file. 96 | return nextPath; 97 | } 98 | } 99 | } 100 | 101 | // 102 | // Saves the debugger confiugration. 103 | // 104 | private async saveConfiguration(config: ITealInterpreterConfig) { 105 | const fileInfo = path.parse(this.loadedTealFilePath!); 106 | const configDirPath = path.join(fileInfo.dir, this.tealConfigDir); 107 | await fs.ensureDir(configDirPath); 108 | 109 | if (this.loadedConfigurationFilePath === undefined) { 110 | // Find an untaken configuration file name. 111 | this.loadedConfigurationFilePath = await this.chooseNextAvailableFileName(configDirPath, fileInfo.base, "json"); 112 | } 113 | 114 | await writeFile(this.loadedConfigurationFilePath, JSON.stringify(config, null, 4)); 115 | vscode.window.showInformationMessage(`Saved configuration file ${this.loadedConfigurationFilePath}`); 116 | } 117 | 118 | // 119 | // Prompts the user to save their configuration. 120 | // 121 | private async promptSaveConfiguration(): Promise { 122 | const response = await vscode.window.showInformationMessage( 123 | `Your configuration was updated.\r\nWould you like to save it?`, 124 | "Yes", 125 | "No" 126 | ); 127 | 128 | if (response === "Yes") { 129 | await this.saveConfiguration(this.interpreter.context.serialize()); 130 | } 131 | } 132 | 133 | // 134 | // Configures the algo-builder interpreter and parses the TEAL code to be debugged. 135 | // 136 | private async configureInterpreter(configuration: ITealInterpreterConfig, tealCode: string) { 137 | 138 | this.interpreter = new TealInterpreter(); 139 | this.interpreter.load(tealCode); 140 | this.interpreter.configure(configuration) 141 | this.interpreter.context.onConfigNotFound = async (fieldPath: string) => { 142 | const response = await vscode.window.showInformationMessage( 143 | `Field "${fieldPath}" is not defined in your configuration. Do you want to create it?`, 144 | "Yes", 145 | "No" 146 | ); 147 | 148 | if (response === "Yes") { 149 | let defaultValue = this.interpreter.context.getDefaultValue(fieldPath); 150 | if (defaultValue === undefined) { 151 | defaultValue = "int:0"; 152 | } 153 | else if (typeof defaultValue === "number") { 154 | defaultValue = "int:" + defaultValue; 155 | } 156 | 157 | let userValue: string | undefined = await vscode.window.showInputBox({ 158 | title: "Provide default field value", 159 | prompt: `Please provide a value for field ${fieldPath}`, 160 | value: defaultValue, 161 | }); 162 | 163 | if (userValue === undefined) { 164 | userValue = defaultValue; 165 | } 166 | 167 | this.interpreter.context.autoCreateField(fieldPath, loadValue(userValue!)); 168 | await this.promptSaveConfiguration(); 169 | } 170 | }; 171 | } 172 | 173 | // 174 | // Find configuration files that match the TEAL file. 175 | // 176 | private async findConfigurationFiles(configDirPath: string, tealFileName?: string): Promise { 177 | 178 | await fs.ensureDir(configDirPath); 179 | 180 | if (tealFileName !== undefined) { 181 | tealFileName = tealFileName.toLowerCase(); 182 | } 183 | 184 | const matchingConfigFiles: string[] = []; 185 | 186 | const files = await vscode.workspace.fs.readDirectory(vscode.Uri.file(configDirPath)); 187 | for (const [fileName, fileType] of files) { 188 | if (fileType !== vscode.FileType.File) { 189 | continue; // Skip sub-directories. 190 | } 191 | 192 | const fileNameLwr = fileName.toLowerCase(); 193 | if (tealFileName !== undefined) { 194 | if (!fileNameLwr.startsWith(tealFileName)) { 195 | continue; // Skip this file. 196 | } 197 | } 198 | 199 | if (!fileNameLwr.endsWith(".json")) { 200 | continue; // Skip non-JSON files. 201 | } 202 | 203 | // Found a matching configuration file. 204 | matchingConfigFiles.push(fileName); 205 | } 206 | 207 | return matchingConfigFiles; 208 | } 209 | 210 | // 211 | // Loads a specific configuration file. 212 | // 213 | private async loadSpecificConfiguration(configFilePath: string, loadedConfigurationFilePath: string): Promise { 214 | try { 215 | const config = JSON5.parse(await readFile(configFilePath)); 216 | vscode.window.showInformationMessage(`Loaded configuration file ${configFilePath}`); 217 | this.loadedConfigurationFilePath = loadedConfigurationFilePath; 218 | return config; 219 | } 220 | catch (err: any) { 221 | const msg = `Failed to load TEAL debugger configuration file: ${configFilePath}`; 222 | console.error(msg); 223 | console.error(err && err.stack || err); 224 | 225 | throw new Error(msg); 226 | } 227 | } 228 | 229 | // 230 | // Allows the user to pick a default configuration, then starts a new configuration file from that one. 231 | // 232 | private async createNewConfigurationFromDefault(configDirPath: string, tealFileName: string): Promise { 233 | const defaultConfigDirPath = path.join(os.homedir(), this.tealConfigDir); 234 | const defaultConfigFiles: string[] = await this.findConfigurationFiles(defaultConfigDirPath); 235 | if (defaultConfigFiles.length === 0) { 236 | throw new Error(`No default configuration files were found at ${defaultConfigDirPath}. You should generate a new configuration and copy it there to create a default.`); 237 | } 238 | 239 | const createEmptyPrompt = "Create an empty configuration file"; 240 | defaultConfigFiles.push(createEmptyPrompt); 241 | 242 | const defaultPick = await vscode.window.showQuickPick(defaultConfigFiles, { 243 | title: "Pick a default configuration file to start with:", 244 | }); 245 | 246 | if (defaultPick === undefined) { 247 | // Fallback: return default configuration. 248 | const defaultConfig: ITealInterpreterConfig = {}; 249 | return defaultConfig; 250 | } 251 | 252 | let config: ITealInterpreterConfig; 253 | const loadedConfigurationFilePath = await this.chooseNextAvailableFileName(configDirPath, tealFileName, "json"); 254 | 255 | if (defaultPick === createEmptyPrompt) { 256 | config = {}; // Empty configuration! 257 | this.loadedConfigurationFilePath = loadedConfigurationFilePath; 258 | } 259 | else { 260 | const configFilePath = path.join(defaultConfigDirPath, defaultPick); 261 | config = await this.loadSpecificConfiguration(configFilePath, loadedConfigurationFilePath); 262 | } 263 | 264 | await this.saveConfiguration(config); 265 | return config; 266 | } 267 | 268 | // 269 | // Loads the TEAL debugger configuration file. 270 | // 271 | private async loadConfiguration(tealFilePath: string): Promise { 272 | const fileInfo = path.parse(tealFilePath); 273 | const configDirPath = path.join(fileInfo.dir, this.tealConfigDir); 274 | const configFiles = await this.findConfigurationFiles(configDirPath, fileInfo.name); 275 | const proceedWithNonePrompt = "Proceed with no configuration file"; 276 | configFiles.push(proceedWithNonePrompt); 277 | const createNewPrompt = "Create a new configuration file..."; 278 | configFiles.push(createNewPrompt); 279 | 280 | const pick = await vscode.window.showQuickPick(configFiles, { 281 | title: "Pick a configuration file for the TEAL debugger:", 282 | }); 283 | if (pick !== undefined && pick !== proceedWithNonePrompt) { 284 | if (pick === createNewPrompt) { 285 | return await this.createNewConfigurationFromDefault(configDirPath, fileInfo.base); 286 | } 287 | else { 288 | const configFilePath = path.join(configDirPath, pick); 289 | return await this.loadSpecificConfiguration(configFilePath, configFilePath); 290 | } 291 | } 292 | 293 | // Fallback: return default configuration. 294 | const defaultConfig: ITealInterpreterConfig = {}; 295 | return defaultConfig; 296 | } 297 | 298 | // 299 | // Continue running the TEAL program until a breakpoint or end of program. 300 | // 301 | async continue(): Promise { 302 | return this.interpreter.continue(); 303 | } 304 | 305 | // 306 | // Steps the debugger to the next line of code. 307 | // Returns true to continue or false to end debugging. 308 | // 309 | async step(): Promise { 310 | return this.interpreter.step(); 311 | } 312 | 313 | } -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from '@vscode/test-electron'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ 17 | launchArgs: [ 18 | "--disable-extensions", 19 | ], 20 | extensionDevelopmentPath, 21 | extensionTestsPath, 22 | }); 23 | } catch (err) { 24 | console.error('Failed to run tests'); 25 | process.exit(1); 26 | } 27 | } 28 | 29 | main(); 30 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5)); 13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import Mocha from 'mocha'; 3 | import glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd', 9 | color: true 10 | }); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /stamp-version.js: -------------------------------------------------------------------------------- 1 | // 2 | // Stamps the version into the package.json file. 3 | // 4 | 5 | const fs = require("fs"); 6 | const package = JSON.parse(fs.readFileSync("package.json", "utf8")); 7 | package.version = process.env.VERSION; 8 | fs.writeFileSync("package.json", JSON.stringify(package, null, 4)); -------------------------------------------------------------------------------- /test/basic/test.teal: -------------------------------------------------------------------------------- 1 | #pragma version 3 2 | 3 | int 1 4 | int 5 5 | + 6 | 7 | // Commented line (the debugger should skip this). 8 | int 3 9 | int 3 10 | + 11 | == -------------------------------------------------------------------------------- /test/crowdfunding/crowdfunding.teal: -------------------------------------------------------------------------------- 1 | #pragma version 4 2 | 3 | // check if the app is being created 4 | // if so save creator 5 | int 0 6 | txn ApplicationID 7 | == 8 | 9 | // if not creation skip this section 10 | bz not_creation 11 | 12 | // save the creator address to the global state 13 | byte "Creator" 14 | txn Sender 15 | app_global_put 16 | 17 | // verify that 5 arguments are passed 18 | txn NumAppArgs 19 | int 5 20 | == 21 | bz failed 22 | 23 | //store the start date 24 | byte "StartDate" 25 | txna ApplicationArgs 0 26 | btoi 27 | app_global_put 28 | 29 | // store the end date 30 | byte "EndDate" 31 | txna ApplicationArgs 1 32 | btoi 33 | app_global_put 34 | 35 | // store fund goal 36 | byte "Goal" 37 | txna ApplicationArgs 2 38 | btoi 39 | app_global_put 40 | 41 | // store the fund receiver 42 | byte "Receiver" 43 | txna ApplicationArgs 3 44 | app_global_put 45 | 46 | // set the total raised to 0 and store it 47 | byte "Total" 48 | int 0 49 | app_global_put 50 | 51 | // store the fund close date 52 | byte "FundCloseDate" 53 | txna ApplicationArgs 4 54 | btoi 55 | app_global_put 56 | 57 | // return a success 58 | int 1 59 | return 60 | 61 | not_creation: 62 | int 1 63 | return 64 | 65 | // fail transaction 66 | failed: 67 | int 0 68 | return -------------------------------------------------------------------------------- /test/crowdfunding/crowdfunding.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode": "signature", // or application 3 | "groupIndex": 0, // which txn to use defaults to 0 4 | "args": [ 5 | { 6 | "type": "int", 7 | "value": 1635309873905 // Begin date. 8 | }, 9 | { 10 | "type": "int", 11 | "value": 1635321871906 // End date. 12 | }, 13 | { 14 | "type": "addr", 15 | "value": "john" 16 | }, 17 | { 18 | "type": "int", 19 | "value": 1635321871906 // Fund close date. 20 | } 21 | ], 22 | "txns": [ 23 | { 24 | "type": "appl", 25 | "sign": "secretkey", 26 | "fromAccount": "john", 27 | "payFlags": { 28 | "totalFee": 1000 29 | }, 30 | "localInts": 8, 31 | "localBytes": 8, 32 | "globalInts": 32, 33 | "globalBytes": 32 34 | } 35 | ], 36 | "accounts": { 37 | "john": { 38 | "balance": 3000000 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /test/escrow/escrow.teal: -------------------------------------------------------------------------------- 1 | #pragma version 4 2 | // Check if Transaction type is pay, Amount is <= 100, Receiver is john AND fee <= 10000 3 | txn TypeEnum 4 | int 1 5 | == 6 | txn Amount 7 | int 100 8 | <= 9 | && 10 | txn Receiver 11 | addr 2UBZKFR6RCZL7R24ZG327VKPTPJUPFM6WTG7PJG2ZJLU234F5RGXFLTAKA 12 | == 13 | && 14 | txn RekeyTo 15 | global ZeroAddress 16 | == 17 | && 18 | txn Fee 19 | int 10000 20 | <= 21 | && -------------------------------------------------------------------------------- /test/escrow/escrow.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode": 0, 3 | "transactionParams": { 4 | "type": 0, 5 | "sign": 1, 6 | "fromAccount": "$lsig", 7 | "toAccount": "john", 8 | "amountMicroAlgos": 100, 9 | "payFlags": { 10 | "totalFee": 1000 11 | } 12 | }, 13 | "accounts": { 14 | "john": { 15 | "balance": 101500, 16 | "addr": "2UBZKFR6RCZL7R24ZG327VKPTPJUPFM6WTG7PJG2ZJLU234F5RGXFLTAKA", 17 | "sk": [ 18 | 225, 66, 210, 23, 145, 13, 100, 50, 220, 70, 180, 19 | 141, 20, 8, 156, 204, 17, 151, 102, 49, 235, 249, 20 | 1, 67, 196, 29, 166, 238, 227, 140, 20, 100, 213, 21 | 3, 149, 22, 62, 136, 178, 191, 199, 92, 201, 183, 22 | 175, 213, 79, 155, 211, 71, 149, 158, 180, 205, 247, 23 | 164, 218, 202, 87, 77, 111, 133, 236, 77 24 | ] 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /test/opcode-tests/app_global_del.teal: -------------------------------------------------------------------------------- 1 | byte "aGlobal" 2 | app_global_del 3 | -------------------------------------------------------------------------------- /test/opcode-tests/app_global_get.teal: -------------------------------------------------------------------------------- 1 | byte "aGlobal" 2 | app_global_get 3 | -------------------------------------------------------------------------------- /test/opcode-tests/app_global_get_ex.teal: -------------------------------------------------------------------------------- 1 | int 2 2 | byte "anotherGlobal" 3 | app_global_get_ex 4 | -------------------------------------------------------------------------------- /test/opcode-tests/app_global_put.teal: -------------------------------------------------------------------------------- 1 | byte "aGlobal" 2 | int 12 3 | app_global_put 4 | -------------------------------------------------------------------------------- /test/opcode-tests/app_local_del.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | byte "aLocal" 3 | app_local_del 4 | -------------------------------------------------------------------------------- /test/opcode-tests/app_local_get.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | byte "aLocal" 3 | app_local_get 4 | -------------------------------------------------------------------------------- /test/opcode-tests/app_local_get_ex.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | int 1 3 | byte "test" 4 | app_local_get_ex 5 | -------------------------------------------------------------------------------- /test/opcode-tests/app_local_put.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | byte "aLocal" 3 | int 15 4 | app_local_put 5 | -------------------------------------------------------------------------------- /test/opcode-tests/app_opted_in.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | int 3 3 | app_opted_in 4 | -------------------------------------------------------------------------------- /test/opcode-tests/app_params_get.teal: -------------------------------------------------------------------------------- 1 | int 2 2 | app_params_get AppExtraProgramPages 3 | -------------------------------------------------------------------------------- /test/opcode-tests/arg.teal: -------------------------------------------------------------------------------- 1 | arg 0 2 | arg 1 -------------------------------------------------------------------------------- /test/opcode-tests/asset_holding_get.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | int 1 3 | asset_holding_get AssetBalance 4 | -------------------------------------------------------------------------------- /test/opcode-tests/asset_params_get.teal: -------------------------------------------------------------------------------- 1 | int 0 2 | asset_params_get AssetTotal 3 | -------------------------------------------------------------------------------- /test/opcode-tests/balance.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | balance 3 | -------------------------------------------------------------------------------- /test/opcode-tests/gaid.teal: -------------------------------------------------------------------------------- 1 | gaid 0 2 | -------------------------------------------------------------------------------- /test/opcode-tests/global.teal: -------------------------------------------------------------------------------- 1 | global MinTxnFee -------------------------------------------------------------------------------- /test/opcode-tests/gtxn.teal: -------------------------------------------------------------------------------- 1 | gtxn 0 Fee 2 | gtxn 0 Sender 3 | -------------------------------------------------------------------------------- /test/opcode-tests/txn.teal: -------------------------------------------------------------------------------- 1 | txn Fee 2 | txn Sender -------------------------------------------------------------------------------- /test/test-cases/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "teal", 9 | "request": "launch", 10 | "name": "Debug TEAL code", 11 | "program": "${file}", 12 | "stopOnEntry": true 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /test/test-cases/example-1.teal: -------------------------------------------------------------------------------- 1 | #pragma version 3 2 | 3 | byte "Creator" 4 | txn Sender 5 | app_global_put 6 | 7 | addr 7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224 8 | byte "Creator" 9 | app_global_get 10 | == 11 | bnz check_balance 12 | 13 | failure: 14 | int 0 15 | return 16 | 17 | check_balance: 18 | txn Sender 19 | balance 20 | // Not sure how to set the balance for accounts that are on txns (Sender, Receiver etc.) in the config 21 | 22 | 23 | success: 24 | int 1 25 | return 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/test-cases/example-1.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "args": [ 3 | { 4 | "type": "int", 5 | "value": 20 6 | }, 7 | { 8 | "type": "int", 9 | "value": 21 10 | } 11 | ], 12 | "globals": { 13 | "MinTxnFee": 1, 14 | "MinBalance": 2, 15 | "MaxTxnLife": 3, 16 | "ZeroAddress": 4 17 | }, 18 | "txn": { 19 | "Sender": "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224", 20 | "Fee": 6, 21 | "FirstValid": 7, 22 | "LastValid": 8, 23 | "Note": 9, 24 | "Receiver": 10, 25 | "Amount": 11, 26 | "CloseRemainderTo": 12, 27 | "VotePK": 13, 28 | "SelectionPK": 14, 29 | "VoteFirst": 15, 30 | "VoteLast": 16, 31 | "VoteKeyDilution": 17, 32 | "Type": 18, 33 | "XferAsset": 19, 34 | "AssetAmount": 20, 35 | "AssetSender": 21, 36 | "AssetReceiver": 22, 37 | "AssetCloseTo": 23 38 | }, 39 | "txns": [ 40 | { 41 | "Sender": "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224", 42 | "Fee": 6, 43 | "FirstValid": 7, 44 | "LastValid": 8, 45 | "Note": 9, 46 | "Receiver": 10, 47 | "Amount": 11, 48 | "CloseRemainderTo": 12, 49 | "VotePK": 13, 50 | "SelectionPK": 14, 51 | "VoteFirst": 15, 52 | "VoteLast": 16, 53 | "VoteKeyDilution": 17, 54 | "Type": 18, 55 | "XferAsset": 19, 56 | "AssetAmount": 20, 57 | "AssetSender": 21, 58 | "AssetReceiver": 22, 59 | "AssetCloseTo": 23 60 | } 61 | ], 62 | "accounts": { 63 | "7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224": { 64 | "balance": 5000 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /test/test-cases/teal-1.teal: -------------------------------------------------------------------------------- 1 | global MinTxnFee 2 | global MinBalance 3 | global MaxTxnLife 4 | global ZeroAddress 5 | byte 0x1234 6 | byte base64 aGVsbG8gd29ybGQh 7 | byte base64(aGVsbG8gd29ybGQh) 8 | byte b64 aGVsbG8gd29ybGQh 9 | byte b64(aGVsbG8gd29ybGQh) 10 | addr RWXCBB73XJITATVQFOI7MVUUQOL2PFDDSDUMW4H4T2SNSX4SEUOQ2MM7F4 11 | byte base64 iZWMx72KvU6Bw6sPAWQFL96YH+VMrBA0XKWD9XbZOZI= 12 | byte base64 if8ooA+32YZc4SQBvIDDY8tgTatPoq4IZ8Kr+We1t38LR2RuURmaVu9D4shbi4VvND87PUqq5/0vsNFEGIIEDA== 13 | addr 7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224 14 | ed25519verify 15 | txn Sender 16 | txn Fee 17 | txn FirstValid 18 | txn LastValid 19 | txn Note 20 | txn Receiver 21 | txn Amount 22 | txn CloseRemainderTo 23 | txn VotePK 24 | txn SelectionPK 25 | txn VoteFirst 26 | txn VoteLast 27 | txn VoteKeyDilution 28 | txn Type 29 | txn XferAsset 30 | txn AssetAmount 31 | txn AssetSender 32 | txn AssetReceiver 33 | txn AssetCloseTo 34 | gtxn 0 Sender 35 | gtxn 0 Fee 36 | gtxn 0 FirstValid 37 | gtxn 0 LastValid 38 | gtxn 0 Note 39 | gtxn 0 Receiver 40 | gtxn 0 Amount 41 | gtxn 0 CloseRemainderTo 42 | gtxn 0 VotePK 43 | gtxn 0 SelectionPK 44 | gtxn 0 VoteFirst 45 | gtxn 0 VoteLast 46 | gtxn 0 VoteKeyDilution 47 | gtxn 0 Type 48 | gtxn 0 XferAsset 49 | gtxn 0 AssetAmount 50 | gtxn 0 AssetSender 51 | gtxn 0 AssetReceiver 52 | gtxn 0 AssetCloseTo 53 | arg 0 // comment 54 | arg 1 //comment 55 | byte base64 PTCXU4VI6ZFC/ds7MfVarmM/rvJJkwgSlKp+BgiEOWI= 56 | sha256 57 | byte 0x666E6F7264 58 | keccak256 59 | int 0x031337 60 | int 0x1234567812345678 61 | int 0x0034567812345678 62 | int 0x0000567812345678 63 | int 0x0000007812345678 64 | + // comment 65 | // extra int pushes to satisfy typechecking on the ops that pop two ints 66 | intcblock 1 2 3 4 5 67 | intc 0 68 | - //comment 69 | intc 2 70 | / 71 | intc_0 72 | * 73 | intc_1 74 | < 75 | intc_2 76 | > 77 | intc_3 78 | <= 79 | intc 1 80 | >= 81 | intc 1 82 | && 83 | intc 1 84 | || 85 | intc 1 86 | == 87 | intc 1 88 | != 89 | intc 1 90 | ! 91 | int 6 92 | int 2 93 | % 94 | ^ 95 | ~ 96 | byte 0x4242 97 | btoi 98 | itob 99 | len 100 | bnz there 101 | int 3 102 | there: 103 | bytec 1 104 | sha512_256 105 | dup 106 | pop 107 | load 3 108 | store 2 109 | intc 0 110 | intc 1 111 | err 112 | -------------------------------------------------------------------------------- /test/test-cases/teal-1.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "args": [ 3 | 20, 4 | 21 5 | ], 6 | "globals": { 7 | "MinTxnFee": 1, 8 | "MinBalance": 2, 9 | "MaxTxnLife": 3, 10 | "ZeroAddress": 4 11 | }, 12 | "txn": { 13 | "Sender": 5, 14 | "Fee": 6, 15 | "FirstValid": 7, 16 | "LastValid": 8, 17 | "Note": 9, 18 | "Receiver": 10, 19 | "Amount": 11, 20 | "CloseRemainderTo": 12, 21 | "VotePK": 13, 22 | "SelectionPK": 14, 23 | "VoteFirst": 15, 24 | "VoteLast": 16, 25 | "VoteKeyDilution": 17, 26 | "Type": 18, 27 | "XferAsset": 19, 28 | "AssetAmount": 20, 29 | "AssetSender": 21, 30 | "AssetReceiver": 22, 31 | "AssetCloseTo": 23 32 | }, 33 | "txns": [ 34 | { 35 | "Sender": 5, 36 | "Fee": 6, 37 | "FirstValid": 7, 38 | "LastValid": 8, 39 | "Note": 9, 40 | "Receiver": 10, 41 | "Amount": 11, 42 | "CloseRemainderTo": 12, 43 | "VotePK": 13, 44 | "SelectionPK": 14, 45 | "VoteFirst": 15, 46 | "VoteLast": 16, 47 | "VoteKeyDilution": 17, 48 | "Type": 18, 49 | "XferAsset": 19, 50 | "AssetAmount": 20, 51 | "AssetSender": 21, 52 | "AssetReceiver": 22, 53 | "AssetCloseTo": 23 54 | } 55 | ] 56 | } -------------------------------------------------------------------------------- /test/test-cases/teal-2.teal: -------------------------------------------------------------------------------- 1 | addr john 2 | byte "aLocal" 3 | int 15 4 | app_local_put 5 | byte "aGlobal" 6 | int 12 7 | app_global_put 8 | byte "aGlobal" 9 | int 15 10 | app_global_put 11 | int 1 12 | int 2 13 | dup2 14 | pop 15 | pop 16 | pop 17 | pop 18 | byte "1234" 19 | byte "5678" 20 | concat 21 | substring 2 7 22 | int 1 23 | int 3 24 | substring3 25 | pop 26 | int 0 27 | bz there2 28 | b there2 29 | there2: 30 | addr john 31 | balance 32 | pop 33 | addr john 34 | int 1 35 | app_opted_in 36 | addr john 37 | int 1 38 | byte "test" 39 | app_local_get_ex 40 | pop 41 | pop 42 | pop 43 | addr john 44 | byte "aLocal" 45 | app_local_get 46 | pop 47 | byte "aGlobal" 48 | app_global_get 49 | pop 50 | int 2 51 | byte "anotherGlobal" 52 | app_global_get_ex 53 | pop 54 | pop 55 | addr john 56 | byte "aLocal" 57 | int 15 58 | app_local_put 59 | byte "aGlobal" 60 | int 12 61 | app_global_put 62 | addr john 63 | byte "aLocal" 64 | app_local_del 65 | byte "aGlobal" 66 | app_global_del 67 | addr john 68 | int 1 69 | asset_holding_get AssetBalance 70 | pop 71 | pop 72 | int 0 73 | asset_params_get AssetTotal 74 | pop 75 | pop 76 | txna Accounts 0 77 | pop 78 | gtxna 0 ApplicationArgs 0 79 | pop 80 | txn ApplicationID 81 | pop 82 | int 0 83 | int 1 84 | addw 85 | return -------------------------------------------------------------------------------- /test/test-cases/teal-2.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "txn": { 3 | "Accounts": [ 4 | "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224" 5 | ], 6 | "ApplicationID": 5 7 | }, 8 | "txns": [ 9 | { 10 | "ApplicationArgs": [ 11 | "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224" 12 | ] 13 | } 14 | ], 15 | "application": { 16 | "globals": { 17 | "aGlobal": 38 18 | } 19 | }, 20 | "applications": { 21 | "2": { 22 | "globals": { 23 | "anotherGlobal": 22 24 | } 25 | } 26 | }, 27 | "assets": { 28 | "0": { 29 | "fields": { 30 | "AssetTotal": 5 31 | } 32 | } 33 | }, 34 | "accounts": { 35 | "john": { 36 | "balance": 42, 37 | "locals": { 38 | "aLocal": 33 39 | }, 40 | "applications": { 41 | "1": { 42 | "optedIn": true, 43 | "locals": { 44 | "test": 53 45 | } 46 | } 47 | }, 48 | "assets": { 49 | "1": { 50 | "fields": { 51 | "AssetBalance": 3000 52 | } 53 | } 54 | } 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /test/test-cases/teal-3.teal: -------------------------------------------------------------------------------- 1 | int 1 2 | assert 3 | addr 7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224 4 | min_balance 5 | pop 6 | int 0x031337 // get bit 1, negate it, put it back 7 | dup 8 | int 1 9 | getbit 10 | ! 11 | int 1 12 | setbit 13 | pop 14 | byte "test" // get byte 2, increment it, put it back 15 | dup 16 | int 2 17 | getbyte 18 | int 1 19 | + 20 | int 2 21 | setbyte 22 | int 3 23 | swap 24 | int 1 25 | select 26 | pop 27 | int 10 28 | int 11 29 | int 12 30 | dig 2 31 | pop 32 | pop 33 | pop 34 | pop 35 | int 1 36 | gtxns ConfigAsset 37 | pop 38 | int 2 39 | gtxnsa Accounts 0 40 | pushint 1000 41 | pushbytes "john" 42 | -------------------------------------------------------------------------------- /test/test-cases/teal-3.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "txns": [ 3 | { 4 | 5 | }, 6 | { 7 | "ConfigAsset": 5 8 | }, 9 | { 10 | "Accounts": [ 11 | "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224" 12 | ] 13 | } 14 | ], 15 | "accounts": { 16 | "7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224": { 17 | "minBalance": 5000 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /test/test-cases/teal-4.teal: -------------------------------------------------------------------------------- 1 | callsub stuff 2 | b next 3 | stuff: 4 | retsub 5 | next: 6 | int 1 7 | int 2 8 | shl 9 | int 1 10 | shr 11 | pop 12 | int 4 13 | sqrt 14 | int 2 15 | exp 16 | int 2 17 | expw 18 | pop 19 | pop 20 | gload 0 0 21 | gloads 0 22 | pop 23 | gaid 0 24 | gaids 25 | pop -------------------------------------------------------------------------------- /test/test-cases/teal-4.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "txnSideEffects": { 3 | "0": { 4 | "0": 35 5 | }, 6 | "35": { 7 | "0": 12 8 | } 9 | }, 10 | "gaid": { 11 | "0": 15, 12 | "15": 102 13 | } 14 | } -------------------------------------------------------------------------------- /test/test-cases/teal-5.teal: -------------------------------------------------------------------------------- 1 | int 2 2 | app_params_get AppExtraProgramPages 3 | itxn_begin 4 | int 22 5 | itxn_field Fee 6 | itxn_submit 7 | itxn Fee 8 | int 1 9 | byte 0x0123456789abcd 10 | int 1 11 | txnas ApplicationArgs 12 | int 0 13 | gtxnas 0 ApplicationArgs 14 | int 0 15 | int 0 16 | gtxnsas ApplicationArgs 17 | int 0 18 | args 19 | int 0 20 | loads 21 | int 0 22 | stores -------------------------------------------------------------------------------- /test/test-cases/teal-5.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "args": [ 3 | 22 4 | ], 5 | "appParams": { 6 | "2": { 7 | "AppExtraProgramPages": 5 8 | } 9 | }, 10 | "txn": { 11 | "ApplicationArgs": [ 12 | 1, 13 | 2, 14 | 3 15 | ] 16 | }, 17 | "gtxn": [ 18 | { 19 | "ApplicationArgs": [ 20 | 4, 21 | 5, 22 | 6 23 | ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /test/test-cases/test.teal: -------------------------------------------------------------------------------- 1 | #pragma version 3 2 | 3 | byte "Creator" 4 | txn Sender 5 | app_global_put 6 | 7 | addr 7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224 8 | byte "Creator" 9 | app_global_get 10 | == 11 | bnz check_balance 12 | 13 | failure: 14 | int 0 15 | return 16 | 17 | check_balance: 18 | txn Sender 19 | balance 20 | // Not sure how to set the balance for accounts that are on txns (Sender, Receiver etc.) in the config 21 | 22 | 23 | success: 24 | int 1 25 | return 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/test-cases/test.teal.json: -------------------------------------------------------------------------------- 1 | { 2 | "args": [ 3 | { 4 | "type": "int", 5 | "value": 20 6 | }, 7 | { 8 | "type": "int", 9 | "value": 21 10 | } 11 | ], 12 | "globals": { 13 | "MinTxnFee": 1, 14 | "MinBalance": 2, 15 | "MaxTxnLife": 3, 16 | "ZeroAddress": 4 17 | }, 18 | "txn": { 19 | "Sender": "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224", 20 | "Fee": 6, 21 | "FirstValid": 7, 22 | "LastValid": 8, 23 | "Note": 9, 24 | "Receiver": 10, 25 | "Amount": 11, 26 | "CloseRemainderTo": 12, 27 | "VotePK": 13, 28 | "SelectionPK": 14, 29 | "VoteFirst": 15, 30 | "VoteLast": 16, 31 | "VoteKeyDilution": 17, 32 | "Type": 18, 33 | "XferAsset": 19, 34 | "AssetAmount": 20, 35 | "AssetSender": 21, 36 | "AssetReceiver": 22, 37 | "AssetCloseTo": 23 38 | }, 39 | "txns": [ 40 | { 41 | "Sender": "addr:7JOPVEP3ABJUW5YZ5WFIONLPWTZ5MYX5HFK4K7JLGSIAG7RRB42MNLQ224", 42 | "Fee": 6, 43 | "FirstValid": 7, 44 | "LastValid": 8, 45 | "Note": 9, 46 | "Receiver": 10, 47 | "Amount": 11, 48 | "CloseRemainderTo": 12, 49 | "VotePK": 13, 50 | "SelectionPK": 14, 51 | "VoteFirst": 15, 52 | "VoteLast": 16, 53 | "VoteKeyDilution": 17, 54 | "Type": 18, 55 | "XferAsset": 19, 56 | "AssetAmount": 20, 57 | "AssetSender": 21, 58 | "AssetReceiver": 22, 59 | "AssetCloseTo": 23 60 | } 61 | ] 62 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2020", 5 | "lib": [ 6 | "ES2020" 7 | ], 8 | "sourceMap": true, 9 | "rootDir": "src", 10 | "strict": true, /* enable all strict type-checking options */ 11 | /* Additional Checks */ 12 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 13 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 14 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 15 | 16 | "allowSyntheticDefaultImports": true, 17 | "esModuleInterop": true 18 | }, 19 | "exclude": [ 20 | "node_modules", 21 | ".vscode-test" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | 5 | * This folder contains all of the files necessary for your extension. 6 | * `package.json` - this is the manifest file in which you declare your extension and command. 7 | * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 10 | * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. 11 | 12 | ## Get up and running straight away 13 | 14 | * Press `F5` to open a new window with your extension loaded. 15 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 16 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 17 | * Find output from your extension in the debug console. 18 | 19 | ## Make changes 20 | 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | 25 | ## Explore the API 26 | 27 | * You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. 28 | 29 | ## Run tests 30 | 31 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. 32 | * Press `F5` to run the tests in a new window with your extension loaded. 33 | * See the output of the test result in the debug console. 34 | * Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. 35 | * The provided test runner will only consider files matching the name pattern `**.test.ts`. 36 | * You can create folders inside the `test` folder to structure your tests any way you want. 37 | 38 | ## Go further 39 | 40 | * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). 41 | * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. 42 | * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). 43 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | 'use strict'; 4 | 5 | const path = require('path'); 6 | 7 | //@ts-check 8 | /** @typedef {import('webpack').Configuration} WebpackConfig **/ 9 | 10 | /** @type WebpackConfig */ 11 | const extensionConfig = { 12 | target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ 13 | mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') 14 | 15 | entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ 16 | output: { 17 | // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ 18 | path: path.resolve(__dirname, 'dist'), 19 | filename: 'extension.js', 20 | libraryTarget: 'commonjs2' 21 | }, 22 | externals: { 23 | vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ 24 | // modules added here also need to be added in the .vsceignore file 25 | }, 26 | resolve: { 27 | // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader 28 | extensions: ['.ts', '.js'] 29 | }, 30 | module: { 31 | rules: [ 32 | { 33 | test: /\.ts$/, 34 | exclude: /node_modules/, 35 | use: [ 36 | { 37 | loader: 'ts-loader' 38 | } 39 | ] 40 | } 41 | ] 42 | }, 43 | devtool: 'nosources-source-map' 44 | }; 45 | module.exports = [ extensionConfig ]; --------------------------------------------------------------------------------