diff --git a/.gitignore b/.gitignore index 5731116..c66fad4 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,5 @@ out/ Network Trash Folder Temporary Items .apdisk + +legacy/* \ No newline at end of file diff --git a/README.md b/README.md index 2f2aeca..cca56f4 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,120 @@ -# Rocket.Chat Apps CLI -The Rocket.Chat Apps CLI for interacting with Apps. +# Rocket.Chat Apps CLI (v2) -## Getting Started -Extremely simple. +Modernized `rc-apps` CLI focused on local app development, packaging, deployment, and scaffolding. -``` +## What Changed In v2 + +- Legacy implementation is preserved under `legacy/` for reference. +- Deprecated cloud/marketplace commands were removed from active CLI: + - `login` + - `logout` + - `submit` +- Modern Node.js baseline (`>=22.0.0`). +- Lower runtime dependency surface using native Node APIs (`fetch`, `FormData`, `fs/promises`, `util.parseArgs`). +- Cross-platform path handling improvements (Windows-safe path normalization). + +## Install + +```bash npm install -g @rocket.chat/apps-cli ``` -## Rocket.Chat App Development +## Commands -### Logging Inside an App -Due to limitations of NodeJS's `vm` package we have had to implement a custom logger class. -To make usage of this you can use `this.getLogger()` and then do the normal `console` style logging. +```bash +rc-apps help +``` -### `rc-apps create` +```bash +rc-apps env +``` -The development tools provide a command to quickly scaffold a new Rocket.Chat App, simply run `rc-apps create` and a new folder will be created inside the current working directory with a basic App which does nothing but will compile and be packaged in the `dist` folder. +### Create App -### App description +```bash +rc-apps create [name] [--description ] [--author ] [--support ] [--homepage ] [--skip-install] +``` -The app description file, named `app.json`, contains basic information about the app. You can check the [app-schema.json](https://github.com/RocketChat/Rocket.Chat.Apps-engine/blob/master/src/definition/app-schema.json) file for all the detailed information and fields allowed in the app description file, the basic structure is similar to this: +### Package App -``` -{ - "id": "5cb9a329-0613-4d39-b20f-cc2cc9175df5", - "name": "App Name", - "nameSlug": "app-name", - "version": "0.0.1", - "requiredApiVersion": "^1.4.0", - "description": "App which provides something very useful for Rocket.Chat users.", - "author": { - "name": "Author Name ", - "support": "Support Url or Email" - }, - "classFile": "main.ts", - "iconFile": "beautiful-app-icon.jpg" -} +```bash +rc-apps package [--project ] [--force] [--verbose] [--no-compile] [--legacy-compiler] ``` -### Extending the App class +- `--no-compile`: package source files directly (no TypeScript compile/bundle). This is intended for manual marketplace review workflows. +- v2 defaults to native compiler mode. +- `--legacy-compiler`: opt into legacy compiler mode. +- `--verbose`: print project path, compiler mode, and output zip path. -The basic creation of an App is based on extending the `App` class from the Rocket.Chat Apps _definition_ library. Your class also has to implement the constructor and optionally the `initialize` function, for more details on those check the [App definition documentation](https://rocketchat.github.io/Rocket.Chat.Apps-engine/classes/app.html). +### Deploy App +```bash +rc-apps deploy [--project ] --url [--allow-http] [--legacy-compiler] [--username --password

| --userId --token ] ``` -import { - IAppAccessors, - IConfigurationExtend, - IEnvironmentRead, - ILogger, -} from '@rocket.chat/apps-engine/definition/accessors'; -import { App } from '@rocket.chat/apps-engine/definition/App'; -import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; - -export class TodoListApp extends App { - constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) { - super(info, logger, accessors); - } - - public async initialize(configurationExtend: IConfigurationExtend, environmentRead: IEnvironmentRead): Promise { - await this.extendConfiguration(configurationExtend, environmentRead); - this.getLogger().log('Hello world from my app'); - } -} + +### Watch + Auto Deploy + +```bash +rc-apps watch [--project ] --url [--allow-http] [--legacy-compiler] [auth flags] [--debounce 800] ``` -### Packaging the app +### Generate Boilerplate -Currently the Rocket.Chat servers and Marketplace allow submission of zip files, these files can be created by running `rc-apps package` which packages your app and creates the zip file under `dist` folder. +```bash +rc-apps generate endpoint [--path /route] +rc-apps generate slash-command +rc-apps generate setting +``` -### Uploading the app -For uploading the app you need add to the required parameters in the .rcappsconfig already created in the apps directory. It accepts two types of objects:- +## Config File -1. Upload using username, password +You can store deployment defaults in `.rcappsconfig` inside the app folder: -``` +```json { - url: string; - username: string; - password: string; + "allowHttp": false, + "ignoredFiles": [ + "**/dist/**", + "**/node_modules/**" + ] } ``` -2. Upload using personal access token and userId -``` -{ - url: string; - userId: string; - token: string; -} +For security, `.rcappsconfig` only supports non-secret deploy settings (`allowHttp`, `ignoredFiles`). +If legacy credential fields are present in `.rcappsconfig`, the CLI shows a warning and ignores them. + +You can also provide credentials via environment variables: +- `RC_APPS_URL` +- `RC_APPS_USERNAME` +- `RC_APPS_PASSWORD` +- `RC_APPS_TOKEN` +- `RC_APPS_USER_ID` +- `RC_APPS_2FA_CODE` +- `RC_APPS_ALLOW_HTTP` + +Precedence order is: +1. CLI flags +2. Environment variables +3. `.rcappsconfig` (safe non-secret fields only) + +Security defaults: +- For non-localhost targets, `deploy`/`watch` require HTTPS. +- To explicitly allow insecure HTTP on remote hosts, pass `--allow-http`. + +## Development + +```bash +npm install +npm run build +npm test ``` -### Enabling autocomplete for commands +## Testing Checklist -To enable autocomplete for the apps cli use the command `rc-apps autocomplete ` with the shell type as zsh or bash as the supported types. This would provide a step by step instruction to enable shell completion in your preferred shell. +1. `npm run build` succeeds. +2. `npm test` succeeds. +3. On Windows, run `rc-apps package` inside a valid app and confirm zip generation in `dist/`. +4. Verify `deploy` with both auth modes: + - username/password + - userId/token +5. Verify `watch` redeploys after editing a `.ts` source file. diff --git a/bin/rc-apps.js b/bin/rc-apps.js new file mode 100755 index 0000000..0d5fa3c --- /dev/null +++ b/bin/rc-apps.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../lib/index.js'); diff --git a/bin/run b/bin/run deleted file mode 100755 index 30b14e1..0000000 --- a/bin/run +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env node - -require('@oclif/command').run() -.then(require('@oclif/command/flush')) -.catch(require('@oclif/errors/handle')) diff --git a/bin/run.cmd b/bin/run.cmd deleted file mode 100644 index 968fc30..0000000 --- a/bin/run.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off - -node "%~dp0\run" %* diff --git a/package-lock.json b/package-lock.json index 4069d83..24aa218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,197 +1,34 @@ { "name": "@rocket.chat/apps-cli", - "version": "1.13.0", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@rocket.chat/apps-cli", - "version": "1.13.0", + "version": "2.0.0", "license": "MIT", "dependencies": { - "@hapi/hapi": "^20.0.0", - "@oclif/command": "^1.5.18", - "@oclif/config": "^1.13.2", - "@oclif/plugin-autocomplete": "^0.2.0", - "@oclif/plugin-help": "^2.2.0", - "@oclif/plugin-not-found": "^1.2.2", "@rocket.chat/apps-compiler": "^0.5.1", - "@rocket.chat/apps-engine": "^1.50.0", - "axios": "^1.6.0", - "chalk": "^2.4.2", - "chokidar": "^3.3.1", - "cli-ux": "^5.3.1", - "conf": "^6.1.0", - "fetch-with-proxy": "^3.0.1", - "figures": "^3.0.0", - "form-data": "^2.5.0", - "fs-extra": "^8.1.0", - "fuzzy": "^0.1.3", - "glob": "^7.1.4", - "indent-string": "^4.0.0", - "inquirer": "^6.5.0", - "inquirer-checkbox-plus-prompt": "^1.0.1", - "open": "^6.4.0", - "pascal-case": "^2.0.1", - "pascalcase": "^0.1.1", - "querystring": "^0.2.0", - "semver": "^6.3.0", - "systeminformation": "^5.6.4", - "tslib": "^1.10.0", - "tv4": "^1.3.0", - "typescript": "^4.9.5", - "uuid": "^3.3.3", - "yazl": "^2.5.1" + "@rocket.chat/apps-engine": "^1.59.0", + "chalk": "^4.1.2", + "yazl": "^3.3.1" }, "bin": { - "rc-apps": "bin/run" + "rc-apps": "bin/rc-apps.js" }, "devDependencies": { - "@oclif/dev-cli": "^1.22.2", - "@oclif/test": "^1.2.4", - "@oclif/tslint": "^3.1.1", - "@types/chai": "^4.1.7", - "@types/fs-extra": "^8.0.0", - "@types/glob": "^7.1.1", - "@types/hapi__hapi": "^20.0.2", - "@types/inquirer": "6.0.3", - "@types/mocha": "^5.2.7", - "@types/node": "^12.6.8", - "@types/node-fetch": "^2.5.0", - "@types/semver": "^6.0.1", - "@types/tv4": "^1.2.29", - "@types/uuid": "^3.4.5", - "@types/yazl": "^2.4.1", - "chai": "^4.2.0", - "globby": "^10.0.1", - "http-server": "^14.1.1", - "mocha": "^10.2.0", - "nyc": "^14.1.1", - "pre-commit": "^1.2.2", - "ts-node": "^8.10.2", - "tslint": "^5.18.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.5.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.4.4" - } - }, - "node_modules/@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "@types/node": "^24.3.1", + "typescript": "^5.9.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "node_modules/@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "node": ">=22.0.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -205,9 +42,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -221,9 +58,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -237,9 +74,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -253,9 +90,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -269,9 +106,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -285,9 +122,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -301,9 +138,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -317,9 +154,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -333,9 +170,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -349,9 +186,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -365,9 +202,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -381,9 +218,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -397,9 +234,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -413,9 +250,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -429,9 +266,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -445,9 +282,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -461,9 +298,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -477,9 +314,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -493,9 +330,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -509,9 +346,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -524,10 +361,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -541,9 +394,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -557,9 +410,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -573,9 +426,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -588,11371 +441,1027 @@ "node": ">=18" } }, - "node_modules/@fimbul/bifrost": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", - "integrity": "sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==", - "dev": true, - "dependencies": { - "@fimbul/ymir": "^0.17.0", - "get-caller-file": "^2.0.0", - "tslib": "^1.8.1", - "tsutils": "^3.5.0" - }, - "peerDependencies": { - "tslint": "^5.0.0", - "typescript": ">= 3.0.1 || >= 3.3.0-dev || >= 3.4.0-dev" + "node_modules/@msgpack/msgpack": { + "version": "3.0.0-beta2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", + "license": "ISC", + "engines": { + "node": ">= 14" } }, - "node_modules/@fimbul/ymir": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.17.0.tgz", - "integrity": "sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==", - "dev": true, + "node_modules/@rocket.chat/apps-compiler": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-compiler/-/apps-compiler-0.5.1.tgz", + "integrity": "sha512-vksyX52Rlj2G6lBzfe9claO1J4LRwJUV9UenxaiVEWY5MOl0DkKgnQhYFP6fllK6jJY0c+HvxJcxHzwSDH5/nQ==", + "license": "MIT", "dependencies": { - "inversify": "^5.0.0", - "reflect-metadata": "^0.1.12", - "tslib": "^1.8.1" + "@rocket.chat/apps-engine": "^1.28.0-alpha.5428", + "esbuild": "^0.12.16", + "figures": "^3.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.4", + "lodash.clonedeep": "^4.5.0", + "simple-node-logger": "^18.12.24", + "tv4": "^1.3.0", + "typescript": "^5.8.3", + "yauzl": "^3.2.0", + "yazl": "^2.5.1" }, - "peerDependencies": { - "tsutils": ">=2.29.0", - "typescript": ">= 3.0.1 || >= 3.3.0-dev || >= 3.4.0-dev" + "engines": { + "node": ">=22.0.0", + "typescript": "^5.8.3" } }, - "node_modules/@hapi/accept": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", - "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", + "node_modules/@rocket.chat/apps-compiler/node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "license": "MIT", "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" + "buffer-crc32": "~0.2.3" } }, - "node_modules/@hapi/ammo": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-5.0.1.tgz", - "integrity": "sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA==", + "node_modules/@rocket.chat/apps-engine": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.59.1.tgz", + "integrity": "sha512-49pkGsZzZItkGM7mqWLI92Hp8OD7bLyBMRjOW/IZ5AVZV5L7MA07YOqTXTQpSUI8Ic0u1a1zyv6woTVC8LFn0w==", + "license": "MIT", "dependencies": { - "@hapi/hoek": "9.x.x" + "@msgpack/msgpack": "3.0.0-beta2", + "adm-zip": "^0.5.16", + "debug": "^4.3.7", + "esbuild": "~0.25.12", + "jose": "^4.15.9", + "jsonrpc-lite": "^2.2.0", + "lodash.clonedeep": "^4.5.0", + "semver": "^7.6.3", + "stack-trace": "0.0.10", + "uuid": "~11.0.5" } }, - "node_modules/@hapi/b64": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", - "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", - "dependencies": { - "@hapi/hoek": "9.x.x" + "node_modules/@rocket.chat/apps-engine/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/@hapi/boom": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.0.tgz", - "integrity": "sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==", - "dependencies": { - "@hapi/hoek": "9.x.x" + "node_modules/@rocket.chat/apps-engine/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@hapi/bounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-2.0.0.tgz", - "integrity": "sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" + "node_modules/@rocket.chat/apps-engine/node_modules/uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/@hapi/bourne": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", - "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" - }, - "node_modules/@hapi/call": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-8.0.1.tgz", - "integrity": "sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g==", + "node_modules/@types/node": { + "version": "24.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz", + "integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==", + "dev": true, + "license": "MIT", "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" + "undici-types": "~7.16.0" } }, - "node_modules/@hapi/catbox": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-11.1.1.tgz", - "integrity": "sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/podium": "4.x.x", - "@hapi/validate": "1.x.x" + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" } }, - "node_modules/@hapi/catbox-memory": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz", - "integrity": "sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@hapi/content": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz", - "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==", + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "@hapi/boom": "9.x.x" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@hapi/cryptiles": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", - "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", - "dependencies": { - "@hapi/boom": "9.x.x" - }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "engines": { - "node": ">=12.0.0" + "node": "*" } }, - "node_modules/@hapi/file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz", - "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==" - }, - "node_modules/@hapi/hapi": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-20.0.0.tgz", - "integrity": "sha512-Wh0tIDFsl7nemU2JQYW4zZVr9XkpuZ1eM3yaX8tzaYdaYXon8QeB5NzrTNQY3R1/+fO7amQUrOoLLNPRwIZfgw==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "@hapi/accept": "^5.0.1", - "@hapi/ammo": "^5.0.1", - "@hapi/boom": "9.x.x", - "@hapi/bounce": "2.x.x", - "@hapi/call": "8.x.x", - "@hapi/catbox": "^11.1.1", - "@hapi/catbox-memory": "5.x.x", - "@hapi/heavy": "^7.0.1", - "@hapi/hoek": "9.x.x", - "@hapi/mimos": "5.x.x", - "@hapi/podium": "^4.1.1", - "@hapi/shot": "^5.0.1", - "@hapi/somever": "3.x.x", - "@hapi/statehood": "^7.0.3", - "@hapi/subtext": "^7.0.3", - "@hapi/teamwork": "5.x.x", - "@hapi/topo": "5.x.x", - "@hapi/validate": "^1.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@hapi/heavy": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-7.0.1.tgz", - "integrity": "sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/validate": "1.x.x" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" - }, - "node_modules/@hapi/iron": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", - "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", - "dependencies": { - "@hapi/b64": "5.x.x", - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/cryptiles": "5.x.x", - "@hapi/hoek": "9.x.x" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, - "node_modules/@hapi/mimos": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-5.0.0.tgz", - "integrity": "sha512-EVS6wJYeE73InTlPWt+2e3Izn319iIvffDreci3qDNT+t3lA5ylJ0/SoTaID8e0TPNUkHUSsgJZXEmLHvoYzrA==", - "dependencies": { - "@hapi/hoek": "9.x.x", - "mime-db": "1.x.x" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/@hapi/nigel": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.2.tgz", - "integrity": "sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw==", + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.4", - "@hapi/vise": "^4.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=12.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@hapi/pez": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.0.3.tgz", - "integrity": "sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA==", - "dependencies": { - "@hapi/b64": "5.x.x", - "@hapi/boom": "9.x.x", - "@hapi/content": "^5.0.2", - "@hapi/hoek": "9.x.x", - "@hapi/nigel": "4.x.x" + "node_modules/esbuild": { + "version": "0.12.29", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", + "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" } }, - "node_modules/@hapi/podium": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.1.tgz", - "integrity": "sha512-jh7a6+5Z4FUWzx8fgmxjaAa1DTBu+Qfg+NbVdo0f++rE5DgsVidUYrLDp3db65+QjDLleA2MfKQXkpT8ylBDXA==", - "dependencies": { - "@hapi/hoek": "9.x.x", - "@hapi/teamwork": "5.x.x", - "@hapi/validate": "1.x.x" + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@hapi/shot": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-5.0.4.tgz", - "integrity": "sha512-PcEz0WJgFDA3xNSMeONgQmothFr7jhbbRRSAKaDh7chN7zOXBlhl13bvKZW6CMb2xVfJUmt34CW3e/oExMgBhQ==", + "node_modules/figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", "dependencies": { - "@hapi/hoek": "9.x.x", - "@hapi/validate": "1.x.x" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@hapi/somever": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-3.0.0.tgz", - "integrity": "sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { - "@hapi/bounce": "2.x.x", - "@hapi/hoek": "9.x.x" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@hapi/statehood": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-7.0.3.tgz", - "integrity": "sha512-pYB+pyCHkf2Amh67QAXz7e/DN9jcMplIL7Z6N8h0K+ZTy0b404JKPEYkbWHSnDtxLjJB/OtgElxocr2fMH4G7w==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/bounce": "2.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/cryptiles": "5.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/iron": "6.x.x", - "@hapi/validate": "1.x.x" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/@hapi/subtext": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.0.3.tgz", - "integrity": "sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A==", + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/content": "^5.0.2", - "@hapi/file": "2.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/pez": "^5.0.1", - "@hapi/wreck": "17.x.x" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@hapi/teamwork": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.0.tgz", - "integrity": "sha512-llqoQTrAJDTXxG3c4Kz/uzhBS1TsmSBa/XG5SPcVXgmffHE1nFtyLIK0hNJHCB3EuBKT84adzd1hZNY9GJLWtg==", + "node_modules/graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=8" } }, - "node_modules/@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dependencies": { - "@hapi/hoek": "^9.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/@hapi/validate": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", - "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "node_modules/@hapi/vise": { + "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", - "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==", - "dependencies": { - "@hapi/hoek": "9.x.x" + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@hapi/wreck": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.0.0.tgz", - "integrity": "sha512-d8lqCinbKyDByn7GzJDRDbitddhIEydNm44UcAMejfhEH3o4IYvKYq6K8cAqXbilXPuvZc0ErlUOg9SDdgRtMw==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/hoek": "9.x.x" - } + "node_modules/jsonrpc-lite": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jsonrpc-lite/-/jsonrpc-lite-2.2.0.tgz", + "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==", + "license": "MIT" }, - "node_modules/@msgpack/msgpack": { - "version": "3.0.0-beta2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", - "license": "ISC", - "engines": { - "node": ">= 14" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", - "dev": true, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "@nodelib/fs.stat": "2.0.1", - "run-parallel": "^1.1.9" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 8" + "node": "*" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", - "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", - "dev": true, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { - "node": ">= 8" + "node": "*" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.1", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "node_modules/@oclif/color": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.0.0.tgz", - "integrity": "sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { - "ansi-styles": "^3.2.1", - "supports-color": "^5.4.0", - "tslib": "^1" - }, - "engines": { - "node": ">=8.0.0" + "wrappy": "1" } }, - "node_modules/@oclif/command": { - "version": "1.5.18", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.18.tgz", - "integrity": "sha512-sfLb5UUCwyQ0w9LyQ1/3DUuD/RWnPZk6uvcK5P7pqD65WgRJaOPCqzuNZyb56kPsj6FftRp1UudApNKd7U0KBQ==", - "dependencies": { - "@oclif/config": "^1", - "@oclif/errors": "^1.2.2", - "@oclif/parser": "^3.8.3", - "@oclif/plugin-help": "^2", - "debug": "^4.1.1", - "semver": "^5.6.0" - }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@oclif/config": "^1", - "@oclif/plugin-help": "^2" + "node": ">=0.10.0" } }, - "node_modules/@oclif/command/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "bin": { - "semver": "bin/semver" - } + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" }, - "node_modules/@oclif/config": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.13.2.tgz", - "integrity": "sha512-RUOKeuAaopo3zrA5hcgE0PT2lbAUT72+eJdqTlWyI9sbPrGHZgUwV+vrL6Qal7ywWYDkL0vrKd1YS4yXtKIDKw==", + "node_modules/simple-node-logger": { + "version": "18.12.24", + "resolved": "https://registry.npmjs.org/simple-node-logger/-/simple-node-logger-18.12.24.tgz", + "integrity": "sha512-4dTqpYecHsvPjWo+i+J3pLty8WJDNbxOVesNj5ch8pYH95LIGAFH4dxMSqyf+Os0RTchXifEtI/mfm3AVJftmg==", "dependencies": { - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8.0.0" + "lodash": "^4.17.12", + "moment": "^2.20.1" } }, - "node_modules/@oclif/dev-cli": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@oclif/dev-cli/-/dev-cli-1.22.2.tgz", - "integrity": "sha512-c7633R37RxrQIpwqPKxjNRm6/jb1yuG8fd16hmNz9Nw+/MUhEtQtKHSCe9ScH8n5M06l6LEo4ldk9LEGtpaWwA==", - "dev": true, - "dependencies": { - "@oclif/command": "^1.5.13", - "@oclif/config": "^1.12.12", - "@oclif/errors": "^1.2.2", - "@oclif/plugin-help": "^2.1.6", - "cli-ux": "^5.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "github-slugger": "^1.2.1", - "lodash": "^4.17.11", - "normalize-package-data": "^2.5.0", - "qqjs": "^0.3.10", - "tslib": "^1.9.3" - }, - "bin": { - "oclif-dev": "bin/run" - }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "engines": { - "node": ">=8.10.0" + "node": "*" } }, - "node_modules/@oclif/dev-cli/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=8" } }, - "node_modules/@oclif/errors": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", - "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", - "dependencies": { - "clean-stack": "^1.3.0", - "fs-extra": "^7.0.0", - "indent-string": "^3.2.0", - "strip-ansi": "^5.0.0", - "wrap-ansi": "^4.0.0" - }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", "engines": { - "node": ">=8.0.0" + "node": ">= 0.8.0" } }, - "node_modules/@oclif/errors/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/errors/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "engines": { - "node": ">=4" + "node": ">=14.17" } }, - "node_modules/@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" }, - "node_modules/@oclif/parser": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.3.tgz", - "integrity": "sha512-zN+3oGuv9Lg8NjFvxZTDKFEmhAMfAvd/JWeQp3Ri8pDezoyJQi4OSHHLM8sdHjBh8sePewfWI7+fDUXdrVbrqg==", - "dependencies": { - "@oclif/linewrap": "^1.0.0", - "chalk": "^2.4.2", - "tslib": "^1.9.3" - }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">=8.0.0" + "node": ">= 4.0.0" } }, - "node_modules/@oclif/plugin-autocomplete": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-0.2.0.tgz", - "integrity": "sha512-pHbaE2PH7d9lHjCgFrrQ+ZIwvY+7OAQaGoaANqDbicBNDK/Rszt4N4oGj22dJT7sCQ8a/3Eh942rjxYIq9Mi9Q==", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "license": "MIT", "dependencies": { - "@oclif/command": "^1.5.13", - "@oclif/config": "^1.13.0", - "chalk": "^2.4.1", - "cli-ux": "^5.2.1", - "debug": "^4.0.0", - "fs-extra": "^7.0.0", - "moment": "^2.22.1" + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/@oclif/plugin-autocomplete/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/yazl": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "buffer-crc32": "^1.0.0" } }, - "node_modules/@oclif/plugin-help": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.0.tgz", - "integrity": "sha512-56iIgE7NQfwy/ZrWrvrEfJGb5rrMUt409yoQGw4feiU101UudA1btN1pbUbcKBr7vY9KFeqZZcftXEGxOp7zBg==", - "dependencies": { - "@oclif/command": "^1.5.13", - "chalk": "^2.4.1", - "indent-string": "^3.2.0", - "lodash.template": "^4.4.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0", - "widest-line": "^2.0.1", - "wrap-ansi": "^4.0.0" - }, + "node_modules/yazl/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", "engines": { "node": ">=8.0.0" } + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "optional": true }, - "node_modules/@oclif/plugin-help/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "engines": { - "node": ">=4" - } + "@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "optional": true }, - "node_modules/@oclif/plugin-help/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } + "@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "optional": true }, - "node_modules/@oclif/plugin-not-found": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz", - "integrity": "sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA==", - "dependencies": { - "@oclif/color": "^0.0.0", - "@oclif/command": "^1.5.3", - "cli-ux": "^4.9.0", - "fast-levenshtein": "^2.0.6", - "lodash": "^4.17.11" - }, - "engines": { - "node": ">=8.0.0" - } + "@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "optional": true }, - "node_modules/@oclif/plugin-not-found/node_modules/clean-stack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", - "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==", - "engines": { - "node": ">=6" - } + "@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "optional": true }, - "node_modules/@oclif/plugin-not-found/node_modules/cli-ux": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", - "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", - "dependencies": { - "@oclif/errors": "^1.2.2", - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^1.0.3", - "ansi-escapes": "^3.1.0", - "ansi-styles": "^3.2.1", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "clean-stack": "^2.0.0", - "extract-stack": "^1.0.0", - "fs-extra": "^7.0.0", - "hyperlinker": "^1.0.0", - "indent-string": "^3.2.0", - "is-wsl": "^1.1.0", - "lodash": "^4.17.11", - "password-prompt": "^1.0.7", - "semver": "^5.6.0", - "strip-ansi": "^5.0.0", - "supports-color": "^5.5.0", - "supports-hyperlinks": "^1.0.1", - "treeify": "^1.1.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/plugin-not-found/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/plugin-not-found/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "engines": { - "node": ">=4" - } - }, - "node_modules/@oclif/plugin-not-found/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@oclif/screen": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", - "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/test": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-1.2.4.tgz", - "integrity": "sha512-c0khMdYBGV7t9L7SNbh84t9PmTqfaTp4Jqf3JbWu80fd+SAM03m9o+dvrgx+qv4YbSTum4GpXBZtXHq4AXsD3Q==", - "dev": true, - "dependencies": { - "fancy-test": "^1.4.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/tslint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@oclif/tslint/-/tslint-3.1.1.tgz", - "integrity": "sha512-B1ZWbgzwxDhNZLzVnn+JjyFf9u+J9wNwsz/ZX9YvA9edRYcdiJz9JikCttGPi35V0NU0TUV4UqTqo/q/wQ06jQ==", - "dev": true, - "dependencies": { - "tslint-eslint-rules": "^5.4.0", - "tslint-xo": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/tslint/node_modules/tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "node_modules/@oclif/tslint/node_modules/tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "dependencies": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "peerDependencies": { - "tslint": "^5.0.0", - "typescript": "^2.2.0 || ^3.0.0" - } - }, - "node_modules/@oclif/tslint/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@rocket.chat/apps-compiler": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-compiler/-/apps-compiler-0.5.1.tgz", - "integrity": "sha512-vksyX52Rlj2G6lBzfe9claO1J4LRwJUV9UenxaiVEWY5MOl0DkKgnQhYFP6fllK6jJY0c+HvxJcxHzwSDH5/nQ==", - "license": "MIT", - "dependencies": { - "@rocket.chat/apps-engine": "^1.28.0-alpha.5428", - "esbuild": "^0.12.16", - "figures": "^3.0.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.4", - "lodash.clonedeep": "^4.5.0", - "simple-node-logger": "^18.12.24", - "tv4": "^1.3.0", - "typescript": "^5.8.3", - "yauzl": "^3.2.0", - "yazl": "^2.5.1" - }, - "engines": { - "node": ">=22.0.0", - "typescript": "^5.8.3" - } - }, - "node_modules/@rocket.chat/apps-compiler/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@rocket.chat/apps-engine": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.50.0.tgz", - "integrity": "sha512-N/+w13bBeQlQydvWEYCicJzHBgppUAg74ScZNplA+wfrBPf9j4yjn5y+1/2QdcfCdwmA5wA9l+mw7+NK1FhOlg==", - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "3.0.0-beta2", - "adm-zip": "^0.5.16", - "debug": "^4.3.7", - "esbuild": "^0.25.0", - "jose": "^4.15.9", - "jsonrpc-lite": "^2.2.0", - "lodash.clonedeep": "^4.5.0", - "semver": "^7.6.3", - "stack-trace": "0.0.10", - "uuid": "~11.0.3" - } - }, - "node_modules/@rocket.chat/apps-engine/node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/@rocket.chat/apps-engine/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rocket.chat/apps-engine/node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "node_modules/@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", - "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "dependencies": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hapi__catbox": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.3.tgz", - "integrity": "sha512-gs6MKMKXzWpSqeYsPaDIDAxD8jLNg7aFxgAJE6Jnc+ns072Z9fuh39/NF5gSk1KNoGCLnIpeZ0etT9gY9QDCKg==", - "dev": true - }, - "node_modules/@types/hapi__hapi": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.2.tgz", - "integrity": "sha512-7FwFoaxSCtHXbHbDdArSeVABFOfMLgVkOvOUtWrqUBzw639B2rq9OHv3kOVDHY0bOao0f6ubMzUxio8WQ9QZfQ==", - "dev": true, - "dependencies": { - "@hapi/boom": "^9.0.0", - "@hapi/iron": "^6.0.0", - "@types/hapi__catbox": "*", - "@types/hapi__mimos": "*", - "@types/hapi__podium": "*", - "@types/hapi__shot": "*", - "@types/joi": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hapi__mimos": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.3.tgz", - "integrity": "sha512-vZiKXZ0QqwSh0v1z9/f/VEPvmAHQaAXeVK9kGQIQH+2cqxrb2IL4TSDF0aPhPnNzuCvcUWaeCuGXj8V79v/kEA==", - "dev": true, - "dependencies": { - "@types/mime-db": "*" - } - }, - "node_modules/@types/hapi__podium": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@types/hapi__podium/-/hapi__podium-3.4.1.tgz", - "integrity": "sha512-qgMyeXTZhGWvvUnXFavW2Pksf07IV1haBM/Fdq6cFi1lCIXhUHsaTrr2w651q+rhHZf+1dgP1vltJ0/quLxYYw==", - "dev": true - }, - "node_modules/@types/hapi__shot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", - "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/inquirer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.0.3.tgz", - "integrity": "sha512-lBsdZScFMaFYYIE3Y6CWX22B9VeY2NerT1kyU2heTc3u/W6a+Om6Au2q0rMzBrzynN0l4QoABhI0cbNdyz6fDg==", - "dev": true, - "dependencies": { - "@types/through": "*", - "rxjs": "^6.4.0" - } - }, - "node_modules/@types/joi": { - "version": "14.3.4", - "resolved": "https://registry.npmjs.org/@types/joi/-/joi-14.3.4.tgz", - "integrity": "sha512-1TQNDJvIKlgYXGNIABfgFp9y0FziDpuGrd799Q5RcnsDu+krD+eeW/0Fs5PHARvWWFelOhIG2OPCo6KbadBM4A==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.136", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", - "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==", - "dev": true - }, - "node_modules/@types/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-nCqnKWfvDzTVRh8NS9Zn+rnZYs5+iw5hx3G0nFgKM/R2mJQwPChin4DQ4zXlXnxTtc/3Ys5FnWweKW6NW+d2aw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true - }, - "node_modules/@types/nock": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/nock/-/nock-10.0.3.tgz", - "integrity": "sha512-OthuN+2FuzfZO3yONJ/QVjKmLEuRagS9TV9lEId+WHL9KhftYG+/2z+pxlr0UgVVXSpVD8woie/3fzQn8ft/Ow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "12.6.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", - "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.0.tgz", - "integrity": "sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.1.tgz", - "integrity": "sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg==", - "dev": true - }, - "node_modules/@types/sinon": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.13.tgz", - "integrity": "sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==", - "dev": true - }, - "node_modules/@types/through": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz", - "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tv4": { - "version": "1.2.29", - "resolved": "https://registry.npmjs.org/@types/tv4/-/tv4-1.2.29.tgz", - "integrity": "sha512-NtJmi+XbYocrLb5Au4Q64srX4FlCPDvrSF/OnK3H0QJwrw40tIUoQPDoUHnZ5wpAB2KThtVyeS+kOEQyZabORg==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.5.tgz", - "integrity": "sha512-MNL15wC3EKyw1VLF+RoVO4hJJdk9t/Hlv3rt1OL65Qvuadm4BYo6g9ZJQqoq7X8NBFSsQXgAujWciovh2lpVjA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yazl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-2.4.1.tgz", - "integrity": "sha512-uTgQOl6gCKZ6ys5x2BmnNCd/Em8TqCltjPtyHFc1mz8Q6/+Na7yWnoPgCPhsl44M7S6MfaL6spL6pUM1c7NcDg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", - "license": "MIT", - "engines": { - "node": ">=12.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "dependencies": { - "default-require-extensions": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", - "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.1" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "dependencies": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/caching-transform/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/caching-transform/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-ux": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.3.1.tgz", - "integrity": "sha512-l2MXbitx0FjtHKSbHytuxfxWv6MdWBRh23ItRJjU17cjj0dqZxfAL863tzbR1FIs7jccPllPUvn3QWK6BQg3Pg==", - "dependencies": { - "@oclif/command": "^1.5.1", - "@oclif/errors": "^1.2.1", - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^1.0.3", - "ansi-escapes": "^3.1.0", - "ansi-styles": "^3.2.1", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "clean-stack": "^2.0.0", - "extract-stack": "^1.0.0", - "fs-extra": "^7.0.1", - "hyperlinker": "^1.0.0", - "indent-string": "^3.2.0", - "is-wsl": "^1.1.0", - "lodash": "^4.17.11", - "natural-orderby": "^2.0.1", - "password-prompt": "^1.1.2", - "semver": "^5.6.0", - "string-width": "^3.1.0", - "strip-ansi": "^5.1.0", - "supports-color": "^5.5.0", - "supports-hyperlinks": "^1.0.1", - "treeify": "^1.1.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cli-ux/node_modules/clean-stack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", - "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-ux/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/cli-ux/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-ux/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cli-ux/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/conf": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-6.1.0.tgz", - "integrity": "sha512-NjzT0zGZ7iy88ybk4ysz4YDMcGTEJzS2wFNKyQd1ChqcZfF6IKY1j+1+q5Dubu8si2skcMfA86t13vNz1mJckA==", - "dependencies": { - "ajv": "^6.10.2", - "debounce-fn": "^3.0.1", - "dot-prop": "^5.0.0", - "env-paths": "^2.2.0", - "json-schema-typed": "^7.0.1", - "make-dir": "^3.0.0", - "onetime": "^5.1.0", - "pkg-up": "^3.0.1", - "semver": "^6.2.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conf/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/conf/node_modules/onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cp-file/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cp-file/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/debounce-fn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz", - "integrity": "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "dependencies": { - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha512-qiB/Rir6Un6Ad/TIgTRzsremsTGWzs8j7woXvp14jgq00676uBiBT5eUOi+FgRywZFVy5Us/c04ISRpZhRbS6w==", - "dev": true, - "dependencies": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/doctrine/node_modules/esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha512-RG1ZkUT7iFJG9LSHr7KDuuMSlujfeTtMNIcInURxKAxhMtwQhI3NrQhz26gZQYlsYZQKzsnwtpKrFKj9K9Qu1A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-stack": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", - "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=", - "engines": { - "node": ">=4" - } - }, - "node_modules/fancy-test": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-1.4.3.tgz", - "integrity": "sha512-Lt3mcQ0jn9Kg9JDmobVb4ZANiyT4e2VC5qbQvuzJVNYXyKjSgFWKn7bZN4BKei33v5jYWx28KlbDgsxuqnBRvg==", - "dev": true, - "dependencies": { - "@types/chai": "*", - "@types/lodash": "*", - "@types/mocha": "*", - "@types/nock": "*", - "@types/node": "*", - "@types/sinon": "*", - "lodash": "^4.17.11", - "mock-stdin": "^0.3.1", - "stdout-stderr": "^0.1.9" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.0" - } - }, - "node_modules/fetch-with-proxy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fetch-with-proxy/-/fetch-with-proxy-3.0.1.tgz", - "integrity": "sha512-8C5JZ+Ea2eTOkFuQhB252QPgEc68LS7+8uNrFbYFs7t114Bgdj7hiYmtwkHhmN8TvafGVRbspMMD/Rg/tw0RwA==", - "dependencies": { - "node-abort-controller": "^1.1.0", - "node-fetch": "^2.6.1", - "proxy-from-env": "^1.1.0", - "tunnel-agent": "^0.6.0" - } - }, - "node_modules/figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "dependencies": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/form-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", - "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/fuzzy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha1-THbsL/CsGjap3M+aAN+GIweNTtg=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/github-slugger": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", - "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", - "dev": true, - "dependencies": { - "emoji-regex": ">=6.0.0 <=6.1.1" - } - }, - "node_modules/github-slugger/node_modules/emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/handlebars/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "dependencies": { - "is-stream": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-call": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.2.5.tgz", - "integrity": "sha512-SfJ9j2xfi8zhQuJxcBCN1AhPCUAvPhipNaoeHWHfHiV0gz4uf9RUt2kl+xu9mxJLKxhNP7We87aRGbaSGPjr8A==", - "dev": true, - "dependencies": { - "content-type": "^1.0.4", - "debug": "^4.1.1", - "is-retry-allowed": "^1.1.0", - "is-stream": "^2.0.0", - "parse-json": "^4.0.0", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-call/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/http-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/http-server/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/http-server/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/http-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer-checkbox-plus-prompt": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.0.1.tgz", - "integrity": "sha1-VP8e0Jd3oQNThWIna1z0Uhox0W0=", - "dependencies": { - "cli-cursor": "^2.1.0", - "figures": "^2.0.0", - "inquirer": "^5.1.0", - "lodash": "^4.17.5" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dependencies": { - "symbol-observable": "1.0.1" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inversify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", - "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "node_modules/is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "dependencies": { - "append-transform": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "dependencies": { - "handlebars": "^4.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-schema-typed": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.1.tgz", - "integrity": "sha512-IqUK+Cqc8/MqHsCvv1TMccbKdBzoATOLHXZAF5UDu70/CCxo648cHUig24hc+XTK53TyeNk1UeVTlc2Haovtsw==" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonrpc-lite": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jsonrpc-lite/-/jsonrpc-lite-2.2.0.tgz", - "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==", - "license": "MIT" - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dependencies": { - "mime-db": "1.40.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/mock-stdin": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/mock-stdin/-/mock-stdin-0.3.1.tgz", - "integrity": "sha1-xlfZZC2QeGQ1xkyl6Zu9TQm9fdM=", - "dev": true - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "engines": { - "node": "*" - } - }, - "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "node_modules/nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-abort-controller": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-1.2.1.tgz", - "integrity": "sha512-79PYeJuj6S9+yOHirR0JBLFOgjB6sQCir10uN6xRx25iD+ZD4ULqgRn3MwWBRaQGB0vEgReJzWwJo42T1R6YbQ==" - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nyc/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dependencies": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/pre-commit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", - "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "spawn-sync": "^1.0.15", - "which": "1.2.x" - } - }, - "node_modules/pre-commit/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/pre-commit/node_modules/which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qqjs": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/qqjs/-/qqjs-0.3.11.tgz", - "integrity": "sha512-pB2X5AduTl78J+xRSxQiEmga1jQV0j43jOPs/MTgTLApGFEOn6NgdE2dEjp7nvDtjkIOZbvFIojAiYUx6ep3zg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "debug": "^4.1.1", - "execa": "^0.10.0", - "fs-extra": "^6.0.1", - "get-stream": "^5.1.0", - "glob": "^7.1.2", - "globby": "^10.0.1", - "http-call": "^5.1.2", - "load-json-file": "^6.2.0", - "pkg-dir": "^4.2.0", - "tar-fs": "^2.0.0", - "tmp": "^0.1.0", - "write-json-file": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/qqjs/node_modules/fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/qqjs/node_modules/tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "dependencies": { - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "node_modules/resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dependencies": { - "is-promise": "^2.1.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "node_modules/rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "node_modules/simple-node-logger": { - "version": "18.12.24", - "resolved": "https://registry.npmjs.org/simple-node-logger/-/simple-node-logger-18.12.24.tgz", - "integrity": "sha512-4dTqpYecHsvPjWo+i+J3pLty8WJDNbxOVesNj5ch8pYH95LIGAFH4dxMSqyf+Os0RTchXifEtI/mfm3AVJftmg==", - "dependencies": { - "lodash": "^4.17.12", - "moment": "^2.20.1" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sort-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-3.0.0.tgz", - "integrity": "sha512-77XUKMiZN5LvQXZ9sgWfJza19AvYIDwaDGwGiULM+B5XYru8Z90Oh06JvqDlJczvjjYvssrV0aK1GI6+YXvn5A==", - "dev": true, - "dependencies": { - "is-plain-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, - "node_modules/spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "dependencies": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "engines": { - "node": "*" - } - }, - "node_modules/stdout-stderr": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/stdout-stderr/-/stdout-stderr-0.1.9.tgz", - "integrity": "sha1-m0juBO/5Ve4Hd24nEl1VJNnQL1c=", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/stdout-stderr/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/stdout-stderr/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/stdout-stderr/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dependencies": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/systeminformation": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.6.4.tgz", - "integrity": "sha512-b2tvW1R+qjNEoAGgh734EGLgqbDMghjsHRaWo36skAC6JM1tw1pitcGz/REt+qSIRSXbE4PKECojhaSrBRrEmw==", - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=4.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, - "node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "dev": true, - "dependencies": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "node_modules/tslint": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", - "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" - } - }, - "node_modules/tslint-consistent-codestyle": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz", - "integrity": "sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg==", - "dev": true, - "dependencies": { - "@fimbul/bifrost": "^0.17.0", - "tslib": "^1.7.1", - "tsutils": "^2.29.0" - }, - "peerDependencies": { - "tslint": "^5.0.0", - "typescript": ">=2.1.4 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >=3.1.0-dev || >=3.2.0-dev || >=3.3.0-dev || >=3.4.0-dev" - } - }, - "node_modules/tslint-consistent-codestyle/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tslint-xo": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/tslint-xo/-/tslint-xo-0.9.0.tgz", - "integrity": "sha512-Zk5jBdQVUaHEmR9TUoh1TJOjjCr7/nRplA+jDZBvucyBMx65pt0unTr6H/0HvrtSlucFvOMYsyBZE1W8b4AOig==", - "deprecated": "Deprecated as TSLint is deprecated: https://medium.com/palantir/tslint-in-2019-1a144c2317a9", - "dev": true, - "dependencies": { - "tslint-consistent-codestyle": "^1.11.0", - "tslint-eslint-rules": "^5.3.1", - "tslint-microsoft-contrib": "^5.0.2" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "tslint": ">=5.11.0" - } - }, - "node_modules/tslint-xo/node_modules/tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "node_modules/tslint-xo/node_modules/tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "dependencies": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "peerDependencies": { - "tslint": "^5.0.0", - "typescript": "^2.2.0 || ^3.0.0" - } - }, - "node_modules/tslint-xo/node_modules/tslint-microsoft-contrib": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "tsutils": "^2.27.2 <2.29.0" - }, - "peerDependencies": { - "tslint": "^5.1.0", - "typescript": "^2.1.0 || ^3.0.0" - } - }, - "node_modules/tslint-xo/node_modules/tslint-microsoft-contrib/node_modules/tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tslint-xo/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.1.tgz", - "integrity": "sha512-kiuZzD1uUA5DxGj/uxbde+ymp6VVdAxdzOIlAFbYKrPyla8/uiJ9JLBm1QsPhOm4Muj0/+cWEDP99yoCUcSl6Q==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz", - "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==", - "dev": true, - "optional": true, - "dependencies": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", - "dependencies": { - "upper-case": "^1.1.1" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dependencies": { - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", - "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", - "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-json-file": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.1.1.tgz", - "integrity": "sha512-wHI383JJbaZeaxWAk57LeX8iq7od/nfDbp/Hkk31al5rmYvc0gtt4lkw+nt8KJW8u9Uy9GcoHeYE3v6BUl0ZUw==", - "dev": true, - "dependencies": { - "detect-indent": "^6.0.0", - "graceful-fs": "^4.1.15", - "is-plain-obj": "^2.0.0", - "make-dir": "^3.0.0", - "sort-keys": "^3.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "optional": true - }, - "@fimbul/bifrost": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", - "integrity": "sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==", - "dev": true, - "requires": { - "@fimbul/ymir": "^0.17.0", - "get-caller-file": "^2.0.0", - "tslib": "^1.8.1", - "tsutils": "^3.5.0" - } - }, - "@fimbul/ymir": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.17.0.tgz", - "integrity": "sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==", - "dev": true, - "requires": { - "inversify": "^5.0.0", - "reflect-metadata": "^0.1.12", - "tslib": "^1.8.1" - } - }, - "@hapi/accept": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", - "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/ammo": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-5.0.1.tgz", - "integrity": "sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA==", - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/b64": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", - "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/boom": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.0.tgz", - "integrity": "sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==", - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/bounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-2.0.0.tgz", - "integrity": "sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/bourne": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", - "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" - }, - "@hapi/call": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-8.0.1.tgz", - "integrity": "sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/catbox": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-11.1.1.tgz", - "integrity": "sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/podium": "4.x.x", - "@hapi/validate": "1.x.x" - } - }, - "@hapi/catbox-memory": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz", - "integrity": "sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/content": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz", - "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==", - "requires": { - "@hapi/boom": "9.x.x" - } - }, - "@hapi/cryptiles": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", - "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", - "requires": { - "@hapi/boom": "9.x.x" - } - }, - "@hapi/file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz", - "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==" - }, - "@hapi/hapi": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-20.0.0.tgz", - "integrity": "sha512-Wh0tIDFsl7nemU2JQYW4zZVr9XkpuZ1eM3yaX8tzaYdaYXon8QeB5NzrTNQY3R1/+fO7amQUrOoLLNPRwIZfgw==", - "requires": { - "@hapi/accept": "^5.0.1", - "@hapi/ammo": "^5.0.1", - "@hapi/boom": "9.x.x", - "@hapi/bounce": "2.x.x", - "@hapi/call": "8.x.x", - "@hapi/catbox": "^11.1.1", - "@hapi/catbox-memory": "5.x.x", - "@hapi/heavy": "^7.0.1", - "@hapi/hoek": "9.x.x", - "@hapi/mimos": "5.x.x", - "@hapi/podium": "^4.1.1", - "@hapi/shot": "^5.0.1", - "@hapi/somever": "3.x.x", - "@hapi/statehood": "^7.0.3", - "@hapi/subtext": "^7.0.3", - "@hapi/teamwork": "5.x.x", - "@hapi/topo": "5.x.x", - "@hapi/validate": "^1.1.0" - } - }, - "@hapi/heavy": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-7.0.1.tgz", - "integrity": "sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/validate": "1.x.x" - } - }, - "@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" - }, - "@hapi/iron": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", - "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", - "requires": { - "@hapi/b64": "5.x.x", - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/cryptiles": "5.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/mimos": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-5.0.0.tgz", - "integrity": "sha512-EVS6wJYeE73InTlPWt+2e3Izn319iIvffDreci3qDNT+t3lA5ylJ0/SoTaID8e0TPNUkHUSsgJZXEmLHvoYzrA==", - "requires": { - "@hapi/hoek": "9.x.x", - "mime-db": "1.x.x" - } - }, - "@hapi/nigel": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.2.tgz", - "integrity": "sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw==", - "requires": { - "@hapi/hoek": "^9.0.4", - "@hapi/vise": "^4.0.0" - } - }, - "@hapi/pez": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.0.3.tgz", - "integrity": "sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA==", - "requires": { - "@hapi/b64": "5.x.x", - "@hapi/boom": "9.x.x", - "@hapi/content": "^5.0.2", - "@hapi/hoek": "9.x.x", - "@hapi/nigel": "4.x.x" - } - }, - "@hapi/podium": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.1.tgz", - "integrity": "sha512-jh7a6+5Z4FUWzx8fgmxjaAa1DTBu+Qfg+NbVdo0f++rE5DgsVidUYrLDp3db65+QjDLleA2MfKQXkpT8ylBDXA==", - "requires": { - "@hapi/hoek": "9.x.x", - "@hapi/teamwork": "5.x.x", - "@hapi/validate": "1.x.x" - } - }, - "@hapi/shot": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-5.0.4.tgz", - "integrity": "sha512-PcEz0WJgFDA3xNSMeONgQmothFr7jhbbRRSAKaDh7chN7zOXBlhl13bvKZW6CMb2xVfJUmt34CW3e/oExMgBhQ==", - "requires": { - "@hapi/hoek": "9.x.x", - "@hapi/validate": "1.x.x" - } - }, - "@hapi/somever": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-3.0.0.tgz", - "integrity": "sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA==", - "requires": { - "@hapi/bounce": "2.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/statehood": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-7.0.3.tgz", - "integrity": "sha512-pYB+pyCHkf2Amh67QAXz7e/DN9jcMplIL7Z6N8h0K+ZTy0b404JKPEYkbWHSnDtxLjJB/OtgElxocr2fMH4G7w==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/bounce": "2.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/cryptiles": "5.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/iron": "6.x.x", - "@hapi/validate": "1.x.x" - } - }, - "@hapi/subtext": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.0.3.tgz", - "integrity": "sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/content": "^5.0.2", - "@hapi/file": "2.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/pez": "^5.0.1", - "@hapi/wreck": "17.x.x" - } - }, - "@hapi/teamwork": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.0.tgz", - "integrity": "sha512-llqoQTrAJDTXxG3c4Kz/uzhBS1TsmSBa/XG5SPcVXgmffHE1nFtyLIK0hNJHCB3EuBKT84adzd1hZNY9GJLWtg==" - }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@hapi/validate": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", - "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0" - } - }, - "@hapi/vise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", - "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==", - "requires": { - "@hapi/hoek": "9.x.x" - } - }, - "@hapi/wreck": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.0.0.tgz", - "integrity": "sha512-d8lqCinbKyDByn7GzJDRDbitddhIEydNm44UcAMejfhEH3o4IYvKYq6K8cAqXbilXPuvZc0ErlUOg9SDdgRtMw==", - "requires": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "@msgpack/msgpack": { - "version": "3.0.0-beta2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.1", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", - "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.1", - "fastq": "^1.6.0" - } - }, - "@oclif/color": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.0.0.tgz", - "integrity": "sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw==", - "requires": { - "ansi-styles": "^3.2.1", - "supports-color": "^5.4.0", - "tslib": "^1" - } - }, - "@oclif/command": { - "version": "1.5.18", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.18.tgz", - "integrity": "sha512-sfLb5UUCwyQ0w9LyQ1/3DUuD/RWnPZk6uvcK5P7pqD65WgRJaOPCqzuNZyb56kPsj6FftRp1UudApNKd7U0KBQ==", - "requires": { - "@oclif/config": "^1", - "@oclif/errors": "^1.2.2", - "@oclif/parser": "^3.8.3", - "@oclif/plugin-help": "^2", - "debug": "^4.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } - } - }, - "@oclif/config": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.13.2.tgz", - "integrity": "sha512-RUOKeuAaopo3zrA5hcgE0PT2lbAUT72+eJdqTlWyI9sbPrGHZgUwV+vrL6Qal7ywWYDkL0vrKd1YS4yXtKIDKw==", - "requires": { - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "tslib": "^1.9.3" - } - }, - "@oclif/dev-cli": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@oclif/dev-cli/-/dev-cli-1.22.2.tgz", - "integrity": "sha512-c7633R37RxrQIpwqPKxjNRm6/jb1yuG8fd16hmNz9Nw+/MUhEtQtKHSCe9ScH8n5M06l6LEo4ldk9LEGtpaWwA==", - "dev": true, - "requires": { - "@oclif/command": "^1.5.13", - "@oclif/config": "^1.12.12", - "@oclif/errors": "^1.2.2", - "@oclif/plugin-help": "^2.1.6", - "cli-ux": "^5.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "github-slugger": "^1.2.1", - "lodash": "^4.17.11", - "normalize-package-data": "^2.5.0", - "qqjs": "^0.3.10", - "tslib": "^1.9.3" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "@oclif/errors": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", - "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", - "requires": { - "clean-stack": "^1.3.0", - "fs-extra": "^7.0.0", - "indent-string": "^3.2.0", - "strip-ansi": "^5.0.0", - "wrap-ansi": "^4.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - } - } - }, - "@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" - }, - "@oclif/parser": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.3.tgz", - "integrity": "sha512-zN+3oGuv9Lg8NjFvxZTDKFEmhAMfAvd/JWeQp3Ri8pDezoyJQi4OSHHLM8sdHjBh8sePewfWI7+fDUXdrVbrqg==", - "requires": { - "@oclif/linewrap": "^1.0.0", - "chalk": "^2.4.2", - "tslib": "^1.9.3" - } - }, - "@oclif/plugin-autocomplete": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-0.2.0.tgz", - "integrity": "sha512-pHbaE2PH7d9lHjCgFrrQ+ZIwvY+7OAQaGoaANqDbicBNDK/Rszt4N4oGj22dJT7sCQ8a/3Eh942rjxYIq9Mi9Q==", - "requires": { - "@oclif/command": "^1.5.13", - "@oclif/config": "^1.13.0", - "chalk": "^2.4.1", - "cli-ux": "^5.2.1", - "debug": "^4.0.0", - "fs-extra": "^7.0.0", - "moment": "^2.22.1" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "@oclif/plugin-help": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.0.tgz", - "integrity": "sha512-56iIgE7NQfwy/ZrWrvrEfJGb5rrMUt409yoQGw4feiU101UudA1btN1pbUbcKBr7vY9KFeqZZcftXEGxOp7zBg==", - "requires": { - "@oclif/command": "^1.5.13", - "chalk": "^2.4.1", - "indent-string": "^3.2.0", - "lodash.template": "^4.4.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0", - "widest-line": "^2.0.1", - "wrap-ansi": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "@oclif/plugin-not-found": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz", - "integrity": "sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA==", - "requires": { - "@oclif/color": "^0.0.0", - "@oclif/command": "^1.5.3", - "cli-ux": "^4.9.0", - "fast-levenshtein": "^2.0.6", - "lodash": "^4.17.11" - }, - "dependencies": { - "clean-stack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", - "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==" - }, - "cli-ux": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", - "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", - "requires": { - "@oclif/errors": "^1.2.2", - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^1.0.3", - "ansi-escapes": "^3.1.0", - "ansi-styles": "^3.2.1", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "clean-stack": "^2.0.0", - "extract-stack": "^1.0.0", - "fs-extra": "^7.0.0", - "hyperlinker": "^1.0.0", - "indent-string": "^3.2.0", - "is-wsl": "^1.1.0", - "lodash": "^4.17.11", - "password-prompt": "^1.0.7", - "semver": "^5.6.0", - "strip-ansi": "^5.0.0", - "supports-color": "^5.5.0", - "supports-hyperlinks": "^1.0.1", - "treeify": "^1.1.0", - "tslib": "^1.9.3" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } - } - }, - "@oclif/screen": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", - "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==" - }, - "@oclif/test": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-1.2.4.tgz", - "integrity": "sha512-c0khMdYBGV7t9L7SNbh84t9PmTqfaTp4Jqf3JbWu80fd+SAM03m9o+dvrgx+qv4YbSTum4GpXBZtXHq4AXsD3Q==", - "dev": true, - "requires": { - "fancy-test": "^1.4.3" - } - }, - "@oclif/tslint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@oclif/tslint/-/tslint-3.1.1.tgz", - "integrity": "sha512-B1ZWbgzwxDhNZLzVnn+JjyFf9u+J9wNwsz/ZX9YvA9edRYcdiJz9JikCttGPi35V0NU0TUV4UqTqo/q/wQ06jQ==", - "dev": true, - "requires": { - "tslint-eslint-rules": "^5.4.0", - "tslint-xo": "^0.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "peer": true - } - } - }, - "@rocket.chat/apps-compiler": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-compiler/-/apps-compiler-0.5.1.tgz", - "integrity": "sha512-vksyX52Rlj2G6lBzfe9claO1J4LRwJUV9UenxaiVEWY5MOl0DkKgnQhYFP6fllK6jJY0c+HvxJcxHzwSDH5/nQ==", - "requires": { - "@rocket.chat/apps-engine": "^1.28.0-alpha.5428", - "esbuild": "^0.12.16", - "figures": "^3.0.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.4", - "lodash.clonedeep": "^4.5.0", - "simple-node-logger": "^18.12.24", - "tv4": "^1.3.0", - "typescript": "^5.8.3", - "yauzl": "^3.2.0", - "yazl": "^2.5.1" - }, - "dependencies": { - "typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==" - } - } - }, - "@rocket.chat/apps-engine": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.50.0.tgz", - "integrity": "sha512-N/+w13bBeQlQydvWEYCicJzHBgppUAg74ScZNplA+wfrBPf9j4yjn5y+1/2QdcfCdwmA5wA9l+mw7+NK1FhOlg==", - "requires": { - "@msgpack/msgpack": "3.0.0-beta2", - "adm-zip": "^0.5.16", - "debug": "^4.3.7", - "esbuild": "^0.25.0", - "jose": "^4.15.9", - "jsonrpc-lite": "^2.2.0", - "lodash.clonedeep": "^4.5.0", - "semver": "^7.6.3", - "stack-trace": "0.0.10", - "uuid": "~11.0.3" - }, - "dependencies": { - "esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "requires": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" - }, - "uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==" - } - } - }, - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/fs-extra": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", - "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hapi__catbox": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.3.tgz", - "integrity": "sha512-gs6MKMKXzWpSqeYsPaDIDAxD8jLNg7aFxgAJE6Jnc+ns072Z9fuh39/NF5gSk1KNoGCLnIpeZ0etT9gY9QDCKg==", - "dev": true - }, - "@types/hapi__hapi": { - "version": "20.0.2", - "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.2.tgz", - "integrity": "sha512-7FwFoaxSCtHXbHbDdArSeVABFOfMLgVkOvOUtWrqUBzw639B2rq9OHv3kOVDHY0bOao0f6ubMzUxio8WQ9QZfQ==", - "dev": true, - "requires": { - "@hapi/boom": "^9.0.0", - "@hapi/iron": "^6.0.0", - "@types/hapi__catbox": "*", - "@types/hapi__mimos": "*", - "@types/hapi__podium": "*", - "@types/hapi__shot": "*", - "@types/joi": "*", - "@types/node": "*" - } - }, - "@types/hapi__mimos": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.3.tgz", - "integrity": "sha512-vZiKXZ0QqwSh0v1z9/f/VEPvmAHQaAXeVK9kGQIQH+2cqxrb2IL4TSDF0aPhPnNzuCvcUWaeCuGXj8V79v/kEA==", - "dev": true, - "requires": { - "@types/mime-db": "*" - } - }, - "@types/hapi__podium": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@types/hapi__podium/-/hapi__podium-3.4.1.tgz", - "integrity": "sha512-qgMyeXTZhGWvvUnXFavW2Pksf07IV1haBM/Fdq6cFi1lCIXhUHsaTrr2w651q+rhHZf+1dgP1vltJ0/quLxYYw==", - "dev": true - }, - "@types/hapi__shot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.1.tgz", - "integrity": "sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/inquirer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.0.3.tgz", - "integrity": "sha512-lBsdZScFMaFYYIE3Y6CWX22B9VeY2NerT1kyU2heTc3u/W6a+Om6Au2q0rMzBrzynN0l4QoABhI0cbNdyz6fDg==", - "dev": true, - "requires": { - "@types/through": "*", - "rxjs": "^6.4.0" - } - }, - "@types/joi": { - "version": "14.3.4", - "resolved": "https://registry.npmjs.org/@types/joi/-/joi-14.3.4.tgz", - "integrity": "sha512-1TQNDJvIKlgYXGNIABfgFp9y0FziDpuGrd799Q5RcnsDu+krD+eeW/0Fs5PHARvWWFelOhIG2OPCo6KbadBM4A==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.136", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", - "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==", - "dev": true - }, - "@types/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-nCqnKWfvDzTVRh8NS9Zn+rnZYs5+iw5hx3G0nFgKM/R2mJQwPChin4DQ4zXlXnxTtc/3Ys5FnWweKW6NW+d2aw==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true - }, - "@types/nock": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/nock/-/nock-10.0.3.tgz", - "integrity": "sha512-OthuN+2FuzfZO3yONJ/QVjKmLEuRagS9TV9lEId+WHL9KhftYG+/2z+pxlr0UgVVXSpVD8woie/3fzQn8ft/Ow==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "12.6.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", - "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.0.tgz", - "integrity": "sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/semver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.1.tgz", - "integrity": "sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg==", - "dev": true - }, - "@types/sinon": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.13.tgz", - "integrity": "sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==", - "dev": true - }, - "@types/through": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz", - "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/tv4": { - "version": "1.2.29", - "resolved": "https://registry.npmjs.org/@types/tv4/-/tv4-1.2.29.tgz", - "integrity": "sha512-NtJmi+XbYocrLb5Au4Q64srX4FlCPDvrSF/OnK3H0QJwrw40tIUoQPDoUHnZ5wpAB2KThtVyeS+kOEQyZabORg==", - "dev": true - }, - "@types/uuid": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.5.tgz", - "integrity": "sha512-MNL15wC3EKyw1VLF+RoVO4hJJdk9t/Hlv3rt1OL65Qvuadm4BYo6g9ZJQqoq7X8NBFSsQXgAujWciovh2lpVjA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yazl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-2.4.1.tgz", - "integrity": "sha512-uTgQOl6gCKZ6ys5x2BmnNCd/Em8TqCltjPtyHFc1mz8Q6/+Na7yWnoPgCPhsl44M7S6MfaL6spL6pUM1c7NcDg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", - "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - }, - "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "dev": true, - "requires": { - "readable-stream": "^3.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", - "dev": true - }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-ux": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.3.1.tgz", - "integrity": "sha512-l2MXbitx0FjtHKSbHytuxfxWv6MdWBRh23ItRJjU17cjj0dqZxfAL863tzbR1FIs7jccPllPUvn3QWK6BQg3Pg==", - "requires": { - "@oclif/command": "^1.5.1", - "@oclif/errors": "^1.2.1", - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^1.0.3", - "ansi-escapes": "^3.1.0", - "ansi-styles": "^3.2.1", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "clean-stack": "^2.0.0", - "extract-stack": "^1.0.0", - "fs-extra": "^7.0.1", - "hyperlinker": "^1.0.0", - "indent-string": "^3.2.0", - "is-wsl": "^1.1.0", - "lodash": "^4.17.11", - "natural-orderby": "^2.0.1", - "password-prompt": "^1.1.2", - "semver": "^5.6.0", - "string-width": "^3.1.0", - "strip-ansi": "^5.1.0", - "supports-color": "^5.5.0", - "supports-hyperlinks": "^1.0.1", - "treeify": "^1.1.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "clean-stack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.1.0.tgz", - "integrity": "sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA==" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "conf": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-6.1.0.tgz", - "integrity": "sha512-NjzT0zGZ7iy88ybk4ysz4YDMcGTEJzS2wFNKyQd1ChqcZfF6IKY1j+1+q5Dubu8si2skcMfA86t13vNz1mJckA==", - "requires": { - "ajv": "^6.10.2", - "debounce-fn": "^3.0.1", - "dot-prop": "^5.0.0", - "env-paths": "^2.2.0", - "json-schema-typed": "^7.0.1", - "make-dir": "^3.0.0", - "onetime": "^5.1.0", - "pkg-up": "^3.0.1", - "semver": "^6.2.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", - "dev": true - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } - } - }, - "debounce-fn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz", - "integrity": "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q==", - "requires": { - "mimic-fn": "^2.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - } - }, - "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha512-qiB/Rir6Un6Ad/TIgTRzsremsTGWzs8j7woXvp14jgq00676uBiBT5eUOi+FgRywZFVy5Us/c04ISRpZhRbS6w==", - "dev": true, - "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, - "dependencies": { - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha512-RG1ZkUT7iFJG9LSHr7KDuuMSlujfeTtMNIcInURxKAxhMtwQhI3NrQhz26gZQYlsYZQKzsnwtpKrFKj9K9Qu1A==", - "dev": true - } - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extract-stack": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", - "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=" - }, - "fancy-test": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-1.4.3.tgz", - "integrity": "sha512-Lt3mcQ0jn9Kg9JDmobVb4ZANiyT4e2VC5qbQvuzJVNYXyKjSgFWKn7bZN4BKei33v5jYWx28KlbDgsxuqnBRvg==", - "dev": true, - "requires": { - "@types/chai": "*", - "@types/lodash": "*", - "@types/mocha": "*", - "@types/nock": "*", - "@types/node": "*", - "@types/sinon": "*", - "lodash": "^4.17.11", - "mock-stdin": "^0.3.1", - "stdout-stderr": "^0.1.9" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", - "micromatch": "^4.0.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "requires": { - "reusify": "^1.0.0" - } - }, - "fetch-with-proxy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fetch-with-proxy/-/fetch-with-proxy-3.0.1.tgz", - "integrity": "sha512-8C5JZ+Ea2eTOkFuQhB252QPgEc68LS7+8uNrFbYFs7t114Bgdj7hiYmtwkHhmN8TvafGVRbspMMD/Rg/tw0RwA==", - "requires": { - "node-abort-controller": "^1.1.0", - "node-fetch": "^2.6.1", - "proxy-from-env": "^1.1.0", - "tunnel-agent": "^0.6.0" - } - }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "form-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", - "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "fuzzy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha1-THbsL/CsGjap3M+aAN+GIweNTtg=" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "github-slugger": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", - "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", - "dev": true, - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", - "dev": true - } - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "http-call": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.2.5.tgz", - "integrity": "sha512-SfJ9j2xfi8zhQuJxcBCN1AhPCUAvPhipNaoeHWHfHiV0gz4uf9RUt2kl+xu9mxJLKxhNP7We87aRGbaSGPjr8A==", - "dev": true, - "requires": { - "content-type": "^1.0.4", - "debug": "^4.1.1", - "is-retry-allowed": "^1.1.0", - "is-stream": "^2.0.0", - "parse-json": "^4.0.0", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - } - } - }, - "http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "requires": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - } - } - }, - "inquirer-checkbox-plus-prompt": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.0.1.tgz", - "integrity": "sha1-VP8e0Jd3oQNThWIna1z0Uhox0W0=", - "requires": { - "cli-cursor": "^2.1.0", - "figures": "^2.0.0", - "inquirer": "^5.1.0", - "lodash": "^4.17.5" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "requires": { - "symbol-observable": "1.0.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "inversify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", - "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, - "jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-schema-typed": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.1.tgz", - "integrity": "sha512-IqUK+Cqc8/MqHsCvv1TMccbKdBzoATOLHXZAF5UDu70/CCxo648cHUig24hc+XTK53TyeNk1UeVTlc2Haovtsw==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonrpc-lite": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jsonrpc-lite/-/jsonrpc-lite-2.2.0.tgz", - "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==" - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } - } - }, - "mock-stdin": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/mock-stdin/-/mock-stdin-0.3.1.tgz", - "integrity": "sha1-xlfZZC2QeGQ1xkyl6Zu9TQm9fdM=", - "dev": true - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-abort-controller": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-1.2.1.tgz", - "integrity": "sha512-79PYeJuj6S9+yOHirR0JBLFOgjB6sQCir10uN6xRx25iD+ZD4ULqgRn3MwWBRaQGB0vEgReJzWwJo42T1R6YbQ==" - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "requires": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "pre-commit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", - "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "spawn-sync": "^1.0.15", - "which": "1.2.x" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qqjs": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/qqjs/-/qqjs-0.3.11.tgz", - "integrity": "sha512-pB2X5AduTl78J+xRSxQiEmga1jQV0j43jOPs/MTgTLApGFEOn6NgdE2dEjp7nvDtjkIOZbvFIojAiYUx6ep3zg==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "debug": "^4.1.1", - "execa": "^0.10.0", - "fs-extra": "^6.0.1", - "get-stream": "^5.1.0", - "glob": "^7.1.2", - "globby": "^10.0.1", - "http-call": "^5.1.2", - "load-json-file": "^6.2.0", - "pkg-dir": "^4.2.0", - "tar-fs": "^2.0.0", - "tmp": "^0.1.0", - "write-json-file": "^4.1.1" - }, - "dependencies": { - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "requires": { - "esprima": "~4.0.0" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "optional": true }, - "secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "optional": true }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "optional": true }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } + "@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "optional": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "optional": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } + "@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "optional": true }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "optional": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } + "@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "optional": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "optional": true }, - "simple-node-logger": { - "version": "18.12.24", - "resolved": "https://registry.npmjs.org/simple-node-logger/-/simple-node-logger-18.12.24.tgz", - "integrity": "sha512-4dTqpYecHsvPjWo+i+J3pLty8WJDNbxOVesNj5ch8pYH95LIGAFH4dxMSqyf+Os0RTchXifEtI/mfm3AVJftmg==", - "requires": { - "lodash": "^4.17.12", - "moment": "^2.20.1" - } + "@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "optional": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "optional": true }, - "sort-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-3.0.0.tgz", - "integrity": "sha512-77XUKMiZN5LvQXZ9sgWfJza19AvYIDwaDGwGiULM+B5XYru8Z90Oh06JvqDlJczvjjYvssrV0aK1GI6+YXvn5A==", - "dev": true, - "requires": { - "is-plain-obj": "^2.0.0" - } + "@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "optional": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "optional": true }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "optional": true }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "dev": true, - "requires": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } + "@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "optional": true }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } + "@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "optional": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "optional": true }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "optional": true }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } + "@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "optional": true }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "optional": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "optional": true }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + "@msgpack/msgpack": { + "version": "3.0.0-beta2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==" }, - "stdout-stderr": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/stdout-stderr/-/stdout-stderr-0.1.9.tgz", - "integrity": "sha1-m0juBO/5Ve4Hd24nEl1VJNnQL1c=", - "dev": true, + "@rocket.chat/apps-compiler": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-compiler/-/apps-compiler-0.5.1.tgz", + "integrity": "sha512-vksyX52Rlj2G6lBzfe9claO1J4LRwJUV9UenxaiVEWY5MOl0DkKgnQhYFP6fllK6jJY0c+HvxJcxHzwSDH5/nQ==", "requires": { - "debug": "^3.1.0", - "strip-ansi": "^4.0.0" + "@rocket.chat/apps-engine": "^1.28.0-alpha.5428", + "esbuild": "^0.12.16", + "figures": "^3.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.4", + "lodash.clonedeep": "^4.5.0", + "simple-node-logger": "^18.12.24", + "tv4": "^1.3.0", + "typescript": "^5.8.3", + "yauzl": "^3.2.0", + "yazl": "^2.5.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "requires": { - "ansi-regex": "^3.0.0" + "buffer-crc32": "~0.2.3" } } } }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "@rocket.chat/apps-engine": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.59.1.tgz", + "integrity": "sha512-49pkGsZzZItkGM7mqWLI92Hp8OD7bLyBMRjOW/IZ5AVZV5L7MA07YOqTXTQpSUI8Ic0u1a1zyv6woTVC8LFn0w==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "@msgpack/msgpack": "3.0.0-beta2", + "adm-zip": "^0.5.16", + "debug": "^4.3.7", + "esbuild": "~0.25.12", + "jose": "^4.15.9", + "jsonrpc-lite": "^2.2.0", + "lodash.clonedeep": "^4.5.0", + "semver": "^7.6.3", + "stack-trace": "0.0.10", + "uuid": "~11.0.5" }, "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" + "esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "requires": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } + }, + "semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" + }, + "uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==" } } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "requires": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - } - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, - "systeminformation": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.6.4.tgz", - "integrity": "sha512-b2tvW1R+qjNEoAGgh734EGLgqbDMghjsHRaWo36skAC6JM1tw1pitcGz/REt+qSIRSXbE4PKECojhaSrBRrEmw==" - }, - "tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "dev": true, - "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "@types/node": { + "version": "24.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz", + "integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" + "undici-types": "~7.16.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==" }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } + "color-convert": "^2.0.1" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tslint": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", - "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "tslint-consistent-codestyle": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz", - "integrity": "sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg==", - "dev": true, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "@fimbul/bifrost": "^0.17.0", - "tslib": "^1.7.1", - "tsutils": "^2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "tslint-xo": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/tslint-xo/-/tslint-xo-0.9.0.tgz", - "integrity": "sha512-Zk5jBdQVUaHEmR9TUoh1TJOjjCr7/nRplA+jDZBvucyBMx65pt0unTr6H/0HvrtSlucFvOMYsyBZE1W8b4AOig==", - "dev": true, - "requires": { - "tslint-consistent-codestyle": "^1.11.0", - "tslint-eslint-rules": "^5.3.1", - "tslint-microsoft-contrib": "^5.0.2" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true - }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - } - }, - "tslint-microsoft-contrib": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", - "dev": true, - "requires": { - "tsutils": "^2.27.2 <2.29.0" - }, - "dependencies": { - "tsutils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "peer": true - } - } + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "tsutils": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.1.tgz", - "integrity": "sha512-kiuZzD1uUA5DxGj/uxbde+ymp6VVdAxdzOIlAFbYKrPyla8/uiJ9JLBm1QsPhOm4Muj0/+cWEDP99yoCUcSl6Q==", - "dev": true, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "tslib": "^1.8.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "safe-buffer": "^5.0.1" + "color-name": "~1.1.4" } }, - "tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "requires": { - "is-typedarray": "^1.0.0" + "ms": "^2.1.3" } }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - }, - "uglify-js": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz", - "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==", - "dev": true, - "optional": true, + "esbuild": { + "version": "0.12.29", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", + "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } + "escape-string-regexp": "^1.0.5" } }, - "union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "qs": "^6.4.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { - "upper-case": "^1.1.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "punycode": "^2.1.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==" }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "graceful-fs": "^4.1.6" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "jsonrpc-lite": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jsonrpc-lite/-/jsonrpc-lite-2.2.0.tgz", + "integrity": "sha512-/cbbSxtZWs1O7R4tWqabrCM/t3N8qKUZMAg9IUqpPvUs6UyRvm6pCNYkskyKN/XU0UgffW+NY2ZRr8t0AknX7g==" }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { - "isexe": "^2.0.0" + "brace-expansion": "^1.1.7" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "string-width": "^2.1.1" + "wrappy": "1" } }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "wrap-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", - "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "simple-node-logger": { + "version": "18.12.24", + "resolved": "https://registry.npmjs.org/simple-node-logger/-/simple-node-logger-18.12.24.tgz", + "integrity": "sha512-4dTqpYecHsvPjWo+i+J3pLty8WJDNbxOVesNj5ch8pYH95LIGAFH4dxMSqyf+Os0RTchXifEtI/mfm3AVJftmg==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "lodash": "^4.17.12", + "moment": "^2.20.1" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "write-file-atomic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", - "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "has-flag": "^4.0.0" } }, - "write-json-file": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.1.1.tgz", - "integrity": "sha512-wHI383JJbaZeaxWAk57LeX8iq7od/nfDbp/Hkk31al5rmYvc0gtt4lkw+nt8KJW8u9Uy9GcoHeYE3v6BUl0ZUw==", - "dev": true, - "requires": { - "detect-indent": "^6.0.0", - "graceful-fs": "^4.1.15", - "is-plain-obj": "^2.0.0", - "make-dir": "^3.0.0", - "sort-keys": "^3.0.0", - "write-file-atomic": "^3.0.0" - } + "tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } - } + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yauzl": { "version": "3.2.0", @@ -11964,24 +1473,19 @@ } }, "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", "requires": { - "buffer-crc32": "~0.2.3" + "buffer-crc32": "^1.0.0" + }, + "dependencies": { + "buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" + } } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/package.json b/package.json index 0cffa8b..a99c8d2 100644 --- a/package.json +++ b/package.json @@ -1,124 +1,53 @@ { "name": "@rocket.chat/apps-cli", - "description": "The CLI tool for helping with Rocket.Chat Apps.", - "version": "1.13.0", + "description": "Modern CLI for packaging and deploying Rocket.Chat Apps.", + "version": "2.0.0", "author": "Rocket.Chat ", - "preferGlobal": true, - "bin": { - "rc-apps": "./bin/run" + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/RocketChat/Rocket.Chat.Apps-cli.git" }, "bugs": { "url": "https://github.com/RocketChat/Rocket.Chat.Apps-cli/issues" }, - "dependencies": { - "@hapi/hapi": "^20.0.0", - "@oclif/command": "^1.5.18", - "@oclif/config": "^1.13.2", - "@oclif/plugin-autocomplete": "^0.2.0", - "@oclif/plugin-help": "^2.2.0", - "@oclif/plugin-not-found": "^1.2.2", - "@rocket.chat/apps-compiler": "^0.5.1", - "@rocket.chat/apps-engine": "^1.50.0", - "axios": "^1.6.0", - "chalk": "^2.4.2", - "chokidar": "^3.3.1", - "cli-ux": "^5.3.1", - "conf": "^6.1.0", - "fetch-with-proxy": "^3.0.1", - "figures": "^3.0.0", - "form-data": "^2.5.0", - "fs-extra": "^8.1.0", - "fuzzy": "^0.1.3", - "glob": "^7.1.4", - "indent-string": "^4.0.0", - "inquirer": "^6.5.0", - "inquirer-checkbox-plus-prompt": "^1.0.1", - "open": "^6.4.0", - "pascal-case": "^2.0.1", - "pascalcase": "^0.1.1", - "querystring": "^0.2.0", - "semver": "^6.3.0", - "systeminformation": "^5.6.4", - "tslib": "^1.10.0", - "tv4": "^1.3.0", - "typescript": "^4.9.5", - "uuid": "^3.3.3", - "yazl": "^2.5.1" - }, - "devDependencies": { - "@oclif/dev-cli": "^1.22.2", - "@oclif/test": "^1.2.4", - "@oclif/tslint": "^3.1.1", - "@types/chai": "^4.1.7", - "@types/fs-extra": "^8.0.0", - "@types/glob": "^7.1.1", - "@types/hapi__hapi": "^20.0.2", - "@types/inquirer": "6.0.3", - "@types/mocha": "^5.2.7", - "@types/node": "^12.6.8", - "@types/node-fetch": "^2.5.0", - "@types/semver": "^6.0.1", - "@types/tv4": "^1.2.29", - "@types/uuid": "^3.4.5", - "@types/yazl": "^2.4.1", - "chai": "^4.2.0", - "globby": "^10.0.1", - "http-server": "^14.1.1", - "mocha": "^10.2.0", - "nyc": "^14.1.1", - "pre-commit": "^1.2.2", - "ts-node": "^8.10.2", - "tslint": "^5.18.0" - }, - "engines": { - "node": ">=8.0.0" + "homepage": "https://github.com/RocketChat/Rocket.Chat.Apps-cli", + "bin": { + "rc-apps": "./bin/rc-apps.js" }, + "main": "lib/index.js", + "types": "lib/index.d.ts", "files": [ - "/bin", - "/lib", - "/oclif.manifest.json" + "bin", + "lib", + "README.md", + "LICENSE" ], - "homepage": "https://github.com/RocketChat/Rocket.Chat.Apps-cli", - "keywords": [ - "oclif", - "rocket.chat", - "apps" - ], - "license": "MIT", - "main": "lib/index.js", - "oclif": { - "commands": "./lib/commands", - "bin": "rc-apps", - "plugins": [ - "@oclif/plugin-help", - "@oclif/plugin-not-found", - "@oclif/plugin-autocomplete" - ] + "engines": { + "node": ">=22.0.0" }, - "nyc": { - "reporter": [ - "text", - "json", - "html" - ] + "dependencies": { + "@rocket.chat/apps-compiler": "^0.5.1", + "@rocket.chat/apps-engine": "^1.59.0", + "chalk": "^4.1.2", + "yazl": "^3.3.1" }, - "repository": { - "type": "git", - "url": "git+https://github.com/RocketChat/Rocket.Chat.Apps-cli.git" + "devDependencies": { + "@types/node": "^24.3.1", + "typescript": "^5.9.2" }, "scripts": { - "postpack": "rm -f oclif.manifest.json", - "posttest": "tsc -p test --noEmit && tslint -p test -t stylish", - "prepack": "rm -rf lib && tsc && oclif-dev manifest && oclif-dev readme", - "prepare": "rm -rf lib && tsc", - "test": "nyc mocha -r ts-node/register --forbid-only \"test/**/*.test.ts\"", - "version": "oclif-dev readme && git add README.md", - "lint": "tslint --project tsconfig.json", - "view-coverage": "npm run test && http-server coverage -p 9083 -c-1" + "clean": "node scripts/clean.mjs", + "build": "npm run clean && tsc -p tsconfig.json", + "prepare": "npm run build", + "test:typecheck": "tsc -p test/tsconfig.json --noEmit", + "test:unit": "node --experimental-strip-types --test \"test/**/*.test.ts\"", + "test:coverage": "node --experimental-strip-types --test --experimental-test-coverage --test-coverage-include=\"lib/**/*.js\" --test-coverage-lines=100 \"test/**/*.test.ts\"", + "test": "npm run build && npm run test:typecheck && npm run test:coverage" }, - "types": "lib/index.d.ts", - "pre-commit": [ - "lint", - "test" + "keywords": [ + "rocket.chat", + "apps", + "cli" ] } diff --git a/scripts/clean.mjs b/scripts/clean.mjs new file mode 100644 index 0000000..e7652e5 --- /dev/null +++ b/scripts/clean.mjs @@ -0,0 +1,3 @@ +import { rmSync } from 'node:fs'; + +rmSync('lib', { recursive: true, force: true }); diff --git a/src/commands/create.ts b/src/commands/create.ts index 79525ac..42f136d 100644 --- a/src/commands/create.ts +++ b/src/commands/create.ts @@ -1,76 +1,161 @@ -import { Command, flags } from '@oclif/command'; -import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import pascalCase = require('pascal-case'); -import * as path from 'path'; -import * as semver from 'semver'; -import * as uuid from 'uuid'; +import { existsSync } from 'fs'; +import { mkdir, readFile, readdir, rm, stat, writeFile } from 'fs/promises'; +import path from 'path'; +import { parseArgs } from 'util'; +import { randomUUID } from 'crypto'; +import { execFile } from 'child_process'; +import { promisify } from 'util'; +import { CliError } from '../core/errors'; import { - AppCreator, - FolderDetails, - VariousUtils, -} from '../misc'; - -export default class Create extends Command { - public static description = 'simplified way of creating an app'; - - public static flags = { - help: flags.help({ char: 'h' }), - name: flags.string({char: 'n', description: 'Name of the app'}), - description: flags.string({char: 'd', description: 'Description of the app'}), - author: flags.string({char: 'a', description: 'Author\'s name'}), - homepage: flags.string({char: 'H', description: 'Author\'s or app\'s home page'}), - support: flags.string({char: 's', description: 'URL or email address to get support for the app'}), + appClassTemplate, + appPackageJsonTemplate, + appReadmeTemplate, + appTsConfigTemplate, +} from '../core/templates'; +import { Command, CommandContext } from '../core/types'; +import { writeJsonFile } from '../utils/files'; +import { prompt } from '../utils/prompt'; +import { slugify, toManifestSlug, toPascalCase } from '../utils/strings'; + +const execFileAsync = promisify(execFile); + +const ICON_1PX_BASE64 = + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9+U4cAAAAASUVORK5CYII='; + +export const createCommand: Command = { + name: 'create', + description: 'Create a new Rocket.Chat app project.', + usage: 'rc-apps create [name] [--description ] [--author ] [--support ] [--homepage ] [--skip-install]', + async run(argv: string[], context: CommandContext): Promise { + const parsed = parseArgs({ + args: argv, + allowPositionals: true, + options: { + name: { type: 'string', short: 'n' }, + description: { type: 'string', short: 'd' }, + author: { type: 'string', short: 'a' }, + support: { type: 'string', short: 's' }, + homepage: { type: 'string', short: 'H' }, + 'skip-install': { type: 'boolean', default: false }, + force: { type: 'boolean', short: 'f', default: false }, + }, + }); + + const appName = + parsed.values.name ?? + parsed.positionals[0] ?? + (await prompt('App name')); + + if (!appName.trim()) { + throw new CliError('App name is required.', 2); + } + + const description = parsed.values.description ?? (await prompt('Description', 'Rocket.Chat App')); + const author = parsed.values.author ?? (await prompt('Author name', 'Your Name')); + const support = parsed.values.support ?? (await prompt('Support URL or email', 'support@example.com')); + const homepage = parsed.values.homepage ?? (await prompt('Homepage URL', 'https://example.com')); + + const folderSlug = slugify(appName); + const nameSlug = toManifestSlug(appName); + + if (!folderSlug) { + throw new CliError('App name must include at least one letter or number.', 2); + } + + if (!nameSlug) { + throw new CliError('App name must include at least one letter for app.json nameSlug.', 2); + } + + const classBaseName = toPascalCase(appName); + const className = classBaseName.endsWith('App') ? classBaseName : `${classBaseName}App`; + const folderPath = path.resolve(context.cwd, folderSlug); + + await prepareTargetDirectory(folderPath, parsed.values.force); + + const requiredApiVersion = await detectAppsEngineVersion(context.cwd); + + const manifest = { + id: randomUUID(), + name: appName, + nameSlug, + version: '0.0.1', + requiredApiVersion, + description, + author: { + name: author, + support, + homepage, + }, + classFile: `${className}.ts`, + iconFile: 'icon.png', }; - public async run() { - if (!semver.satisfies(process.version, '>=4.2.0')) { - this.error('NodeJS version needs to be at least 4.2.0 or higher.'); - return; - } - - const info: IAppInfo = { - id: uuid.v4(), - version: '0.0.1', - requiredApiVersion: VariousUtils.getTsDefVersion(), - iconFile: 'icon.png', - author: {}, - } as IAppInfo; - - this.log('Let\'s get started creating your app.'); - this.log('We need some information first:'); - this.log(''); - - const { flags } = this.parse(Create); - info.name = flags.name ? flags.name : await cli.prompt(chalk.bold(' App Name')); - info.nameSlug = VariousUtils.slugify(info.name); - info.classFile = `${ pascalCase(info.name) }App.ts`; - - info.description = flags.description ? flags.description : await cli.prompt(chalk.bold(' App Description')); - info.author.name = flags.author ? flags.author : await cli.prompt(chalk.bold(' Author\'s Name')); - info.author.homepage = flags.homepage ? flags.homepage : await cli.prompt(chalk.bold(' Author\'s Home Page')); - info.author.support = flags.support ? flags.support : await cli.prompt(chalk.bold(' Author\'s Support Page')); - - const folder = path.join(process.cwd(), info.nameSlug); - - cli.action.start(`Creating a Rocket.Chat App in ${ chalk.green(folder) }`); - - const fd = new FolderDetails(this); - fd.setAppInfo(info); - fd.setFolder(folder); - - const creator = new AppCreator(fd, this); - await creator.writeFiles(); - - try { - await fd.readInfoFile(); - } catch (e) { - this.error(e && e.message ? e.message : e); - return; - } - - cli.action.stop(chalk.cyan('done!')); + await writeJsonFile(path.join(folderPath, 'app.json'), manifest); + await writeFile(path.join(folderPath, 'README.md'), appReadmeTemplate(manifest), 'utf8'); + await writeFile(path.join(folderPath, `${className}.ts`), appClassTemplate(className), 'utf8'); + await writeFile(path.join(folderPath, 'tsconfig.json'), appTsConfigTemplate(), 'utf8'); + await writeFile(path.join(folderPath, '.gitignore'), 'dist\nnode_modules\n', 'utf8'); + await writeFile( + path.join(folderPath, '.rcappsconfig'), + `${JSON.stringify({ ignoredFiles: ['**/dist/**', '**/node_modules/**', '**/.git/**'] }, null, 2)}\n`, + 'utf8', + ); + await writeFile(path.join(folderPath, 'package.json'), appPackageJsonTemplate(folderSlug, requiredApiVersion), 'utf8'); + await writeFile(path.join(folderPath, 'icon.png'), Buffer.from(ICON_1PX_BASE64, 'base64')); + + if (!parsed.values['skip-install']) { + console.log('Installing dependencies...'); + await runNpmInstall(folderPath); } + + console.log(`App created: ${folderPath}`); + }, +}; + +async function runNpmInstall(directory: string): Promise { + try { + const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + await execFileAsync(npmCommand, ['install'], { cwd: directory }); + } catch { + throw new CliError('Failed to run npm install for the generated app. Re-run npm install manually.', 1); + } +} + +async function detectAppsEngineVersion(cwd: string): Promise { + try { + const packageJsonPath = path.join(cwd, 'package.json'); + const packageJsonRaw = await readFile(packageJsonPath, 'utf8'); + const pkg = JSON.parse(packageJsonRaw) as { + dependencies?: Record; + devDependencies?: Record; + }; + + return pkg.dependencies?.['@rocket.chat/apps-engine'] ?? pkg.devDependencies?.['@rocket.chat/apps-engine'] ?? '^1.59.0'; + } catch { + return '^1.59.0'; + } +} + +async function prepareTargetDirectory(folderPath: string, force: boolean): Promise { + if (!existsSync(folderPath)) { + await mkdir(folderPath, { recursive: true }); + return; + } + + const targetInfo = await stat(folderPath); + + if (!targetInfo.isDirectory()) { + throw new CliError(`Path exists and is not a directory: ${folderPath}`, 2); + } + + if (!force) { + throw new CliError(`Directory already exists: ${folderPath}. Use --force to overwrite.`, 2); + } + + const entries = await readdir(folderPath, { encoding: 'utf8' }); + + for (const entryName of entries) { + await rm(path.join(folderPath, entryName), { recursive: true, force: true }); + } } diff --git a/src/commands/deploy.ts b/src/commands/deploy.ts index 1c24334..31cbf68 100644 --- a/src/commands/deploy.ts +++ b/src/commands/deploy.ts @@ -1,122 +1,109 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import * as semver from 'semver'; - -import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition'; -import { AppCompiler, AppPackager, FolderDetails, unicodeSymbols } from '../misc'; -import { getServerInfo, uploadApp } from '../misc/deployHelpers'; - -export default class Deploy extends Command { - public static description = 'allows deploying an App to a server'; - - public static flags = { - 'help': flags.help({ char: 'h' }), - 'url': flags.string({ - description: 'where the app should be deployed to', - }), - 'username': flags.string({ - char: 'u', - description: 'username to authenticate with', - }), - 'password': flags.string({ - char: 'p', - description: 'password for the user', - }), - 'token': flags.string({ - char: 't', - description: 'API token to use with UserID (instead of username & password)', - }), - 'verbose': flags.boolean({ - char: 'v', - description: 'show additional details about the results of running the command', - }), - 'userId': flags.string({ - char: 'i', - description: 'UserID to use with API token (instead of username & password)', - }), - // flag with no value (-f, --force) - 'experimental-native-compiler': flags.boolean({ - description: '(experimental) use native TSC compiler', - }), - 'force': flags.boolean({ - char: 'f', - description: 'forcefully deploy the App, ignores lint & TypeScript errors', - }), - 'update': flags.boolean({ description: 'updates the app, instead of creating' }), - 'code': flags.string({ char: 'c', dependsOn: ['username'], description: '2FA code of the user' }), - 'i2fa': flags.boolean({ description: 'interactively ask for 2FA code' }), +import { parseArgs } from 'util'; +import path from 'path'; + +import { buildAndPackage } from '../core/compiler'; +import { getServerInfo, uploadApp, validateDeployCredentials } from '../core/deploy'; +import { loadDeployConfigFromEnv } from '../core/env'; +import { loadConfigFile, loadProject, mergeDeployConfig } from '../core/project'; +import { Command, CommandContext, DeployConfig } from '../core/types'; +import { step, success, verbose, warn } from '../utils/output'; + +export const deployCommand: Command = { + name: 'deploy', + description: 'Compile, package, and deploy an app to Rocket.Chat.', + usage: + 'rc-apps deploy [--project ] --url [--allow-http] [--legacy-compiler] [--username --password

| --userId --token ]', + async run(argv: string[], context: CommandContext): Promise { + const parsed = parseArgs({ + args: argv, + allowPositionals: false, + options: { + project: { type: 'string' }, + url: { type: 'string' }, + username: { type: 'string', short: 'u' }, + password: { type: 'string', short: 'p' }, + token: { type: 'string', short: 't' }, + userId: { type: 'string', short: 'i' }, + code: { type: 'string', short: 'c' }, + 'allow-http': { type: 'boolean', default: false }, + 'legacy-compiler': { type: 'boolean', default: false }, + update: { type: 'boolean', default: false }, + force: { type: 'boolean', short: 'f', default: false }, + verbose: { type: 'boolean', short: 'v', default: false }, + 'experimental-native-compiler': { type: 'boolean', default: false }, + }, + }); + + const projectPath = parsed.values.project ? path.resolve(parsed.values.project) : context.cwd; + const project = await loadProject(projectPath); + const configLoadResult = await loadConfigFile(project.rootPath); + const configFromFile = configLoadResult.config; + const configFromEnv = loadDeployConfigFromEnv(); + const allowHttpProvided = hasBooleanOption(argv, 'allow-http'); + const updateProvided = hasBooleanOption(argv, 'update'); + + const cliConfig: DeployConfig = { + url: parsed.values.url, + username: parsed.values.username, + password: parsed.values.password, + token: parsed.values.token, + userId: parsed.values.userId, + code: parsed.values.code, + allowHttp: allowHttpProvided ? parsed.values['allow-http'] : undefined, + update: updateProvided ? parsed.values.update : undefined, }; - public async run() { - const { flags } = this.parse(Deploy); - - const fd = new FolderDetails(this); - - try { - await fd.readInfoFile(); - await fd.matchAppsEngineVersion(); - } catch (e) { - this.error(e && e.message ? e.message : e, {exit: 2}); - } - - if (flags.i2fa) { - flags.code = await cli.prompt('2FA code', { type: 'hide' }); - } - - cli.log(chalk.bold.greenBright(' Starting App Deployment to Server\n')); + const deployConfig = mergeDeployConfig(mergeDeployConfig(configFromFile, configFromEnv), cliConfig); + const verboseMode = parsed.values.verbose; + const useLegacyCompiler = parsed.values['legacy-compiler']; + const compilerMode = useLegacyCompiler ? 'legacy' : 'native-default'; - try { - cli.action.start(chalk.bold.greenBright(' Getting Server Info')); - const serverInfo = await getServerInfo(fd, flags); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); - - cli.action.start(chalk.bold.greenBright(' Packaging the app')); - const compiler = new AppCompiler(fd, flags['experimental-native-compiler']); - const compilationResult = await compiler.compile(); - - if (flags.verbose) { - this.log(`${chalk.green('[info]')} using TypeScript v${ compilationResult.typeScriptVersion }`); - } - - if (compilationResult.diagnostics.length && !flags.force) { - this.reportDiagnostics(compilationResult.diagnostics); - this.error('TypeScript compiler error(s) occurred'); - this.exit(1); - return; - } - - const bundlingResult = await compiler.bundle(); + if (parsed.values['experimental-native-compiler']) { + warn('`--experimental-native-compiler` is deprecated in v2 and now a no-op (native is default).'); + } - if (bundlingResult.diagnostics.length && !flags.force) { - this.reportDiagnostics(bundlingResult.diagnostics); - this.error('Bundler error(s) occurred'); - this.exit(1); - return; - } + if (configLoadResult.legacyFields.length > 0) { + warn( + `Ignoring legacy .rcappsconfig field(s): ${configLoadResult.legacyFields.join( + ', ', + )}. Use CLI flags or RC_APPS_* environment variables.`, + ); + } - let zipName: string; + validateDeployCredentials(deployConfig); - if (semver.satisfies(semver.coerce(serverInfo.serverVersion), '>=3.8')) { - zipName = await compiler.outputZip(); - } else { - const packager = new AppPackager(this, fd); - zipName = await packager.zipItUp(); - } + verbose(verboseMode, `Project: ${project.rootPath}`); + verbose(verboseMode, `Compiler mode: ${compilerMode}`); + verbose(verboseMode, `URL security: ${deployConfig.allowHttp ? 'allow-http override enabled' : 'https enforced'}`); + verbose( + verboseMode, + deployConfig.token && deployConfig.userId ? 'Auth mode: token/userId' : 'Auth mode: username/password', + ); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); + step('Checking server...'); + const serverInfo = await getServerInfo(deployConfig); - cli.action.start(chalk.bold.greenBright(' Uploading App')); - await uploadApp(serverInfo, fd, zipName); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); - } catch (e) { - cli.action.stop(chalk.red(unicodeSymbols.get('heavyMultiplicationX'))); - this.error(chalk.bold.redBright( - ` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`)); - } + if (serverInfo.version) { + success(`Server version: ${serverInfo.version}`); } - private reportDiagnostics(diag: Array): void { - diag.forEach((d) => this.error(d.message)); - } + step('Packaging app...'); + const zipRelativePath = await buildAndPackage(project, { + force: parsed.values.force, + verbose: verboseMode, + useNativeCompiler: !useLegacyCompiler, + }); + + const zipAbsolutePath = path.resolve(project.rootPath, zipRelativePath); + verbose(verboseMode, `Package path: ${zipAbsolutePath}`); + + step('Uploading app...'); + const result = await uploadApp(deployConfig, project, zipAbsolutePath); + success(`Deployment finished (${result.mode}).`); + }, +}; + +function hasBooleanOption(args: string[], option: string): boolean { + const optionPrefix = `--${option}`; + return args.some((arg) => arg === optionPrefix || arg.startsWith(`${optionPrefix}=`)); } diff --git a/src/commands/env.ts b/src/commands/env.ts new file mode 100644 index 0000000..5911c7f --- /dev/null +++ b/src/commands/env.ts @@ -0,0 +1,22 @@ +import { Command, CommandContext } from '../core/types'; +import { heading, info } from '../utils/output'; + +export const envCommand: Command = { + name: 'env', + aliases: ['config-env'], + description: 'Show supported deploy/watch environment variables.', + usage: 'rc-apps env', + async run(_argv: string[], _context: CommandContext): Promise { + heading('Environment Variables'); + info(' RC_APPS_URL Rocket.Chat base URL (for example: https://chat.example.com)'); + info(' RC_APPS_USERNAME Login username'); + info(' RC_APPS_PASSWORD Login password'); + info(' RC_APPS_TOKEN Personal access token'); + info(' RC_APPS_USER_ID User ID for personal access token'); + info(' RC_APPS_2FA_CODE Optional 2FA code for username/password login'); + info(' RC_APPS_ALLOW_HTTP true/1/yes/on to allow insecure http on non-localhost'); + info(''); + info('Precedence: CLI flags > environment variables > .rcappsconfig'); + info('Tip: run `rc-apps help deploy` for auth and URL examples.'); + }, +}; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 3173317..56145bb 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,109 +1,249 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import * as fuzzy from 'fuzzy'; -import * as inquirer from 'inquirer'; - -import { FolderDetails } from '../misc'; -import { apiEndpointTemplate, appendNewSetting, - initialSettingTemplate, slashCommandTemplate } from '../templates/boilerplate'; - -export default class Generate extends Command { - public static description = 'Adds boilerplate code for various functions'; - public static flags = { - help: flags.help({char: 'h'}), - options: flags.string({ - char: 'o', - // tslint:disable-next-line:max-line-length - description: 'Choose the boilerplate needed a. Api Extension b. Slash Command Extension c. Settings Extension', - options: ['a', 'b', 'c'], - }), - }; - public async run() { - const { flags } = this.parse(Generate); - const fd = new FolderDetails(this); - try { - await fd.readInfoFile(); - } catch (e) { - this.error(chalk.bold.red(e && e.message ? e.message : e)); - } - let option = flags.options; - const categories = [ - 'Api Extension', - 'Slash Command Extension', - 'Settings Extension', - ]; - if (!option) { - inquirer.registerPrompt('checkbox-plus', require('inquirer-checkbox-plus-prompt')); - const result = await inquirer.prompt([{ - type: 'checkbox-plus', - name: 'categories', - message: 'Choose the boilerplate needed', - pageSize: 10, - highlight: true, - searchable: true, - validate: (answer: Array) => { - if (answer.length === 0) { - return chalk.bold.redBright('You must choose at least one option.'); - } - - return true; - }, - // tslint:disable:promise-function-async - source: (answersSoFar: object, input: string) => { - input = input || ''; - - return new Promise((resolve) => { - const fuzzyResult = fuzzy.filter(input, categories); - - const data = fuzzyResult.map((element) => { - return element.original; - }); - - resolve(data); - }); - }, - }] as any); - option = (result as any).categories[0]; - } - switch (option) { - case 'Api Extension': - this.ApiExtensionBoilerplate(fd); - break; - case 'Slash Command Extension': - this.SlashCommandExtension(fd); - break; - case 'Settings Extension': - this.SettingExtension(fd); - break; - default: - break; - } +import { readFile, writeFile } from 'fs/promises'; +import path from 'path'; +import { parseArgs } from 'util'; +import { CliError } from '../core/errors'; +import { + appendSettingTemplate, + endpointTemplate, + initialSettingsTemplate, + slashCommandTemplate, +} from '../core/templates'; +import { loadProject, ProjectContext } from '../core/project'; +import { Command, CommandContext } from '../core/types'; +import { ensureDirectory } from '../utils/files'; +import { prompt } from '../utils/prompt'; +import { toPascalCase } from '../utils/strings'; + +const ACCESSOR_IMPORT = `import { IConfigurationExtend, IEnvironmentRead } from '@rocket.chat/apps-engine/definition/accessors';`; +const API_IMPORT = `import { ApiSecurity, ApiVisibility } from '@rocket.chat/apps-engine/definition/api';`; +const API_ENDPOINTS_MARKER = '// rc-apps:api-endpoints'; +const SLASH_COMMANDS_MARKER = '// rc-apps:slash-commands'; +const SETTINGS_MARKER = '// rc-apps:settings'; +const MISSING_MARKERS_ERROR = + 'Unable to auto-register generated files because rc-apps markers were not found in the app class.'; + +export const generateCommand: Command = { + name: 'generate', + aliases: ['g'], + description: 'Generate boilerplate for app extensions.', + usage: 'rc-apps generate [name] [--path ] [--project ]', + async run(argv: string[], context: CommandContext): Promise { + const parsed = parseArgs({ + args: argv, + allowPositionals: true, + options: { + path: { type: 'string' }, + project: { type: 'string' }, + }, + }); + + const target = parsed.positionals[0]; + + if (!target) { + throw new CliError('Select what to generate: endpoint, slash-command, or setting.', 2); + } + + const projectPath = parsed.values.project ? path.resolve(parsed.values.project) : context.cwd; + const project = await loadProject(projectPath); + + if (target === 'endpoint') { + const rawName = parsed.positionals[1] ?? (await prompt('Endpoint class name')); + const endpointPath = parsed.values.path ?? (await prompt('Endpoint path', '/example')); + const className = toPascalCase(rawName); + + const directory = path.join(project.rootPath, 'endpoints'); + await ensureDirectory(directory); + const endpointFilePath = path.join(directory, `${className}.ts`); + await writeFile(endpointFilePath, endpointTemplate(className, endpointPath), 'utf8'); + await attemptAutoRegistration('endpoint', async () => { + await updateAppClassWithEndpoint(project, className, endpointFilePath); + }); + console.log(`Generated endpoint: ${endpointFilePath}`); + return; } - private ApiExtensionBoilerplate = async (fd: FolderDetails): Promise => { - const name = await cli.prompt(chalk.bold.greenBright('Name of endpoint class')); - const path = await cli.prompt(chalk.bold.greenBright('Path for endpoint')); - const toWrite = apiEndpointTemplate(name, path); - fd.generateEndpointClass(name, toWrite); + if (target === 'slash-command') { + const rawName = parsed.positionals[1] ?? (await prompt('Slash command class name')); + const className = toPascalCase(rawName); + const directory = path.join(project.rootPath, 'slashCommands'); + await ensureDirectory(directory); + const slashCommandFilePath = path.join(directory, `${className}.ts`); + await writeFile(slashCommandFilePath, slashCommandTemplate(className), 'utf8'); + await attemptAutoRegistration('slash command', async () => { + await updateAppClassWithSlashCommand(project, className, slashCommandFilePath); + }); + console.log(`Generated slash command: ${slashCommandFilePath}`); + return; } - private SlashCommandExtension = async (fd: FolderDetails): Promise => { - const name = await cli.prompt(chalk.bold.greenBright('Name of command class')); - const toWrite = slashCommandTemplate(name); - fd.generateCommandClass(name, toWrite); + if (target === 'setting') { + const settingId = parsed.positionals[1] ?? (await prompt('Setting id', 'my_setting')); + const settingsPath = path.join(project.rootPath, 'settings.ts'); + + let existing = ''; + try { + existing = await readFile(settingsPath, 'utf8'); + } catch { + existing = initialSettingsTemplate(); + } + + const updated = appendSettingTemplate(existing, settingId); + await writeFile(settingsPath, updated, 'utf8'); + await attemptAutoRegistration('settings', async () => { + await updateAppClassWithSettings(project, settingsPath); + }); + console.log(`Updated settings: ${settingsPath}`); + return; } - private SettingExtension = async (fd: FolderDetails): Promise => { - let data = ''; - if (await fd.doesFileExist('settings.ts')) { - data = fd.readSettingsFile(); - } - if (data === '') { - data = initialSettingTemplate(); - } - data = appendNewSetting(data); - fd.writeToSettingsFile(data); + throw new CliError(`Unknown generate target: ${target}`, 2); + }, +}; + +async function updateAppClassWithEndpoint( + project: ProjectContext, + className: string, + endpointFilePath: string, +): Promise { + const appClassPath = path.resolve(project.rootPath, project.manifest.classFile); + const moduleImportPath = toModuleImportPath(path.relative(path.dirname(appClassPath), endpointFilePath)); + + await updateAppClass(project, [ + ACCESSOR_IMPORT, + API_IMPORT, + `import { ${className} } from '${moduleImportPath}';`, + ], [ + { marker: API_ENDPOINTS_MARKER, entry: `new ${className}(),` }, + ]); +} + +async function updateAppClassWithSlashCommand( + project: ProjectContext, + className: string, + slashCommandFilePath: string, +): Promise { + const appClassPath = path.resolve(project.rootPath, project.manifest.classFile); + const moduleImportPath = toModuleImportPath(path.relative(path.dirname(appClassPath), slashCommandFilePath)); + + await updateAppClass(project, [ + ACCESSOR_IMPORT, + API_IMPORT, + `import { ${className} } from '${moduleImportPath}';`, + ], [ + { marker: SLASH_COMMANDS_MARKER, entry: `new ${className}(),` }, + ]); +} + +async function updateAppClassWithSettings(project: ProjectContext, settingsPath: string): Promise { + const appClassPath = path.resolve(project.rootPath, project.manifest.classFile); + const moduleImportPath = toModuleImportPath(path.relative(path.dirname(appClassPath), settingsPath)); + + await updateAppClass(project, [ + ACCESSOR_IMPORT, + API_IMPORT, + `import { settings } from '${moduleImportPath}';`, + ], [ + { marker: SETTINGS_MARKER, entry: '...settings,' }, + ]); +} + +interface MarkerEntry { + marker: string; + entry: string; +} + +async function attemptAutoRegistration(target: string, register: () => Promise): Promise { + try { + await register(); + } catch (error) { + if (error instanceof CliError && error.message === MISSING_MARKERS_ERROR) { + console.warn( + [ + `Auto-registration skipped for generated ${target}.`, + 'The app class does not contain rc-apps markers.', + `Add ${API_ENDPOINTS_MARKER}, ${SLASH_COMMANDS_MARKER}, and ${SETTINGS_MARKER} in your extendConfiguration method to enable automatic wiring.`, + ].join('\n'), + ); + return; } + + throw error; + } +} + +async function updateAppClass(project: ProjectContext, imports: string[], markerEntries: MarkerEntry[]): Promise { + const appClassPath = path.resolve(project.rootPath, project.manifest.classFile); + let source = await readFile(appClassPath, 'utf8'); + + for (const importLine of imports) { + source = addImportIfMissing(source, importLine); + } + + ensureRegistrationMarkers(source); + + for (const markerEntry of markerEntries) { + source = addMarkerEntry(source, markerEntry.marker, markerEntry.entry); + } + + await writeFile(appClassPath, source, 'utf8'); +} + +function ensureRegistrationMarkers(source: string): void { + if (source.includes(API_ENDPOINTS_MARKER) && source.includes(SLASH_COMMANDS_MARKER) && source.includes(SETTINGS_MARKER)) { + return; + } + + throw new CliError(MISSING_MARKERS_ERROR, 2); +} + +function addImportIfMissing(source: string, importLine: string): string { + if (importLine === ACCESSOR_IMPORT) { + if ( + source.includes("from '@rocket.chat/apps-engine/definition/accessors';") && + source.includes('IConfigurationExtend') && + source.includes('IEnvironmentRead') + ) { + return source; + } + } else if (importLine === API_IMPORT) { + if ( + source.includes("from '@rocket.chat/apps-engine/definition/api';") && + source.includes('ApiSecurity') && + source.includes('ApiVisibility') + ) { + return source; + } + } else if (source.includes(importLine)) { + return source; + } + + const classIndex = source.indexOf('export class '); + + if (classIndex === -1) { + throw new CliError('Unable to locate app class declaration for generated registration.', 2); + } + + return `${source.slice(0, classIndex)}${importLine}\n${source.slice(classIndex)}`; +} + +function addMarkerEntry(source: string, marker: string, entry: string): string { + const entryLine = ` ${entry}`; + + if (source.includes(entryLine)) { + return source; + } + + const markerLine = ` ${marker}`; + + if (!source.includes(markerLine)) { + throw new CliError(`Unable to locate generated marker ${marker} in app class.`, 2); + } + + return source.replace(markerLine, `${entryLine}\n${markerLine}`); +} + +function toModuleImportPath(relativePath: string): string { + const normalized = relativePath.replace(/\\/g, '/').replace(/\.ts$/, ''); + return normalized.startsWith('.') ? normalized : `./${normalized}`; } diff --git a/src/commands/help.ts b/src/commands/help.ts new file mode 100644 index 0000000..03c21ea --- /dev/null +++ b/src/commands/help.ts @@ -0,0 +1,40 @@ +export interface HelpCommand { + name: string; + aliases?: string[]; + description: string; + usage: string; + details?: string[]; +} + +export function renderHelp(commands: HelpCommand[]): string { + const lines: string[] = []; + + lines.push('Rocket.Chat Apps CLI (v2)'); + lines.push(''); + lines.push('Usage:'); + lines.push(' rc-apps [options]'); + lines.push(''); + lines.push('Commands:'); + + const sorted = [...commands].sort((a, b) => a.name.localeCompare(b.name)); + + for (const command of sorted) { + const aliasText = command.aliases && command.aliases.length > 0 ? ` (aliases: ${command.aliases.join(', ')})` : ''; + lines.push(` ${command.name.padEnd(14)} ${command.description}${aliasText}`); + } + + lines.push(''); + lines.push('Use "rc-apps help " for detailed usage.'); + + return lines.join('\n'); +} + +export function renderCommandHelp(command: HelpCommand): string { + const lines = [`${command.name}`, '', command.description, '', 'Usage:', ` ${command.usage}`]; + + if (command.details && command.details.length > 0) { + lines.push('', ...command.details); + } + + return lines.join('\n'); +} diff --git a/src/commands/login.ts b/src/commands/login.ts deleted file mode 100644 index bdfe035..0000000 --- a/src/commands/login.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import * as inquirer from 'inquirer'; - -import { CloudAuth } from '../misc/cloudAuth'; - -export default class Login extends Command { - public static description = 'steps through the process to log in with Rocket.Chat Cloud'; - - public static flags = { - help: flags.help({ char: 'h' }), - }; - - public async run() { - inquirer.registerPrompt('checkbox-plus', require('inquirer-checkbox-plus-prompt')); - - const cloudAuth = new CloudAuth(); - const hasToken = await cloudAuth.hasToken(); - if (hasToken) { - cli.action.start(chalk.green('verifying') + ' your token...'); - try { - await cloudAuth.getToken(); - cli.action.stop(chalk.green('success, you are already logged in!')); - } catch (e) { - cli.action.stop(chalk.red('failure.')); - } - } else { - try { - cli.action.start(chalk.green('waiting') + ' for authorization...'); - await cloudAuth.executeAuthFlow(); - cli.action.stop(chalk.green('success!')); - } catch (e) { - cli.action.stop(chalk.red('failed to authenticate.')); - return; - } - } - } -} diff --git a/src/commands/logout.ts b/src/commands/logout.ts deleted file mode 100644 index 057f822..0000000 --- a/src/commands/logout.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import * as inquirer from 'inquirer'; - -import { CloudAuth } from '../misc/cloudAuth'; - -export default class Logout extends Command { - public static description = 'revokes the Rocket.Chat Cloud credentials'; - - public static flags = { - help: flags.help({ char: 'h' }), - }; - - public async run() { - inquirer.registerPrompt('checkbox-plus', require('inquirer-checkbox-plus-prompt')); - - const cloudAuth = new CloudAuth(); - const hasToken = await cloudAuth.hasToken(); - if (hasToken) { - cli.action.start(chalk.red('revoking') + ' your credentials...'); - try { - await cloudAuth.revokeToken(); - cli.action.stop(chalk.green('success!')); - } catch (e) { - cli.action.stop(chalk.red('failure?')); - } - } else { - cli.log(chalk.red('no Rocket.Chat Cloud credentials to revoke')); - } - } -} diff --git a/src/commands/package.ts b/src/commands/package.ts index 5bbf098..c89312f 100644 --- a/src/commands/package.ts +++ b/src/commands/package.ts @@ -1,88 +1,76 @@ -import { Command, flags } from '@oclif/command'; -import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition'; -import chalk from 'chalk'; -import cli from 'cli-ux'; - -import { AppCompiler, AppPackager, FolderDetails } from '../misc'; - -export default class Package extends Command { - public static description = 'packages up your App in a distributable format'; - public static aliases = ['p', 'pack']; - - public static flags = { - 'help': flags.help({ char: 'h' }), - 'no-compile': flags.boolean({ - description: "don't compile the source, package as is (for older Rocket.Chat versions)", - }), - 'experimental-native-compiler': flags.boolean({ - description: '(experimental) use native TSC compiler', - }), - 'force': flags.boolean({ - char: 'f', - description: 'forcefully package the App, ignores lint & TypeScript errors', - }), - 'verbose': flags.boolean({ - char: 'v', - description: 'show additional details about the results of running the command', - }), - }; - - public async run(): Promise { - - cli.action.start('packaging your app'); - - const fd = new FolderDetails(this); - - try { - await fd.readInfoFile(); - await fd.matchAppsEngineVersion(); - } catch (e) { - this.error(e && e.message ? e.message : e); - return; - } - - const { flags } = this.parse(Package); - - const compiler = new AppCompiler(fd, flags['experimental-native-compiler']); - - const compilationResult = await compiler.compile(); - - if (flags.verbose) { - this.log(`${chalk.green('[info]')} using TypeScript v${ compilationResult.typeScriptVersion }`); - } - - if (compilationResult.diagnostics.length && !flags.force) { - this.reportDiagnostics(compilationResult.diagnostics); - this.error('TypeScript compiler error(s) occurred'); - this.exit(1); - return; - } - - const bundlingResult = await compiler.bundle(); +import { parseArgs } from 'util'; +import path from 'path'; + +import { buildAndPackage } from '../core/compiler'; +import { CliError } from '../core/errors'; +import { loadProject } from '../core/project'; +import { packageSource } from '../core/source-packager'; +import { Command, CommandContext } from '../core/types'; +import { step, success, verbose, warn } from '../utils/output'; + +export const packageCommand: Command = { + name: 'package', + aliases: ['p', 'pack'], + description: 'Package an app into a deployable zip file.', + usage: + 'rc-apps package [--project ] [--force] [--verbose] [--no-compile] [--legacy-compiler]', + async run(argv: string[], context: CommandContext): Promise { + const parsed = parseArgs({ + args: argv, + allowPositionals: false, + options: { + project: { type: 'string' }, + force: { type: 'boolean', short: 'f', default: false }, + verbose: { type: 'boolean', short: 'v', default: false }, + 'no-compile': { type: 'boolean', default: false }, + 'legacy-compiler': { type: 'boolean', default: false }, + 'experimental-native-compiler': { type: 'boolean', default: false }, + }, + }); + + const projectPath = parsed.values.project ? path.resolve(parsed.values.project) : context.cwd; + const project = await loadProject(projectPath); + const verboseMode = parsed.values.verbose; + const useLegacyCompiler = parsed.values['legacy-compiler']; + const useDeprecatedNativeFlag = parsed.values['experimental-native-compiler']; + + if (useDeprecatedNativeFlag) { + warn('`--experimental-native-compiler` is deprecated in v2 and now a no-op (native is default).'); + } - if (bundlingResult.diagnostics.length && !flags.force) { - this.reportDiagnostics(bundlingResult.diagnostics); - this.error('Bundler error(s) occurred'); - this.exit(1); - return; - } + if (parsed.values['no-compile'] && useLegacyCompiler) { + warn('Ignoring --legacy-compiler because --no-compile was provided.'); + } - let zipName: string; + step('Packaging app...'); + verbose(verboseMode, `Project: ${project.rootPath}`); + verbose( + verboseMode, + parsed.values['no-compile'] ? 'Packaging mode: source zip (--no-compile)' : 'Packaging mode: compiled bundle', + ); + if (!parsed.values['no-compile']) { + verbose(verboseMode, `Compiler mode: ${useLegacyCompiler ? 'legacy' : 'native-default'}`); + } - if (flags['no-compile']) { - const packager = new AppPackager(this, fd); - zipName = await packager.zipItUp(); - } else { - zipName = await compiler.outputZip(); - } + const zipRelativePath = parsed.values['no-compile'] + ? await packageSource(project) + : await buildAndPackage(project, { + force: parsed.values.force, + verbose: verboseMode, + useNativeCompiler: !useLegacyCompiler, + }); - cli.action.stop('finished!'); + const zipAbsolutePath = path.resolve(project.rootPath, zipRelativePath); - this.log(chalk.black(' ')); - this.log(chalk.green('App packaged up at:'), fd.mergeWithFolder(zipName)); + if (!isPathWithinRoot(project.rootPath, zipAbsolutePath)) { + throw new CliError('Unexpected zip output path.', 1); } - private reportDiagnostics(diag: Array): void { - diag.forEach((d) => this.error(d.message)); - } + success(`Package created: ${zipAbsolutePath}`); + }, +}; + +function isPathWithinRoot(rootPath: string, candidatePath: string): boolean { + const relative = path.relative(rootPath, candidatePath); + return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative)); } diff --git a/src/commands/submit.ts b/src/commands/submit.ts deleted file mode 100644 index ee432ee..0000000 --- a/src/commands/submit.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import fetch from 'fetch-with-proxy'; -import * as FormData from 'form-data'; -import * as fs from 'fs'; -import * as fuzzy from 'fuzzy'; -import * as inquirer from 'inquirer'; -import { Response } from 'node-fetch'; - -import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition'; -import { AppCompiler, AppPackager, FolderDetails, VariousUtils } from '../misc'; -import { CloudAuth } from '../misc/cloudAuth'; - -export default class Submit extends Command { - public static description = 'submits an App to the Marketplace for review'; - - public static flags = { - help: flags.help({ char: 'h' }), - update: flags.boolean({ description: 'submits an update instead of creating one' }), - categories: flags.string({ - char: 'c', - description: 'a comma separated list of the categories for the App', - }), - }; - - public async run() { - inquirer.registerPrompt('checkbox-plus', require('inquirer-checkbox-plus-prompt')); - - const { flags } = this.parse(Submit); - - //#region app packaging - cli.action.start(`${chalk.green('packaging')} your app`); - - const fd = new FolderDetails(this); - - try { - await fd.readInfoFile(); - await fd.matchAppsEngineVersion(); - } catch (e) { - this.error(e && e.message ? e.message : e); - } - - const compiler = new AppCompiler(fd); - const compilationResult = await compiler.compile(); - - if (compilationResult.diagnostics.length) { - this.reportDiagnostics(compilationResult.diagnostics); - this.error('TypeScript compiler error(s) occurred'); - this.exit(1); - return; - } - - const bundlingResult = await compiler.bundle(); - - if (bundlingResult.diagnostics.length) { - this.reportDiagnostics(bundlingResult.diagnostics); - this.error('Bundler error(s) occurred'); - this.exit(1); - return; - } - - const packager = new AppPackager(this, fd); - const zipName = await packager.zipItUp(); - - cli.action.stop('packaged!'); - //#endregion - - //#region fetching categories - cli.action.start(`${chalk.green('fetching')} the available categories`); - - const categories = await VariousUtils.fetchCategories(); - - cli.action.stop('fetched!'); - //#endregion - - //#region asking for information - const cloudAuth = new CloudAuth(); - const hasToken = await cloudAuth.hasToken(); - if (!hasToken) { - const cloudAccount: any = await inquirer.prompt([{ - type: 'confirm', - name: 'hasAccount', - message: 'Have you logged into our Publisher Portal?', - default: true, - }]); - - if (cloudAccount.hasAccount) { - try { - cli.action.start(chalk.green('*') + ' ' + chalk.gray('waiting for authorization...')); - await cloudAuth.executeAuthFlow(); - cli.action.stop(chalk.green('success!')); - } catch (e) { - cli.action.stop(chalk.red('failed to authenticate.')); - return; - } - } else { - this.error('A Rocket.Chat Cloud account and a Marketplace Publisher account ' - + 'is required to submit an App to the Marketplace. (rc-apps login)'); - } - } - - if (typeof flags.update === 'undefined') { - const isNewApp = await inquirer.prompt([{ - type: 'confirm', - name: 'isNew', - message: 'Is this a new App?', - default: true, - }]); - - flags.update = !(isNewApp as any).isNew; - } - - let changes = ''; - if (flags.update) { - const result: any = await inquirer.prompt([{ - type: 'input', - name: 'changes', - message: 'What changes were made in this version?', - }]); - - changes = result.changes; - } else { - const isFreeQuestion: any = await inquirer.prompt([{ - type: 'confirm', - name: 'isFree', - message: 'Is this App free or will it require payment?', - default: true, - }]); - - if (!isFreeQuestion.isFree) { - this.error('Paid Apps must be submitted via our Publisher Portal: ' - + 'https://marketplace.rocket.chat/publisher/new/app'); - } - } - - let selectedCategories = new Array(); - if (flags.categories) { - selectedCategories = flags.categories.split(','); - } else { - const result = await inquirer.prompt([{ - type: 'checkbox-plus', - name: 'categories', - message: 'Please select the categories which apply to this App?', - pageSize: 10, - highlight: true, - searchable: true, - validate: (answer: Array) => { - if (answer.length === 0) { - return 'You must choose at least one color.'; - } - - return true; - }, - // tslint:disable:promise-function-async - source: (_answersSoFar: object, input: string) => { - input = input || ''; - - return new Promise((resolve) => { - const fuzzyResult = fuzzy.filter(input, categories, { - extract: (item) => item.name, - }); - - const data = fuzzyResult.map((element) => { - return element.original; - }); - - resolve(data); - }); - }, - }] as any); - selectedCategories = (result as any).categories; - } - - const confirmSubmitting = await inquirer.prompt([{ - type: 'confirm', - name: 'submit', - message: 'Are you ready to submit?', - default: false, - }]); - - if (!(confirmSubmitting as any).submit) { - return; - } - //#endregion - - cli.action.start(`${chalk.green('submitting')} your app`); - - const data = new FormData(); - data.append('app', fs.createReadStream(fd.mergeWithFolder(zipName))); - data.append('categories', JSON.stringify(selectedCategories)); - - if (changes) { - data.append('changes', changes); - } - - const token = await cloudAuth.getToken(); - await this.asyncSubmitData(data, flags, fd, token); - - cli.action.stop('submitted!'); - } - - // tslint:disable:promise-function-async - // tslint:disable-next-line:max-line-length - private async asyncSubmitData(data: FormData, flags: { [key: string]: any }, fd: FolderDetails, token: string): Promise { - let url = 'https://marketplace.rocket.chat/v1/apps'; - if (flags.update) { - url += `/${fd.info.id}`; - } - - const headers: { [key: string]: string } = {}; - if (token) { - headers.Authorization = 'Bearer ' + token; - } - - const res: Response = await fetch(url, { - method: 'POST', - body: data, - headers, - }); - - if (res.status !== 200) { - const result = await res.json(); - - if (result.code === 467 || result.code === 466) { - throw new Error(result.error); - } - - throw new Error(`Failed to submit the App. Error code ${result.code}: ${result.error}`); - } else { - return res.json(); - } - } - - private reportDiagnostics(diag: Array): void { - diag.forEach((d) => this.error(d.message)); - } -} diff --git a/src/commands/watch.ts b/src/commands/watch.ts index 4a90564..22259ff 100644 --- a/src/commands/watch.ts +++ b/src/commands/watch.ts @@ -1,137 +1,311 @@ -import { Command, flags } from '@oclif/command'; -import chalk from 'chalk'; -import * as chokidar from 'chokidar'; -import cli from 'cli-ux'; - -import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition'; -import { AppCompiler, FolderDetails, unicodeSymbols } from '../misc'; -import { checkUpload, getIgnoredFiles, getServerInfo, uploadApp } from '../misc/deployHelpers'; - -export default class Watch extends Command { - - public static description = 'watches for changes in the app and redeploys to the server'; - - public static flags = { - 'help': flags.help({ char: 'h' }), - 'url': flags.string({ - description: 'where the app should be deployed to', - }), - 'username': flags.string({ - char: 'u', - description: 'username to authenticate with', - }), - 'password': flags.string({ - char: 'p', - description: 'password for the user', - }), - 'token': flags.string({ - char: 't', - description: 'API token to use with UserID (instead of username & password)', - }), - 'userId': flags.string({ - char: 'i', - description: 'UserID to use with API token (instead of username & password)', - }), - 'verbose': flags.boolean({ - char: 'v', - description: 'show additional details about the results of running the command', - }), - // flag with no value (-f, --force) - 'experimental-native-compiler': flags.boolean({ - description: '(experimental) use native TSC compiler', - }), - 'force': flags.boolean({ - char: 'f', - description: 'forcefully deploy the App, ignores lint & TypeScript errors', - }), - 'code': flags.string({ char: 'c', dependsOn: ['username'], description: '2FA code of the user' }), - 'i2fa': flags.boolean({ description: 'interactively ask for 2FA code' }), +import { FSWatcher, watch } from 'fs'; +import { readdir } from 'fs/promises'; +import { parseArgs } from 'util'; +import path from 'path'; + +import { buildAndPackage } from '../core/compiler'; +import { getServerInfo, loadIgnoredPatterns, uploadApp, validateDeployCredentials } from '../core/deploy'; +import { loadDeployConfigFromEnv } from '../core/env'; +import { CliError } from '../core/errors'; +import { loadConfigFile, loadProject, mergeDeployConfig } from '../core/project'; +import { Command, CommandContext, DeployConfig } from '../core/types'; +import { buildGlobMatcher } from '../utils/glob'; +import { failure, step, success, verbose, warn } from '../utils/output'; + +export const watchCommand: Command = { + name: 'watch', + description: 'Watch app files and deploy on changes.', + usage: 'rc-apps watch [--project ] --url [--allow-http] [--legacy-compiler] [auth options]', + async run(argv: string[], context: CommandContext): Promise { + const parsed = parseArgs({ + args: argv, + allowPositionals: false, + options: { + project: { type: 'string' }, + url: { type: 'string' }, + username: { type: 'string', short: 'u' }, + password: { type: 'string', short: 'p' }, + token: { type: 'string', short: 't' }, + userId: { type: 'string', short: 'i' }, + code: { type: 'string', short: 'c' }, + 'allow-http': { type: 'boolean' }, + 'legacy-compiler': { type: 'boolean', default: false }, + update: { type: 'boolean' }, + force: { type: 'boolean', short: 'f', default: false }, + verbose: { type: 'boolean', short: 'v', default: false }, + debounce: { type: 'string' }, + 'experimental-native-compiler': { type: 'boolean', default: false }, + }, + }); + + const projectPath = parsed.values.project ? path.resolve(parsed.values.project) : context.cwd; + const project = await loadProject(projectPath); + const configLoadResult = await loadConfigFile(project.rootPath); + const configFromFile = configLoadResult.config; + const configFromEnv = loadDeployConfigFromEnv(); + const allowHttpProvided = hasBooleanOption(argv, 'allow-http'); + const updateProvided = hasBooleanOption(argv, 'update'); + + const cliConfig: DeployConfig = { + url: parsed.values.url, + username: parsed.values.username, + password: parsed.values.password, + token: parsed.values.token, + userId: parsed.values.userId, + code: parsed.values.code, + allowHttp: allowHttpProvided ? parsed.values['allow-http'] : undefined, + update: updateProvided ? parsed.values.update : undefined, }; - public async run() { - const { flags } = this.parse(Watch); + const deployConfig = mergeDeployConfig(mergeDeployConfig(configFromFile, configFromEnv), cliConfig); + const verboseMode = parsed.values.verbose; + const useLegacyCompiler = parsed.values['legacy-compiler']; + + if (parsed.values['experimental-native-compiler']) { + warn('`--experimental-native-compiler` is deprecated in v2 and now a no-op (native is default).'); + } + + if (configLoadResult.legacyFields.length > 0) { + warn( + `Ignoring legacy .rcappsconfig field(s): ${configLoadResult.legacyFields.join( + ', ', + )}. Use CLI flags or RC_APPS_* environment variables.`, + ); + } + + validateDeployCredentials(deployConfig); - const fd = new FolderDetails(this); + verbose(verboseMode, `Project: ${project.rootPath}`); + verbose(verboseMode, `URL security: ${deployConfig.allowHttp ? 'allow-http override enabled' : 'https enforced'}`); + verbose(verboseMode, `Compiler mode: ${useLegacyCompiler ? 'legacy' : 'native-default'}`); + verbose( + verboseMode, + deployConfig.token && deployConfig.userId ? 'Auth mode: token/userId' : 'Auth mode: username/password', + ); + + step('Checking server...'); + await getServerInfo(deployConfig); + + const ignoredPatterns = await loadIgnoredPatterns(deployConfig); + const isIgnored = buildGlobMatcher(ignoredPatterns); + const debounceMs = Number(parsed.values.debounce ?? '800'); + verbose(verboseMode, `Watch debounce: ${debounceMs}ms`); + verbose(verboseMode, `Ignored patterns: ${ignoredPatterns.length}`); + + if (Number.isNaN(debounceMs) || debounceMs < 0) { + throw new CliError('Invalid --debounce value.', 2); + } + + let running = false; + let queued = false; + + const runDeployment = async (): Promise => { + if (running) { + queued = true; + return; + } + + running = true; + + try { + const zipRelativePath = await buildAndPackage(project, { + force: parsed.values.force, + verbose: verboseMode, + useNativeCompiler: !useLegacyCompiler, + }); - try { - await fd.readInfoFile(); - await fd.matchAppsEngineVersion(); - } catch (e) { - this.error(chalk.bold.red(e && e.message ? e.message : e), {exit: 2}); + const zipAbsolutePath = path.resolve(project.rootPath, zipRelativePath); + verbose(verboseMode, `Package path: ${zipAbsolutePath}`); + const result = await uploadApp(deployConfig, project, zipAbsolutePath); + success(`Deployment finished (${result.mode}).`); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + failure(`Watch deployment failed: ${message}`); + } finally { + running = false; + + if (queued) { + queued = false; + await runDeployment(); } + } + }; + + await runDeployment(); + + let timer: NodeJS.Timeout | undefined; + const watchers = new Map(); + let watcherErrorHandler: ((error: Error) => void) | undefined; + const recursiveWatchSupported = supportsRecursiveWatch(); + + const removeWatcher = (watchPath: string): void => { + const watcher = watchers.get(watchPath); - if (flags.i2fa) { - flags.code = await cli.prompt('2FA code', { type: 'hide' }); + if (watcher) { + if (watcherErrorHandler) { + watcher.off('error', watcherErrorHandler); } - let ignoredFiles: Array; - try { - ignoredFiles = await getIgnoredFiles(fd); - } catch (e) { - this.error(chalk.bold.red(e && e.message ? e.message : e)); + watcher.close(); + watchers.delete(watchPath); + } + }; + + const addWatcher = (watchPath: string, recursive: boolean): void => { + const watcher = watch(watchPath, { recursive, encoding: 'utf8' }, (eventType, fileName) => { + if (!fileName) { + return; } - chokidar.watch(fd.folder, { - ignored: ignoredFiles, - awaitWriteFinish: true, - persistent: true, - interval: 300, - }).on('change', async () => { - tasks(this, fd, flags) - .catch((e) => { - this.log(chalk.bold.redBright( - ` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`)); - }); - }).on('ready', async () => { - tasks(this, fd, flags) - .catch((e) => { - this.log(chalk.bold.redBright( - ` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`)); - }); - }); + if (!recursiveWatchSupported && eventType === 'rename') { + void syncWatchers(); + } + const absolutePath = path.resolve(watchPath, fileName); + const relativePath = toRelativeRootPath(project.rootPath, absolutePath); + + if (!relativePath || isIgnored(relativePath)) { + return; + } + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(() => { + void runDeployment(); + }, debounceMs); + }); + + if (watcherErrorHandler) { + watcher.on('error', watcherErrorHandler); + } + + watchers.set(watchPath, watcher); + }; + + const isIgnoredDirectory = (relativePath: string): boolean => { + const normalizedPath = relativePath.replace(/\\/g, '/'); + return ( + isIgnored(normalizedPath) || + isIgnored(`${normalizedPath}/`) || + isIgnored(`${normalizedPath}/__rc_apps_watch_probe__.txt`) + ); + }; + + const syncWatchers = async (): Promise => { + const discoveredDirectories = await collectDirectories(project.rootPath, isIgnoredDirectory); + const discoveredDirectorySet = new Set(discoveredDirectories); + + for (const watcherPath of Array.from(watchers.keys())) { + if (!discoveredDirectorySet.has(watcherPath)) { + removeWatcher(watcherPath); + } + } + + for (const directoryPath of discoveredDirectories) { + if (!watchers.has(directoryPath)) { + addWatcher(directoryPath, false); + } + } + }; + + if (recursiveWatchSupported) { + addWatcher(project.rootPath, true); + } else { + warn( + 'Recursive fs.watch is not supported on this platform. Falling back to multi-directory watch mode.', + ); + await syncWatchers(); } -} -function reportDiagnostics(command: Command, diag: Array): void { - diag.forEach((d) => command.error(d.message)); -} + step('Watching for changes. Press Ctrl+C to stop.'); -const tasks = async (command: Command, fd: FolderDetails, flags: Record): Promise => { - try { - cli.action.start(chalk.bold.greenBright(' Packaging the app')); - const compiler = new AppCompiler(fd, flags['experimental-native-compiler']); - const result = await compiler.compile(); + await new Promise((resolve, reject) => { + let sigintHandler: (() => void) | undefined; - if (flags.verbose) { - command.log(`${chalk.green('[info]')} using TypeScript v${ result.typeScriptVersion }`); + const cleanup = (): void => { + if (timer) { + clearTimeout(timer); + timer = undefined; } - if (result.diagnostics.length && !flags.force) { - reportDiagnostics(command, result.diagnostics); - command.error('TypeScript compiler error(s) occurred'); - command.exit(1); - return; + if (sigintHandler) { + process.off('SIGINT', sigintHandler); + sigintHandler = undefined; } - const zipName = await compiler.outputZip(); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); - - cli.action.start(chalk.bold.greenBright(' Getting Server Info')); - const serverInfo = await getServerInfo(fd, flags); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); - - const status = await checkUpload({...flags, ...serverInfo}, fd); - if (status) { - cli.action.start(chalk.bold.greenBright(' Updating App')); - await uploadApp({...serverInfo, update: true}, fd, zipName); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); - } else { - cli.action.start(chalk.bold.greenBright(' Uploading App')); - await uploadApp(serverInfo, fd, zipName); - cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark'))); + for (const watcherPath of Array.from(watchers.keys())) { + removeWatcher(watcherPath); } - } catch (e) { - cli.action.stop(chalk.red(unicodeSymbols.get('heavyMultiplicationX'))); - throw new Error(e); - } + + watcherErrorHandler = undefined; + }; + + watcherErrorHandler = (error: Error) => { + cleanup(); + reject(error); + }; + + for (const watcher of watchers.values()) { + watcher.on('error', watcherErrorHandler); + } + + sigintHandler = () => { + cleanup(); + resolve(); + }; + + process.once('SIGINT', sigintHandler); + }); + }, }; + +function hasBooleanOption(args: string[], option: string): boolean { + const optionPrefix = `--${option}`; + return args.some((arg) => arg === optionPrefix || arg.startsWith(`${optionPrefix}=`)); +} + +function supportsRecursiveWatch(): boolean { + return process.platform === 'darwin' || process.platform === 'win32'; +} + +function toRelativeRootPath(rootPath: string, absolutePath: string): string | undefined { + const relativePath = path.relative(rootPath, absolutePath); + + if (!relativePath || relativePath.startsWith('..') || path.isAbsolute(relativePath)) { + return undefined; + } + + return relativePath.replace(/\\/g, '/'); +} + +async function collectDirectories( + rootPath: string, + isIgnoredDirectory: (relativePath: string) => boolean, +): Promise { + const directories: string[] = [rootPath]; + const queue: string[] = [rootPath]; + + while (queue.length > 0) { + const directoryPath = queue.pop() as string; + const entries = await readdir(directoryPath, { withFileTypes: true, encoding: 'utf8' }).catch(() => []); + + for (const entry of entries) { + if (!entry.isDirectory()) { + continue; + } + + const nestedDirectoryPath = path.join(directoryPath, entry.name); + const nestedRelativePath = toRelativeRootPath(rootPath, nestedDirectoryPath); + + if (!nestedRelativePath || isIgnoredDirectory(nestedRelativePath)) { + continue; + } + + directories.push(nestedDirectoryPath); + queue.push(nestedDirectoryPath); + } + } + + return directories; +} diff --git a/src/compat.d.ts b/src/compat.d.ts new file mode 100644 index 0000000..273b933 --- /dev/null +++ b/src/compat.d.ts @@ -0,0 +1,29 @@ +declare module 'util' { + export function parseArgs(config: any): { + values: Record; + positionals: string[]; + }; +} + +declare module 'crypto' { + export function randomUUID(): string; +} + +declare module 'module' { + class Module {} + + namespace Module { + function createRequire(path: string): NodeRequire; + } + + export = Module; +} + +declare module 'fs/promises' { + export function access(path: string): Promise; + export function stat(path: string): Promise; + export function readFile(path: string, encoding?: BufferEncoding): Promise; + export function writeFile(path: string, data: string | Buffer, encoding?: BufferEncoding): Promise; + export function mkdir(path: string, options?: any): Promise; + export function readdir(path: string, options?: any): Promise; +} diff --git a/src/core/command-index.ts b/src/core/command-index.ts new file mode 100644 index 0000000..789bead --- /dev/null +++ b/src/core/command-index.ts @@ -0,0 +1,15 @@ +import { Command } from './types'; + +export function buildCommandIndex(commands: Command[]): Map { + const index = new Map(); + + for (const command of commands) { + index.set(command.name, command); + + for (const alias of command.aliases ?? []) { + index.set(alias, command); + } + } + + return index; +} diff --git a/src/core/compiler.ts b/src/core/compiler.ts new file mode 100644 index 0000000..65b639a --- /dev/null +++ b/src/core/compiler.ts @@ -0,0 +1,77 @@ +import Module from 'module'; +import path from 'path'; + +import { AppsCompiler } from '@rocket.chat/apps-compiler'; + +import { CliError } from './errors'; +import { CLI_TOOL, CLI_VERSION } from './meta'; +import { ProjectContext } from './project'; + +const createRequire = Module.createRequire; + +interface CompilerDiagnostic { + message: string; +} + +interface CompilerResponse { + diagnostics: CompilerDiagnostic[]; + typeScriptVersion?: string; +} + +export interface BuildOptions { + force: boolean; + verbose: boolean; + useNativeCompiler: boolean; +} + +export async function buildAndPackage(project: ProjectContext, options: BuildOptions): Promise { + const compiler = createCompiler(project.rootPath, options.useNativeCompiler); + + const compileResult = (await compiler.compile()) as CompilerResponse; + + if (options.verbose && compileResult.typeScriptVersion) { + console.log(`[info] using TypeScript ${compileResult.typeScriptVersion}`); + } + + ensureDiagnosticsAreSafe('TypeScript', compileResult.diagnostics, options.force); + + const bundleResult = (await compiler.bundle()) as CompilerResponse; + ensureDiagnosticsAreSafe('Bundler', bundleResult.diagnostics, options.force); + + const zipName = path.join('dist', `${project.manifest.nameSlug}_${project.manifest.version}.zip`); + await compiler.outputZip(zipName); + + return zipName; +} + +function createCompiler(projectPath: string, useNativeCompiler: boolean): AppsCompiler { + const appRequire = createRequire(path.join(projectPath, 'app.json')); + + let typescriptImpl: unknown; + + try { + typescriptImpl = appRequire('typescript'); + } catch { + throw new CliError('TypeScript is required in the app project. Run npm install in your app folder.', 2); + } + + return new AppsCompiler( + { + tool: CLI_TOOL, + version: CLI_VERSION, + when: new Date(), + }, + projectPath, + typescriptImpl as any, + useNativeCompiler, + ); +} + +function ensureDiagnosticsAreSafe(stage: string, diagnostics: CompilerDiagnostic[], force: boolean): void { + if (!diagnostics || diagnostics.length === 0 || force) { + return; + } + + const message = diagnostics.map((item) => item.message).join('\n'); + throw new CliError(`${stage} errors occurred:\n${message}`, 1); +} diff --git a/src/core/deploy.ts b/src/core/deploy.ts new file mode 100644 index 0000000..f6bb8c7 --- /dev/null +++ b/src/core/deploy.ts @@ -0,0 +1,263 @@ +import { basename } from 'path'; +import { readFile } from 'fs/promises'; + +import { CliError } from './errors'; +import { ProjectContext } from './project'; +import { DeployConfig } from './types'; + +interface AuthInfo { + authToken: string; + userId: string; +} + +interface ServerInfo { + version?: string; +} + +export function validateDeployCredentials(config: DeployConfig): void { + const hasUserPass = Boolean(config.username && config.password); + const hasTokenAuth = Boolean(config.token && config.userId); + + if (hasUserPass || hasTokenAuth) { + return; + } + + if (config.username && !config.password) { + throw new CliError('Missing --password for provided --username.', 2); + } + + if (config.password && !config.username) { + throw new CliError('Missing --username for provided --password.', 2); + } + + if (config.token && !config.userId) { + throw new CliError('Missing --userId for provided --token.', 2); + } + + if (config.userId && !config.token) { + throw new CliError('Missing --token for provided --userId.', 2); + } + + throw new CliError('Authentication is required. Provide --username/--password or --token/--userId.', 2); +} + +export async function getServerInfo(config: DeployConfig): Promise { + const baseUrl = resolveServerBaseUrl(config); + + const response = await fetch(normalizeUrl(baseUrl, '/api/info')); + + if (!response.ok) { + throw new CliError(`Unable to connect to Rocket.Chat server at ${baseUrl}.`, 2); + } + + return await parseJsonResponse( + response, + `Invalid response from ${normalizeUrl( + baseUrl, + '/api/info', + )}. Make sure --url points to a Rocket.Chat server root (for example: http://localhost:3000).`, + ); +} + +export async function uploadApp( + config: DeployConfig, + project: ProjectContext, + zipAbsolutePath: string, +): Promise<{ mode: 'create' | 'update' }> { + const baseUrl = resolveServerBaseUrl(config); + + const auth = await authenticate(config, baseUrl); + const alreadyInstalled = await appAlreadyExists(baseUrl, auth, project.manifest.id); + const shouldUpdate = Boolean(config.update || alreadyInstalled); + + const endpoint = shouldUpdate ? `/api/apps/${project.manifest.id}` : '/api/apps'; + const formData = await createAppUploadForm(zipAbsolutePath, project.manifest.permissions); + + const response = await fetch(normalizeUrl(baseUrl, endpoint), { + method: 'POST', + headers: { + 'X-Auth-Token': auth.authToken, + 'X-User-Id': auth.userId, + }, + body: formData, + }); + + const result = await parseJsonResponse<{ success?: boolean; status?: string; error?: string; messages?: unknown }>( + response, + `Invalid response from ${normalizeUrl(baseUrl, endpoint)}.`, + ); + + if (!response.ok || result.status === 'error' || result.success === false) { + if (result.status === 'compiler_error') { + throw new CliError(`Deployment compiler errors: ${JSON.stringify(result.messages, null, 2)}`); + } + + throw new CliError(result.error ?? `Deployment failed with status ${response.status}.`); + } + + return { + mode: shouldUpdate ? 'update' : 'create', + }; +} + +export async function loadIgnoredPatterns(config: DeployConfig): Promise { + const defaults = ['**/dist/**', '**/node_modules/**', '**/.git/**']; + + if (!config.ignoredFiles || config.ignoredFiles.length === 0) { + return defaults; + } + + return Array.from(new Set([...defaults, ...config.ignoredFiles])); +} + +async function authenticate(config: DeployConfig, baseUrl: string): Promise { + if (config.token && config.userId) { + const verification = await fetch(normalizeUrl(baseUrl, '/api/v1/me'), { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'X-Auth-Token': config.token, + 'X-User-Id': config.userId, + }, + }); + + const result = await parseJsonResponse<{ success?: boolean }>( + verification, + `Invalid response from ${normalizeUrl(baseUrl, '/api/v1/me')}.`, + ); + + if (!verification.ok || !result.success) { + throw new CliError('Invalid personal access token or userId.', 2); + } + + return { + authToken: config.token, + userId: config.userId, + }; + } + + if (!config.username || !config.password) { + throw new CliError('Authentication is required. Provide --username/--password or --token/--userId.', 2); + } + + const loginPayload: Record = { + user: config.username, + password: config.password, + }; + + if (config.code) { + loginPayload.code = config.code; + } + + const response = await fetch(normalizeUrl(baseUrl, '/api/v1/login'), { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(loginPayload), + }); + + const result = await parseJsonResponse<{ + status?: string; + data?: { authToken: string; userId: string }; + }>(response, `Invalid response from ${normalizeUrl(baseUrl, '/api/v1/login')}.`); + + if (!response.ok || result.status === 'error' || !result.data) { + throw new CliError('Invalid username/password or missing 2FA code.', 2); + } + + return result.data; +} + +async function appAlreadyExists(baseUrl: string, auth: AuthInfo, appId: string): Promise { + const response = await fetch(normalizeUrl(baseUrl, `/api/apps/${appId}`), { + method: 'GET', + headers: { + 'X-Auth-Token': auth.authToken, + 'X-User-Id': auth.userId, + }, + }); + + if (!response.ok) { + return false; + } + + const body = await parseJsonResponse<{ success?: boolean }>( + response, + `Invalid response from ${normalizeUrl(baseUrl, `/api/apps/${appId}`)}.`, + ); + return Boolean(body.success); +} + +async function createAppUploadForm(zipAbsolutePath: string, permissions?: unknown): Promise { + const form = new FormData(); + const fileContents = await readFile(zipAbsolutePath); + const fileBlob = new Blob([fileContents], { type: 'application/zip' }); + + form.set('app', fileBlob, basename(zipAbsolutePath)); + + if (permissions) { + form.set('permissions', JSON.stringify(permissions)); + } + + return form; +} + +function assertUrl(url: string | undefined): asserts url is string { + if (!url) { + throw new CliError('Missing server URL. Provide --url or set RC_APPS_URL.', 2); + } +} + +function resolveServerBaseUrl(config: DeployConfig): string { + assertUrl(config.url); + + let parsed: URL; + try { + parsed = new URL(config.url); + } catch { + throw new CliError(`Invalid URL: ${config.url}`, 2); + } + + if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') { + throw new CliError('URL protocol must be http or https.', 2); + } + + if (parsed.username || parsed.password) { + throw new CliError('Credentials in URL are not supported. Use --username/--password or --token/--userId.', 2); + } + + if ((parsed.search && parsed.search.length > 0) || (parsed.hash && parsed.hash.length > 0)) { + throw new CliError('URL must not include query string or hash.', 2); + } + + if (parsed.protocol === 'http:' && !isLoopbackHost(parsed.hostname) && !config.allowHttp) { + throw new CliError( + `Refusing insecure HTTP for non-localhost target (${parsed.hostname}). Use HTTPS or pass --allow-http.`, + 2, + ); + } + + return parsed.toString().replace(/\/$/, ''); +} + +function isLoopbackHost(hostname: string): boolean { + const normalized = hostname.toLowerCase(); + return normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '::1'; +} + +function normalizeUrl(url: string, endpoint: string): string { + return `${url.replace(/\/$/, '')}${endpoint}`; +} + +async function parseJsonResponse(response: Response, fallbackMessage: string): Promise { + const raw = await response.text(); + + try { + return JSON.parse(raw) as T; + } catch { + const snippet = raw.trim().slice(0, 120).replace(/\s+/g, ' '); + const contentType = response.headers.get('content-type') ?? 'unknown'; + throw new CliError(`${fallbackMessage} Received non-JSON response (content-type: ${contentType}): ${snippet}`, 2); + } +} diff --git a/src/core/env.ts b/src/core/env.ts new file mode 100644 index 0000000..e1f7e0d --- /dev/null +++ b/src/core/env.ts @@ -0,0 +1,23 @@ +import { DeployConfig } from './types'; + +const TRUE_VALUES = new Set(['1', 'true', 'yes', 'on']); + +export function loadDeployConfigFromEnv(env: NodeJS.ProcessEnv = process.env): DeployConfig { + return { + url: env.RC_APPS_URL, + username: env.RC_APPS_USERNAME, + password: env.RC_APPS_PASSWORD, + token: env.RC_APPS_TOKEN, + userId: env.RC_APPS_USER_ID, + code: env.RC_APPS_2FA_CODE, + allowHttp: toBoolean(env.RC_APPS_ALLOW_HTTP), + }; +} + +function toBoolean(value: string | undefined): boolean | undefined { + if (typeof value === 'undefined') { + return undefined; + } + + return TRUE_VALUES.has(value.trim().toLowerCase()); +} diff --git a/src/core/errors.ts b/src/core/errors.ts new file mode 100644 index 0000000..9cc1ca4 --- /dev/null +++ b/src/core/errors.ts @@ -0,0 +1,9 @@ +export class CliError extends Error { + public readonly exitCode: number; + + constructor(message: string, exitCode = 1) { + super(message); + this.name = 'CliError'; + this.exitCode = exitCode; + } +} diff --git a/src/core/logger.ts b/src/core/logger.ts new file mode 100644 index 0000000..822211a --- /dev/null +++ b/src/core/logger.ts @@ -0,0 +1,21 @@ +export class Logger { + constructor(private readonly verboseEnabled: boolean) {} + + public info(message: string): void { + console.log(message); + } + + public warn(message: string): void { + console.warn(message); + } + + public error(message: string): void { + console.error(message); + } + + public verbose(message: string): void { + if (this.verboseEnabled) { + console.log(message); + } + } +} diff --git a/src/core/meta.ts b/src/core/meta.ts new file mode 100644 index 0000000..ca53063 --- /dev/null +++ b/src/core/meta.ts @@ -0,0 +1,2 @@ +export const CLI_TOOL = '@rocket.chat/apps-cli'; +export const CLI_VERSION = '2.0.0'; diff --git a/src/core/project.ts b/src/core/project.ts new file mode 100644 index 0000000..e55898d --- /dev/null +++ b/src/core/project.ts @@ -0,0 +1,116 @@ +import { access, readFile, stat } from 'fs/promises'; +import path from 'path'; + +import { CliError } from './errors'; +import { AppManifest, DeployConfig } from './types'; +import { readJsonFile } from '../utils/files'; + +export interface ProjectContext { + rootPath: string; + appJsonPath: string; + manifest: AppManifest; +} + +export interface ConfigLoadResult { + config: DeployConfig; + legacyFields: string[]; +} + +const REQUIRED_FIELDS: Array = [ + 'id', + 'name', + 'nameSlug', + 'version', + 'requiredApiVersion', + 'description', + 'author', + 'classFile', + 'iconFile', +]; + +export async function loadProject(projectPath: string): Promise { + const rootPath = path.resolve(projectPath); + const appJsonPath = path.join(rootPath, 'app.json'); + + try { + await access(appJsonPath); + } catch { + throw new CliError(`No app found in ${rootPath}. Missing app.json.`, 2); + } + + let manifest: AppManifest; + + try { + manifest = await readJsonFile(appJsonPath); + } catch { + throw new CliError('app.json is not valid JSON.', 2); + } + + validateManifest(manifest); + + const classFilePath = path.resolve(rootPath, manifest.classFile); + + let fileInfo: Awaited>; + + try { + fileInfo = await stat(classFilePath); + } catch { + throw new CliError(`The classFile does not exist: ${classFilePath}`, 2); + } + + if (!fileInfo.isFile()) { + throw new CliError(`The classFile path is not a file: ${classFilePath}`, 2); + } + + return { + rootPath, + appJsonPath, + manifest, + }; +} + +function validateManifest(manifest: AppManifest): void { + for (const field of REQUIRED_FIELDS) { + if (typeof manifest[field] === 'undefined' || manifest[field] === null || manifest[field] === '') { + throw new CliError(`Invalid app.json. Missing required field: ${field}`, 2); + } + } + + if (!manifest.author || typeof manifest.author.name !== 'string' || typeof manifest.author.support !== 'string') { + throw new CliError('Invalid app.json. author.name and author.support are required.', 2); + } +} + +const LEGACY_CONFIG_FIELDS = ['url', 'username', 'password', 'token', 'userId', 'code'] as const; + +export async function loadConfigFile(projectPath: string): Promise { + const configPath = path.join(projectPath, '.rcappsconfig'); + + try { + const raw = await readFile(configPath, 'utf8'); + const parsed = JSON.parse(raw) as Partial; + return { + config: { + allowHttp: parsed.allowHttp, + ignoredFiles: Array.isArray(parsed.ignoredFiles) ? parsed.ignoredFiles : undefined, + }, + legacyFields: LEGACY_CONFIG_FIELDS.filter((field) => + Object.prototype.hasOwnProperty.call(parsed, field) && typeof parsed[field] !== 'undefined' + ), + }; + } catch { + return { + config: {}, + legacyFields: [], + }; + } +} + +export function mergeDeployConfig(base: DeployConfig, override: DeployConfig): DeployConfig { + return { + ...base, + ...Object.fromEntries( + Object.entries(override).filter(([, value]) => typeof value !== 'undefined' && value !== '') + ), + }; +} diff --git a/src/core/source-packager.ts b/src/core/source-packager.ts new file mode 100644 index 0000000..ac031a0 --- /dev/null +++ b/src/core/source-packager.ts @@ -0,0 +1,79 @@ +import { createWriteStream } from 'fs'; +import { mkdir, stat } from 'fs/promises'; +import path from 'path'; + +import { ProjectContext } from './project'; +import { CLI_TOOL, CLI_VERSION } from './meta'; +import { walkFiles } from '../utils/files'; +import { buildGlobMatcher } from '../utils/glob'; +import { normalizePathForMatch } from '../utils/strings'; + +const Yazl = require('yazl'); + +const SOURCE_IGNORE_PATTERNS = [ + '**/README.md', + '**/tsconfig.json', + '**/package-lock.json', + '**/*.js', + '**/*.js.map', + '**/*.d.ts', + '**/*.spec.ts', + '**/*.test.ts', + '**/dist/**', + '**/node_modules/**', + '**/.git/**', + '**/.*', +]; + +const PACKAGER_INFO = { + tool: CLI_TOOL, + version: CLI_VERSION, +}; + +export async function packageSource(project: ProjectContext): Promise { + const matcher = buildGlobMatcher(SOURCE_IGNORE_PATTERNS); + const files = await walkFiles(project.rootPath); + + const included = files.filter((absolutePath) => { + const relativePath = normalizePathForMatch(path.relative(project.rootPath, absolutePath)); + return !matcher(relativePath); + }); + + if (included.length === 0) { + throw new Error('No files to package were found.'); + } + + const zipRelativePath = path.join('dist', `${project.manifest.nameSlug}_${project.manifest.version}.zip`); + const zipAbsolutePath = path.join(project.rootPath, zipRelativePath); + + await mkdir(path.dirname(zipAbsolutePath), { recursive: true }); + + const zip = new Yazl.ZipFile(); + zip.addBuffer(Buffer.from(JSON.stringify(PACKAGER_INFO)), '.packagedby', { compress: true }); + + for (const absolutePath of included) { + const relativePath = normalizePathForMatch(path.relative(project.rootPath, absolutePath)); + const fileStat = await stat(absolutePath); + + zip.addFile(absolutePath, relativePath, { + compress: true, + mtime: fileStat.mtime, + mode: fileStat.mode, + }); + } + + await writeZip(zip, zipAbsolutePath); + + return zipRelativePath; +} + +async function writeZip(zip: any, outputPath: string): Promise { + await new Promise((resolve, reject) => { + zip.outputStream + .pipe(createWriteStream(outputPath)) + .on('close', resolve) + .on('error', reject); + + zip.end(); + }); +} diff --git a/src/core/templates.ts b/src/core/templates.ts new file mode 100644 index 0000000..16c3755 --- /dev/null +++ b/src/core/templates.ts @@ -0,0 +1,196 @@ +import { AppManifest } from './types'; + +export function appClassTemplate(className: string): string { + return `import { + IAppAccessors, + IConfigurationExtend, + IEnvironmentRead, + ILogger, +} from '@rocket.chat/apps-engine/definition/accessors'; +import { ApiSecurity, ApiVisibility, IApiEndpoint } from '@rocket.chat/apps-engine/definition/api'; +import { App } from '@rocket.chat/apps-engine/definition/App'; +import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; +import { ISetting } from '@rocket.chat/apps-engine/definition/settings'; +import { ISlashCommand } from '@rocket.chat/apps-engine/definition/slashcommands'; + +export class ${className} extends App { + constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) { + super(info, logger, accessors); + } + + protected async extendConfiguration( + configuration: IConfigurationExtend, + _environmentRead: IEnvironmentRead, + ): Promise { + const endpoints: IApiEndpoint[] = [ + // rc-apps:api-endpoints + ]; + + if (endpoints.length > 0) { + await configuration.api.provideApi({ + visibility: ApiVisibility.PUBLIC, + security: ApiSecurity.UNSECURE, + endpoints, + }); + } + + const slashCommands: ISlashCommand[] = [ + // rc-apps:slash-commands + ]; + + for (const slashCommand of slashCommands) { + await configuration.slashCommands.provideSlashCommand(slashCommand); + } + + const appSettings: ISetting[] = [ + // rc-apps:settings + ]; + + for (const setting of appSettings) { + await configuration.settings.provideSetting(setting); + } + } +} +`; +} + +export function appReadmeTemplate(manifest: AppManifest): string { + return `# ${manifest.name} + +${manifest.description} + +## Development + +1. Install dependencies with \`npm install\` +2. Build your app with \`npm run build\` +3. Package with \`rc-apps package\` +4. Deploy with \`rc-apps deploy --url http://localhost:3000 --username --password \` +`; +} + +export function appTsConfigTemplate(): string { + return `{ + "compilerOptions": { + "target": "ES2021", + "module": "commonjs", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "dist" + }, + "include": ["**/*.ts"], + "exclude": ["dist", "node_modules"] +} +`; +} + +export function appPackageJsonTemplate(appName: string, appsEngineVersion: string): string { + return `{ + "name": "${appName}", + "version": "0.0.1", + "private": true, + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@rocket.chat/apps-engine": "${appsEngineVersion}", + "@rocket.chat/icons": "^0.38.0", + "@rocket.chat/ui-kit": "^0.36.1" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "typescript": "^5.7.2" + } +} +`; +} + +export function endpointTemplate(className: string, endpointPath: string): string { + return `import { + IHttp, + IModify, + IPersistence, + IRead, +} from '@rocket.chat/apps-engine/definition/accessors'; +import { IApiEndpoint, IApiEndpointInfo, IApiRequest, IApiResponse } from '@rocket.chat/apps-engine/definition/api'; + +export class ${className} implements IApiEndpoint { + public path = '${endpointPath}'; + + public async get( + _request: IApiRequest, + _endpoint: IApiEndpointInfo, + _read: IRead, + _modify: IModify, + _http: IHttp, + _persis: IPersistence, + ): Promise { + return { + status: 200, + content: { ok: true }, + }; + } +} +`; +} + +export function slashCommandTemplate(className: string): string { + return `import { + IHttp, + IModify, + IPersistence, + IRead, +} from '@rocket.chat/apps-engine/definition/accessors'; +import { + ISlashCommand, + SlashCommandContext, +} from '@rocket.chat/apps-engine/definition/slashcommands'; + +export class ${className} implements ISlashCommand { + public command = '${className.toLowerCase()}'; + public i18nDescription = 'Runs ${className}'; + public i18nParamsExample = ''; + public providesPreview = false; + + public async executor( + _context: SlashCommandContext, + _read: IRead, + _modify: IModify, + _http: IHttp, + _persis: IPersistence, + ): Promise { + return; + } +} +`; +} + +export function initialSettingsTemplate(): string { + return `import { + ISetting, + SettingType, +} from '@rocket.chat/apps-engine/definition/settings'; + +export const settings: ISetting[] = []; +`; +} + +export function appendSettingTemplate(settingsSource: string, settingId: string): string { + const addition = `settings.push({ + id: '${settingId}', + public: false, + type: SettingType.STRING, + packageValue: '', + required: false, + i18nLabel: '${settingId}_label', + i18nDescription: '${settingId}_description', +});\n`; + + if (!settingsSource.includes('settings.push')) { + return `${settingsSource.trimEnd()}\n\n${addition}`; + } + + return `${settingsSource.trimEnd()}\n${addition}`; +} diff --git a/src/core/types.ts b/src/core/types.ts new file mode 100644 index 0000000..a9b0e6b --- /dev/null +++ b/src/core/types.ts @@ -0,0 +1,42 @@ +export interface Command { + name: string; + aliases?: string[]; + description: string; + usage: string; + run(args: string[], context: CommandContext): Promise; +} + +export interface CommandContext { + cwd: string; +} + +export interface AppAuthor { + name: string; + support: string; + homepage?: string; +} + +export interface AppManifest { + id: string; + name: string; + nameSlug: string; + version: string; + requiredApiVersion: string; + description: string; + author: AppAuthor; + classFile: string; + iconFile: string; + permissions?: unknown; +} + +export interface DeployConfig { + url?: string; + username?: string; + password?: string; + token?: string; + userId?: string; + code?: string; + allowHttp?: boolean; + update?: boolean; + ignoredFiles?: string[]; +} diff --git a/src/index.ts b/src/index.ts index 63a56fd..006f246 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,146 @@ -export { run } from '@oclif/command'; +#!/usr/bin/env node + +import { CliError } from './core/errors'; +import { CLI_VERSION } from './core/meta'; +import { Command } from './core/types'; +import { renderCommandHelp, renderHelp } from './commands/help'; +import { failure } from './utils/output'; + +interface CommandEntry { + name: string; + aliases?: string[]; + description: string; + usage: string; + details?: string[]; + load: () => Promise; +} + +const COMMANDS: CommandEntry[] = [ + { + name: 'create', + description: 'Create a new Rocket.Chat app project.', + usage: + 'rc-apps create [name] [--description ] [--author ] [--support ] [--homepage ] [--skip-install]', + load: async () => (await import('./commands/create')).createCommand, + }, + { + name: 'deploy', + description: 'Compile, package, and deploy an app to Rocket.Chat.', + usage: + 'rc-apps deploy [--project ] --url [--allow-http] [--legacy-compiler] [--username --password

| --userId --token ]', + details: [ + 'Auth/URL can come from environment variables.', + 'Run `rc-apps env` to list all supported variables.', + 'Compiler default is native in v2. Use `--legacy-compiler` to opt into legacy mode.', + ], + load: async () => (await import('./commands/deploy')).deployCommand, + }, + { + name: 'env', + aliases: ['config-env'], + description: 'Show supported deploy/watch environment variables.', + usage: 'rc-apps env', + details: [ + 'Environment variables:', + ' RC_APPS_URL, RC_APPS_USERNAME, RC_APPS_PASSWORD, RC_APPS_TOKEN, RC_APPS_USER_ID, RC_APPS_2FA_CODE, RC_APPS_ALLOW_HTTP', + 'Precedence: CLI flags > environment variables > .rcappsconfig', + ], + load: async () => (await import('./commands/env')).envCommand, + }, + { + name: 'generate', + aliases: ['g'], + description: 'Generate boilerplate for app extensions.', + usage: 'rc-apps generate [name] [--path ] [--project ]', + load: async () => (await import('./commands/generate')).generateCommand, + }, + { + name: 'package', + aliases: ['p', 'pack'], + description: 'Package an app into a deployable zip file.', + usage: + 'rc-apps package [--project ] [--force] [--verbose] [--no-compile] [--legacy-compiler]', + details: ['Compiler default is native in v2. Use `--legacy-compiler` to opt into legacy mode.'], + load: async () => (await import('./commands/package')).packageCommand, + }, + { + name: 'watch', + description: 'Watch app files and deploy on changes.', + usage: 'rc-apps watch [--project ] --url [--allow-http] [--legacy-compiler] [auth options]', + details: [ + 'Auth/URL can come from environment variables.', + 'Run `rc-apps env` to list all supported variables.', + 'Compiler default is native in v2. Use `--legacy-compiler` to opt into legacy mode.', + ], + load: async () => (await import('./commands/watch')).watchCommand, + }, +]; + +const COMMAND_INDEX = new Map(); +for (const command of COMMANDS) { + COMMAND_INDEX.set(command.name, command); + for (const alias of command.aliases ?? []) { + COMMAND_INDEX.set(alias, command); + } +} + +async function main(): Promise { + const argv = process.argv.slice(2); + const requestedCommand = argv[0]; + + if (!requestedCommand || requestedCommand === 'help' || requestedCommand === '--help' || requestedCommand === '-h') { + const requestedSubCommand = argv[1]; + + if (requestedSubCommand) { + const command = COMMAND_INDEX.get(requestedSubCommand); + + if (!command) { + throw new CliError(`Unknown command: ${requestedSubCommand}`, 2); + } + + console.log(renderCommandHelp(command)); + return; + } + + console.log(renderHelp(COMMANDS)); + return; + } + + if (requestedCommand === '--version' || requestedCommand === '-v') { + console.log(CLI_VERSION); + return; + } + + const command = COMMAND_INDEX.get(requestedCommand); + + if (!command) { + throw new CliError(`Unknown command: ${requestedCommand}. Run "rc-apps help".`, 2); + } + + if (argv.includes('--help') || argv.includes('-h')) { + console.log(renderCommandHelp(command)); + return; + } + + const args = argv.slice(1); + const loadedCommand = await command.load(); + + await loadedCommand.run(args, { + cwd: process.cwd(), + }); +} + +main().catch((error: unknown) => { + if (error instanceof CliError) { + failure(error.message); + process.exit(error.exitCode); + } + + if (error instanceof Error) { + failure(error.message); + } else { + failure(String(error)); + } + + process.exit(1); +}); diff --git a/src/misc/appCompiler.ts b/src/misc/appCompiler.ts deleted file mode 100644 index 12acec4..0000000 --- a/src/misc/appCompiler.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as path from 'path'; - -import { AppsCompiler } from '@rocket.chat/apps-compiler'; -import { IBundledCompilerResult, ICompilerResult } from '@rocket.chat/apps-compiler/definition'; - -import { FolderDetails } from './folderDetails'; - -/* import packageInfo = require('../package.json'); */ -const packageInfo = { - version: '1.7.0', - name: '@rocket.chat/apps-cli', -}; - -// tslint:disable-next-line:no-var-requires -const createRequire = require('module').createRequire; - -export function getTypescriptForApp(fd: FolderDetails): any { - const appRequire = createRequire(fd.mergeWithFolder('app.json')); - - return appRequire('typescript'); -} - -export class AppCompiler { - private compiler: AppsCompiler; - - constructor(private fd: FolderDetails, useNativeCompiler = false) { - this.compiler = new AppsCompiler({ - tool: packageInfo.name, - version: packageInfo.version, - when: new Date(), - }, - this.fd.folder, - getTypescriptForApp(fd), - useNativeCompiler); - } - - public async compile(): Promise { - return this.compiler.compile(); - } - - public async bundle(): Promise { - return this.compiler.bundle(); - } - - public async outputZip(): Promise { - const zipName = path.join('dist', `${this.fd.info.nameSlug}_${this.fd.info.version}.zip`); - - await this.compiler.outputZip(zipName); - - return zipName; - } - -} diff --git a/src/misc/appCreator.ts b/src/misc/appCreator.ts deleted file mode 100644 index 2f8bf64..0000000 --- a/src/misc/appCreator.ts +++ /dev/null @@ -1,122 +0,0 @@ -import Command from '@oclif/command'; -import { exec } from 'child_process'; -import * as fs from 'fs'; -import pascalCase = require('pascal-case'); - -import { editorConfigTemplate, gitIgnoreTemplate, mainTemplate, packageJsonTemplate, - readmeTemplate, tsConfigTemplate, tsLintConfigTemplate, vsCodeExtsTemplate } from '../templates/app/index'; -import { FolderDetails } from './folderDetails'; - -export class AppCreator { - constructor(private fd: FolderDetails, private command: Command) { } - - public async writeFiles(): Promise { - fs.mkdirSync(this.fd.folder); - this.createAppJson(); - this.createServerInfoJson(); - this.createMainTypeScriptFile(); - this.createBlankIcon(); - this.createdReadme(); - this.createTsConfig(); - this.createTsLintConfig(); - this.createPackageJson(); - this.createGitIgnore(); - this.createEditorConfig(); - this.createVsCodeExts(); - - await this.runNpmInstall(); - } - - private createAppJson(): void { - fs.writeFileSync(this.fd.mergeWithFolder('app.json'), JSON.stringify(this.fd.info, undefined, 4), 'utf8'); - } - - private createServerInfoJson(): void { - const toWrite = { - url: 'http://localhost:3000', - username: '', - password: '', - ignoredFiles: [ - '**/README.md', - '**/package-lock.json', - '**/package.json', - '**/tslint.json', - '**/tsconfig.json', - '**/*.js', - '**/*.js.map', - '**/*.d.ts', - '**/*.spec.ts', - '**/*.test.ts', - '**/dist/**', - '**/.*', - ], - }; - - fs.writeFileSync(this.fd.mergeWithFolder('.rcappsconfig'), JSON.stringify(toWrite, null, 4) , 'utf8'); - } - - private createMainTypeScriptFile(): void { - const toWrite = mainTemplate(pascalCase(this.fd.info.name)); - fs.writeFileSync(this.fd.mergeWithFolder(this.fd.info.classFile), toWrite, 'utf8'); - } - - private createBlankIcon(): void { - // tslint:disable-next-line - const base64String = 'iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQBAMAAACAGwOrAAAAG1BMVEUAAAD///9fX19/f38/Pz+fn5/f398fHx+/v7+TbuY3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJ80lEQVR4nO3bzVvbRgLHcWMb5GMmBMdHHOg2xzqEJkdMeEKPdShpj/Z2m80RU5ZwjJptmj+7kub9xVhGDs+zz34/z9OnZmzJMz9Jo5mR02oBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU8uVjk62zDxdr2tP9ax9U9o/qbyIe3P3rfv8shHj/5qL5ngoHzxptvrpNofz2bd1NGjTxB/Vl/Z+b7qnQFuJi+afWyYQlxH9rblKjiVm6FTdFTGcH58XZ9bDunlofFr5TVP275duv06Z48aFw/E0uxF/1NqnRxMnDVGl3Jn6tUrz8vnZYm2J30VsbA/Fx6fZrZSvzVPTrndV3DmssTPFp3T3dEtbw0eTx0u3XyqnMa/HvWpvcNaxudDSahZVPx9tLt18rpzLZbKfWJncN6zo6GI3CysSPW/2l26+VW5lxvbvLXcOaRJd5o7A64mhTHC3dwTq5lenVu7vcMayuiAobhVWcVl3x49IdrJNbmXa9775jWL14743CKjusWbNR7arcynTr3YrvGFbiIm8U1uhR8V/yrvvV3F9Yk8Fd9rQ4rNm0OADxPr+mBWFlxyf+edC1BakmZlfe51NhzR5FRXJPJ96m2Yn398KwumUHuxWerVfhJDcqaCLZZ2Uvy/nbG/up7PtyPvT+efWHDeuXP1VdX82Kt/+wn0+E1U1kXBZ1cjNVLFy+raaOPyXrF1T8orwjmndviq9v5041ooLm3Mro19lEThb/qd/QBfJObVp9owdO/3E/X65j5INqLeO580WdxN2j2FN7Vm0q35PHpPSv6u+9g4OX4lO1q6Nw243yCszstTDeKWfWTrWjgubcsLbUsOW16D87vXoqTPPGxWl2crL3Vn5Wh9WdqR6jqNOb0w/F2VWNPHp2au6eX6lxSbGnifh1/8lEyOFwV4jB2ZOT47fqsOR2V7vhtsNq9J6bCU+RTS4+nV59o6sdFTTnhjUcqCr3j+RbJgxZ0Pr9SDVRflw3fyR+lh+r6r8grK3EAFI86FWHPRvJXXX76lx8Labl/24LS8Y0MhOe8U5Prpt0VPJRQXPedEc27lofibF6MfcPjQprU2fR1i/GJo9En7WRmB6IB7lsR0dUTc/09roqi/ssdQHOzYRnvDPZ1tXYTRY051TmRnUAub4fd4W8geX+kZFhZbk63Yosd/Xnp+ojibDmIv5ysa0PQx5sMNR1WBSW6tp75viM+/pE78quNCpozlamO5Nzt7bd9agvC6beJjKsa7P8NTFZ5np0kAhrnJj0CnOBDIMB04aOdlFYPaEqa/tVUw15RkUFzZnKFHfZv1Q1TPVkP7MV1LcKq2uqkgm3k1W1S4SVGD8KczPbCM67nr5oF4U1H6gvn+r920Mqr82ooDm5Unp1/Iu5wzp7bleNCc+JKqyRaUTb3r63dJMTYYXnTrUn04+Fo0uznrAoLD3RMSez0zHJazMqaM6uweux28j2UPKkGQUncRnWphoJtbzmmCbWDct8VdgcM9pcFJaeQg/1Lpypp7w2o4LmTFhmAT53piXV6zyYpxRhFb27qcmWW6ld+aJuWGbPYSbLwjKLM+b6dc7/LLwgsjUt1m+Ks3KA/Nku+QpnYbvqGUWw0l2E9do5VBu2UqYJdcMye+6sGNZm9L7bJ1YdRVTQnP4yM3XJ3HtfeZJnwc2w+GY1/JTmtlLmCNa9G5o2dOz4/vjwy+d375aEZXpH02O62VQD1qigOVMZPZjqutmUXxgt3IgHI7cF47WG1c79IfuCsExXZc5OL5tHqYLmTGWuVRfrZVO2MA5r4A3yhv1z45awkoPSKKxOEdOfB+X8eTeon29iWm+G6YPg3aigOTvOUg1tu9mUw4h2FJb/2HwoHFNVudR05ygqi8LKZuLThfx7N6ifJxM7+vjk6oz1snmYKmjOVkYtztUIa+A9ux72v1iLO/heotVRWNf6NwRLwmq7B0geufsNy6w5fLTvpi/Dx95DrbE/c1xUuc30epYiw8pm2+bv3bB+rp54p6mFofu9DPUaih9WuoPviEf+Z0KJsMIZptyTfiXDsoHGQwPP3B2uTKNqfPUOXi9l+kOHQXLoUPRTu+bPeb2wMrFoDV5+eRmWzWBJWM4sQ3cf9zp0MBNidwBXzXTCEV3xd9cZaIVz4FKqj8jjyzUMa+hMf3bD+rnchx8quPsclLbMTdib7jxsxY9lym92hvDRE5ZWOqzhbc8NZVh2s41bw/LGgmpMEg33UuO/hpzKqGGju/gzexwUlMomZjNTlVRzUg8/t+JF+DAse5zMkkE4D1Jf6exKnYRje4LriXRQ0JzTVP2t7hLNtFWODfxNqiaa6VE8tGjFCxXyc1HHsTisiQ0rijg4mTvy++2atmpIVNCcE5Zq9Vb4JeGjBtnEiV5VTj099cLST8TyaMITXYZ6T11xa1je1En1tWN7zPTiX1DQnHsRyVZ3nGdxQhZMvU1kE+3wYRTfDoduZ66fZ8yjiyEMy2S8ZcJKXkF+xyDX752fFepl5Yfpz9+dG5a6r5iRoRoj2qGipJpohg/X8cH3xl72KVB4PwzDMmdMvq13nvz9hX9By9H0WOgLQD+wCAuac8Oay67AdK76cc/YT0M10azTuOMIf0/q8/oIj8Kf+IZh6XvAjXii65DFPV3YS8ovGw9mavFWPwoLC5rzH99/Jyu+UzVVP+4pCgbyhXyup5tohg/qIWvxvg7V+y2WCasjxAv5qn3ecvekw+rI2NuzbbPmmhqeBf21fNY9HqgzvD3TA6+goDn/VzTT6v8j8dtRq3WZm7N3JAbfFlG8yqsIdBOL4YMOU5T/ZiJ7ZX5b1haDcg8yO9t3vBbi02nrw/FL9aw7mkjn4o+LrPwdgA1rWM6tsz23znN/xCbv2eNBcXBfVNX+WBVHBc15oyT1HLg7E6I/sw/1qgIx07/fiH8YUoTQf1/+QxPT+IkQxRRXVtKGlY30SoHcdRRWT/8sxIa1Wez7nfDuIeEdRaip4I2stl3g8gua88LSIyq5XLljj59av5Q/+Xci0cOHp9Xb/TdmC/njGHktOj950D+TkYtWicW/f6jnTDYsWeRdSOHj6+opb3lP+cGtdlTwtWR7h2f7Xsnx4fmzo8UbdPfOz/bdSmV75wepfw10dXB+sH9L7V8dHpwGRZeHZ8+Wt7e6ARd7f76wAEa0UnTPP6H8n0JYKyCsFRDWCghrBYS1AsJaAWGtgLBWQFgrIKwVENYKLveXFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA/6+/AXriofigfACKAAAAAElFTkSuQmCC'; - - fs.writeFileSync(this.fd.mergeWithFolder(this.fd.info.iconFile), Buffer.from(base64String, 'base64')); - } - - // tslint:disable:max-line-length - private createdReadme(): void { - const toWrite = readmeTemplate(this.fd.info.name, this.fd.info.description); - fs.writeFileSync(this.fd.mergeWithFolder('README.md'), toWrite, 'utf8'); - } - - private createTsConfig(): void { - const toWrite = tsConfigTemplate(); - fs.writeFileSync(this.fd.mergeWithFolder('tsconfig.json'), toWrite, 'utf8'); - } - - private createTsLintConfig(): void { - const toWrite = tsLintConfigTemplate(); - fs.writeFileSync(this.fd.mergeWithFolder('tslint.json'), toWrite, 'utf8'); - } - - private createPackageJson(): void { - const toWrite = packageJsonTemplate(); - fs.writeFileSync(this.fd.mergeWithFolder('package.json'), toWrite, 'utf8'); - } - - private createGitIgnore(): void { - const toWrite = gitIgnoreTemplate(); - fs.writeFileSync(this.fd.mergeWithFolder('.gitignore'), toWrite, 'utf8'); - } - - private createEditorConfig(): void { - const toWrite = editorConfigTemplate(); - fs.writeFileSync(this.fd.mergeWithFolder('.editorconfig'), toWrite, 'utf8'); - } - - private createVsCodeExts(): void { - const toWrite = vsCodeExtsTemplate(); - fs.mkdirSync(this.fd.mergeWithFolder('.vscode')); - fs.writeFileSync(this.fd.mergeWithFolder('.vscode/extensions.json'), toWrite, 'utf8'); - } - - // tslint:disable-next-line:promise-function-async - private runNpmInstall(): Promise { - return new Promise((resolve, reject) => { - exec('npm install', { - cwd: this.fd.folder, - }, (e) => { - if (e) { - reject(); - return; - } - - resolve(); - }); - }); - } -} diff --git a/src/misc/appJsonSchema.ts b/src/misc/appJsonSchema.ts deleted file mode 100644 index 6dd2add..0000000 --- a/src/misc/appJsonSchema.ts +++ /dev/null @@ -1,87 +0,0 @@ -// tslint:disable:max-line-length - -export const appJsonSchema = { - $schema: 'http://json-schema.org/draft-04/schema#', - title: 'Rocket.Chat App', - description: 'A Rocket.Chat App declaration for usage inside of Rocket.Chat.', - type: 'object', - properties: { - id: { - description: "The App's unique identifier in uuid v4 format. This is optional, although recommended, however if you are going to publish on the App store, you will be assigned one.", - type: 'string', - pattern: '^[0-9a-fA-f]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$', - minLength: 36, - maxLength: 36, - }, - name: { - description: 'The public visible name of this App.', - type: 'string', - }, - nameSlug: { - description: "A url friendly slugged version of your App's name.", - type: 'string', - pattern: '^([a-z]|\\-)+$', - minLength: 3, - }, - version: { - description: 'The version of this App which will be used for display publicly and letting users know there is an update. This uses the semver format.', - type: 'string', - pattern: '\\bv?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?\\b', - minLength: 5, - }, - description: { - description: 'A description of this App, used to explain what this App does and provides for the user.', - type: 'string', - }, - requiredApiVersion: { - description: "The required version of the App's API which this App depends on. This uses the semver format.", - type: 'string', - pattern: '\\bv?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?\\b', - minLength: 5, - }, - author: { - type: 'object', - properties: { - name: { - description: "The author's name who created this App.", - type: 'string', - }, - support: { - description: 'The place where people can get support for this App, whether email or website.', - type: 'string', - }, - homepage: { - description: "The homepage for this App, it can be a Github or the author's website.", - type: 'string', - format: 'uri', - }, - }, - required: ['name', 'support'], - }, - classFile: { - type: 'string', - description: 'The name of the file which contains your App TypeScript source code.', - pattern: '^.*\\.(ts)$', - }, - iconFile: { - type: 'string', - description: 'The name of the file to use as the icon.', - pattern: '^.*\\.(png|jpg|jpeg|gif)$', - }, - assetsFolder: { - type: 'string', - description: 'The name of the folder which contains all of your resources, it should not start with a period.', - }, - }, - required: [ - 'id', - 'name', - 'nameSlug', - 'version', - 'description', - 'requiredApiVersion', - 'author', - 'classFile', - 'iconFile', - ], -}; diff --git a/src/misc/appPackager.ts b/src/misc/appPackager.ts deleted file mode 100644 index 645a190..0000000 --- a/src/misc/appPackager.ts +++ /dev/null @@ -1,103 +0,0 @@ -import Command from '@oclif/command'; -import * as fs from 'fs-extra'; -import * as glob from 'glob'; -import * as path from 'path'; -import * as Yazl from 'yazl'; - -/* import packageInfo = require('../package.json'); */ -const packageInfo = { - version: '1.7.0', - name: '@rocket.chat/apps-cli', -}; - -import { FolderDetails } from './folderDetails'; - -export class AppPackager { - public static GlobOptions: glob.IOptions = { - dot: false, - silent: true, - ignore: [ - '**/README.md', - '**/tslint.json', - '**/package-lock.json', - '**/tsconfig.json', - '**/*.js', - '**/*.js.map', - '**/*.d.ts', - '**/*.spec.ts', - '**/*.test.ts', - '**/dist/**', - '**/.*', - ], - }; - - public static PackagerInfo: { [key: string]: string } = { - tool: packageInfo.name, - version: packageInfo.version, - }; - - constructor(private command: Command, private fd: FolderDetails) {} - - public async zipItUp(): Promise { - let matches; - - try { - matches = await this.asyncGlob(); - } catch (e) { - this.command.warn(`Failed to retrieve the list of files for the App ${ this.fd.info.name }.`); - throw e; - } - - // Ensure we have some files to package up before we do the packaging - if (matches.length === 0) { - throw new Error('No files to package were found'); - } - - const zipName = path.join('dist', `${this.fd.info.nameSlug}_${this.fd.info.version}.zip`); - const zip = new Yazl.ZipFile(); - - zip.addBuffer(Buffer.from(JSON.stringify(AppPackager.PackagerInfo)), '.packagedby', { compress: true }); - - for (const realPath of matches) { - const zipPath = path.relative(this.fd.folder, realPath); - const fileStat = await fs.stat(realPath); - - const options: Partial = { - compress: true, - mtime: fileStat.mtime, - mode: fileStat.mode, - }; - - zip.addFile(realPath, zipPath, options); - } - - zip.end(); - - await this.asyncWriteZip(zip, zipName); - - return zipName; - } - - // tslint:disable-next-line:promise-function-async - private asyncGlob(): Promise> { - return new Promise((resolve, reject) => { - glob(this.fd.toZip, AppPackager.GlobOptions, (err, matches) => { - if (err) { - reject(err); - return; - } - - resolve(matches); - }); - }); - } - - // tslint:disable-next-line:promise-function-async - private asyncWriteZip(zip: Yazl.ZipFile, zipName: string): Promise { - return new Promise((resolve) => { - fs.mkdirpSync(this.fd.mergeWithFolder('dist')); - const realPath = this.fd.mergeWithFolder(zipName); - zip.outputStream.pipe(fs.createWriteStream(realPath)).on('close', resolve); - }); - } -} diff --git a/src/misc/cloudAuth.ts b/src/misc/cloudAuth.ts deleted file mode 100644 index cca8b8e..0000000 --- a/src/misc/cloudAuth.ts +++ /dev/null @@ -1,247 +0,0 @@ -import { Request, Server } from '@hapi/hapi'; -import axios from 'axios'; -import chalk from 'chalk'; -import { cli } from 'cli-ux'; -import Conf = require('conf'); -import { createHash } from 'crypto'; -import open = require('open'); -import { stringify } from 'querystring'; -import { cpu, mem, osInfo, system } from 'systeminformation'; -import { v4 as uuidv4 } from 'uuid'; - -const cloudUrl = 'https://cloud.rocket.chat'; -const clientId = '5d8e59c5d48080ef5497e522'; -const scope = 'offline_access marketplace:app-submit'; - -export interface ICloudToken { - access_token: string; - expires_in: number; - scope: string; - refresh_token: string; - token_type: string; -} - -export interface ICloudAuthStorage { - token: ICloudToken; - expiresAt: Date; -} - -export class CloudAuth { - private config: Conf; - private codeVerifier: string; - private port = 3005; - private server: Server; - private redirectUri: string; - - constructor() { - this.redirectUri = `http://localhost:${ this.port }/callback`; - this.codeVerifier = uuidv4() + uuidv4(); - } - - public async executeAuthFlow(): Promise { - await this.initialize(); - - return new Promise((resolve, reject) => { - try { - this.server = new Server({ host: 'localhost', port: this.port }); - this.server.route({ - method: 'GET', - path: '/callback', - handler: async (request: Request) => { - try { - const code = request.query.code; - const token = await this.fetchToken(code); - - resolve(token.access_token); - return 'Thank you. You can close this tab.'; - } catch (err) { - reject(err); - } finally { - this.server.stop(); - } - }, - }); - - const codeChallenge = this.base64url(createHash('sha256').update(this.codeVerifier).digest('base64')); - const authorizeUrl = this.buildAuthorizeUrl(codeChallenge); - cli.log(chalk.green('*') + ' ' + chalk.white('...if your browser does not open, open this:') - + ' ' + chalk.underline(chalk.blue(authorizeUrl))); - - open(authorizeUrl); - - this.server.start(); - } catch (e) { - // tslint:disable-next-line:no-console - console.log('Error inside of the execute:', e); - } - }); - } - - public async hasToken(): Promise { - await this.initialize(); - - return this.config.has('rcc.token.access_token'); - } - - public async getToken(): Promise { - await this.initialize(); - - const item: ICloudAuthStorage = this.config.get('rcc'); - if (!item) { - // when there isn't an item, we will not return anything or error out - return ''; - } - - if (new Date() < new Date(item.expiresAt)) { - return item.token.access_token; - } - - await this.refreshToken(); - - return this.config.get('rcc.token.access_token', '') as string; - } - - public async revokeToken(): Promise { - await this.initialize(); - - const item: ICloudAuthStorage = this.config.get('rcc'); - if (!item) { - throw new Error('invalid cloud auth storage item'); - } - - await this.revokeTheToken(); - } - - private async fetchToken(code: string | Array): Promise { - try { - const request = { - grant_type: 'authorization_code', - redirect_uri: this.redirectUri, - client_id: clientId, - code, - code_verifier: this.codeVerifier, - }; - - const res = await axios.post(`${ cloudUrl }/api/oauth/token`, stringify(request)); - const tokenInfo: ICloudToken = res.data; - - const expiresAt = new Date(); - expiresAt.setSeconds(expiresAt.getSeconds() + tokenInfo.expires_in); - - const storageItem: ICloudAuthStorage = { - token: tokenInfo, - expiresAt, - }; - - this.config.set('rcc', storageItem); - - return tokenInfo; - } catch (err) { - const d = err.response.data; - // tslint:disable-next-line:no-console - console.log(`[${ err.response.status }] error getting token: ${ d.error } (${ d.requestId })`); - - throw err; - } - } - - private async refreshToken(): Promise { - const refreshToken = this.config.get('rcc.token.refresh_token', ''); - - const request = { - client_id: clientId, - refresh_token: refreshToken, - scope, - grant_type: 'refresh_token', - redirect_uri: this.redirectUri, - }; - - try { - const res = await axios.post(`${ cloudUrl }/api/oauth/token`, stringify(request)); - const tokenInfo: ICloudToken = res.data; - - const expiresAt = new Date(); - expiresAt.setSeconds(expiresAt.getSeconds() + tokenInfo.expires_in); - - this.config.set('rcc.token.access_token', tokenInfo.access_token); - this.config.set('rcc.token.expires_in', tokenInfo.expires_in); - this.config.set('rcc.token.scope', tokenInfo.scope); - this.config.set('rcc.token.token_type', tokenInfo.token_type); - this.config.set('rcc.expiresAt', expiresAt); - } catch (err) { - const d = err.response.data; - // tslint:disable-next-line:no-console - console.log(`[${ err.response.status }] error getting token refreshed: ${ d.error } (${ d.requestId })`); - - throw err; - } - } - - private async revokeTheToken(): Promise { - const refreshToken = this.config.get('rcc.token.refresh_token', ''); - - const request = { - client_id: clientId, - token: refreshToken, - token_type_hint: 'refresh_token', - }; - - try { - await axios.post(`${ cloudUrl }/api/oauth/revoke`, stringify(request)); - this.config.delete('rcc'); - } catch (err) { - if (err.response.status === 401) { - this.config.delete('rcc'); - return; - } - - const d = err.response.data; - // tslint:disable-next-line:no-console - console.log(`[${ err.response.status }] error revoking the token: ${ d.error } (${ d.requestId })`); - - throw err; - } - } - - private buildAuthorizeUrl(codeChallenge: string) { - const data = { - client_id: clientId, - response_type: 'code', - scope, - redirect_uri: this.redirectUri, - state: uuidv4(), - code_challenge_method: 'S256', - code_challenge: codeChallenge, - }; - - const params = stringify(data); - const authorizeUrl = `${ cloudUrl }/authorize?${params}`; - return authorizeUrl; - } - - private async initialize(): Promise { - if (typeof this.config !== 'undefined') { - return; - } - - this.config = new Conf({ - projectName: 'chat.rocket.apps-cli', - encryptionKey: await this.getEncryptionKey(), - }); - } - - private async getEncryptionKey(): Promise { - const s = await system(); - const c = await cpu(); - const m = await mem(); - const o = await osInfo(); - - return s.manufacturer + ';' + s.uuid + ';' + String(c.processors) + ';' - + c.vendor + ';' + m.total + ';' + o.platform + ';' + o.release; - } - - // base64url - https://base64.guru/standards/base64url - private base64url(url: string) { - return url.replace( /\+/g, '-' ).replace( /\//g, '_' ).replace( /=+$/, '' ); - } -} diff --git a/src/misc/compilerOptions.ts b/src/misc/compilerOptions.ts deleted file mode 100644 index 6dba1f0..0000000 --- a/src/misc/compilerOptions.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as ts from 'typescript'; - -export const compilerOptions: ts.CompilerOptions = { - target: ts.ScriptTarget.ES2017, - module: ts.ModuleKind.CommonJS, - moduleResolution: ts.ModuleResolutionKind.NodeJs, - declaration: false, - noImplicitAny: false, - removeComments: true, - strictNullChecks: true, - noImplicitReturns: true, - emitDecoratorMetadata: true, - experimentalDecorators: true, -}; diff --git a/src/misc/deployHelpers.ts b/src/misc/deployHelpers.ts deleted file mode 100644 index 8faeb9c..0000000 --- a/src/misc/deployHelpers.ts +++ /dev/null @@ -1,259 +0,0 @@ -import Command from '@oclif/command'; -import chalk from 'chalk'; -import cli from 'cli-ux'; -import fetch from 'fetch-with-proxy'; -import * as FormData from 'form-data'; -import * as fs from 'fs'; -import { Response } from 'node-fetch'; - -import { AppPackager, FolderDetails } from '.'; - -export const getServerInfo = async (fd: FolderDetails, flags: {[key: string]: any}): - Promise<{[key: string]: any}> => { - let loginInfo = flags; - try { - if (await fd.doesFileExist(fd.mergeWithFolder('.rcappsconfig'))) { - const data = JSON.parse(await fs.promises.readFile(fd.mergeWithFolder('.rcappsconfig'), 'utf-8')); - loginInfo = { ...data, ...loginInfo}; - } - } catch (e) { - throw new Error(e && e.message ? e.message : e); - } - - try { - const serverInfo = await fetch(loginInfo.url + '/api/info').then((response) => response.json()); - - loginInfo.serverVersion = serverInfo.version; - } catch (e) { - throw new Error(`Problems conecting to Rocket.Chat at ${loginInfo.url} - please check the address`); - } - - // tslint:disable-next-line:max-line-length - const providedLoginArguments = ((loginInfo.username && loginInfo.password) || (loginInfo.userId && loginInfo.token)); - if (loginInfo.url && providedLoginArguments) { - return loginInfo; - } - - if (!loginInfo.url && providedLoginArguments) { - throw new Error(` - No url found. - Consider adding url with the flag --url - or create a .rcappsconfig file and add the url as - { - "url": "your-server-url" - } - `); - } else { - if (loginInfo.password || loginInfo.username) { - if (!loginInfo.password) { - throw new Error(` - No password found for username. - Consider adding password as a flag with -p="your-password" - or create a .rcappsconfig file and add the password as - { - "password":"your-password" - } - `); - } else { - throw new Error(` - No username found for given password. - Consider adding username as a flag with -u="your-username" - or create a .rcappsconfig file and add the username as - { - "username":"your-username" - } - `); - } - } else if (loginInfo.token || loginInfo.userId) { - if (!loginInfo.token) { - throw new Error(` - No token found for given user Id. - Consider adding token as a flag with -t="your-token" - or create a .rcappsconfig file and add the token as - { - "token":"your-token" - } - `); - } else { - throw new Error(` - No user Id found for given token. - Consider adding user Id as a flag with -i="your-userId" - or create a .rcappsconfig file and add the user Id as - { - "userId":"your-userId" - } - `); - } - } else { - throw new Error(` - No login arguments found. - Consider adding the server url with either username and password - or userId and personal access token through flags - or create a .rcappsconfig file to pass them as a JSON object. - `); - } - } -}; - -export const packageAndZip = async (command: Command, fd: FolderDetails): Promise => { - const packager = new AppPackager(command, fd); - try { - return packager.zipItUp(); - } catch (e) { - throw new Error(e); - } -}; - -export const uploadApp = async (flags: { [key: string]: any }, fd: FolderDetails, zipname: string) => { - const data = new FormData(); - data.append('app', fs.createReadStream(fd.mergeWithFolder(zipname))); - - if (fd.info.permissions) { - data.append('permissions', JSON.stringify(fd.info.permissions)); - } - - try { - await asyncSubmitData(data, flags, fd); - } catch (e) { - throw new Error(e); - } -}; - -// tslint:disable-next-line:max-line-length -export const checkUpload = async (flags: { [key: string]: any }, fd: FolderDetails): Promise => { - let authResult; - if (!flags.token) { - let credentials: { username: string, password: string, code?: string }; - credentials = { username: flags.username, password: flags.password }; - if (flags.code) { - credentials.code = flags.code; - } - - authResult = await fetch(normalizeUrl(flags.url, '/api/v1/login'), { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(credentials), - }).then((res: Response) => res.json()); - - if (authResult.status === 'error' || !authResult.data) { - throw new Error('Invalid username and password or missing 2FA code (if active)'); - } - } else { - const verificationResult = await fetch(normalizeUrl(flags.url, '/api/v1/me'), { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'X-Auth-Token': flags.token, - 'X-User-Id': flags.userId, - }, - }).then((res: Response) => res.json()); - - if (!verificationResult.success) { - throw new Error('Invalid API token'); - } - - authResult = { data: { authToken: flags.token, userId: flags.userId } }; - } - const endpoint = `/api/apps/${fd.info.id}`; - - const findApp = await fetch(normalizeUrl(flags.url, endpoint), { - method: 'GET', - headers: { - 'X-Auth-Token': authResult.data.authToken, - 'X-User-Id': authResult.data.userId, - }, - }).then((res: Response) => res.json()); - return findApp.success; -}; - -export const asyncSubmitData = async (data: FormData, flags: { [key: string]: any }, - fd: FolderDetails): Promise => { - let authResult; - if (!flags.url) { - throw new Error('Url not found'); - } - if (!flags.token) { - let credentials: { username: string, password: string, code?: string }; - credentials = { username: flags.username, password: flags.password }; - if (flags.code) { - credentials.code = flags.code; - } - - authResult = await fetch(normalizeUrl(flags.url, '/api/v1/login'), { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(credentials), - }).then((res: Response) => res.json()); - - if (authResult.status === 'error' || !authResult.data) { - throw new Error('Invalid username and password or missing 2FA code (if active)'); - } - } else { - const verificationResult = await fetch(normalizeUrl(flags.url, '/api/v1/me'), { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'X-Auth-Token': flags.token, - 'X-User-Id': flags.userId, - }, - }).then((res: Response) => res.json()); - - if (!verificationResult.success) { - throw new Error('Invalid API token'); - } - - authResult = { data: { authToken: flags.token, userId: flags.userId } }; - } - - if (await checkUpload(flags, fd)) { - cli.log(chalk.bold.greenBright(' App already exists - updating it.')); - flags.update = true; - } - - let endpoint = '/api/apps'; - if (flags.update) { - endpoint += `/${fd.info.id}`; - } - - const deployResult = await fetch(normalizeUrl(flags.url, endpoint), { - method: 'POST', - headers: { - 'X-Auth-Token': authResult.data.authToken, - 'X-User-Id': authResult.data.userId, - }, - body: data, - }).then((res: Response) => res.json()); - if (deployResult.status === 'error') { - throw new Error(`Unknown error occurred while deploying ${JSON.stringify(deployResult)}`); - } else if (!deployResult.success) { - if (deployResult.status === 'compiler_error') { - throw new Error(`Deployment compiler errors: \n${ JSON.stringify(deployResult.messages, null, 2) }`); - } - throw new Error(`Deployment error: ${ deployResult.error }`); - } - }; - - // expects the `path` to start with the / -export const normalizeUrl = (url: string, path: string): string => { - return url.replace(/\/$/, '') + path; -}; - -export const getIgnoredFiles = async (fd: FolderDetails): Promise> => { - try { - if (await fd.doesFileExist(fd.mergeWithFolder('.rcappsconfig'))) { - const data = await fs.promises.readFile(fd.mergeWithFolder('.rcappsconfig'), 'utf-8'); - const parsedData = JSON.parse(data); - return parsedData.ignoredFiles; - } else { - return [ - '**/dist/**', - ]; - } - } catch (e) { - throw new Error(e && e.message ? e.message : e); - } -}; diff --git a/src/misc/diagnosticReport.ts b/src/misc/diagnosticReport.ts deleted file mode 100644 index 84b7f65..0000000 --- a/src/misc/diagnosticReport.ts +++ /dev/null @@ -1,89 +0,0 @@ -export class DiagnosticReport { - private _options = 0; - private _syntactic = 0; - private _global = 0; - private _semantic = 0; - private _declaration = 0; - private _emit = 0; - private _isValid: boolean; - - constructor() { - this._isValid = true; - } - - public get isValid(): boolean { - return this._isValid; - } - - public set options(count: number) { - this._options = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get options(): number { - return this._options; - } - - public set syntactic(count: number) { - this._syntactic = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get syntactic(): number { - return this._syntactic; - } - - public set global(count: number) { - this._global = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get global(): number { - return this._global; - } - - public set semantic(count: number) { - this._semantic = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get semantic(): number { - return this._semantic; - } - - public set declaration(count: number) { - this._declaration = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get declaration(): number { - return this._declaration; - } - - public set emit(count: number) { - this._emit = count; - - if (count > 0) { - this._isValid = false; - } - } - - public get emit(): number { - return this._emit; - } -} diff --git a/src/misc/folderDetails.ts b/src/misc/folderDetails.ts deleted file mode 100644 index aaa6f94..0000000 --- a/src/misc/folderDetails.ts +++ /dev/null @@ -1,209 +0,0 @@ -import Command from '@oclif/command'; -import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import chalk from 'chalk'; -import * as figures from 'figures'; -import * as fs from 'fs-extra'; -import * as path from 'path'; -import * as process from 'process'; -import { - coerce as coerceVersion, - diff as diffVersion, -} from 'semver'; -import * as tv4 from 'tv4'; - -import { appJsonSchema } from './appJsonSchema'; - -export class FolderDetails { - public folder: string; - public toZip: string; - public infoFile: string; - public mainFile: string; - public info: IAppInfo; - - constructor(private command: Command) { - this.setFolder(process.cwd()); - this.mainFile = ''; - this.info = {} as IAppInfo; - } - - public async doesFileExist(file: string): Promise { - return await fs.pathExists(file) && fs.statSync(file).isFile(); - } - - public mergeWithFolder(item: string): string { - return path.join(this.folder, item); - } - - public setFolder(folderPath: string): void { - this.folder = folderPath; - this.toZip = path.join(this.folder, '{,!(node_modules|test)/**/}*.*'); - this.infoFile = path.join(this.folder, 'app.json'); - } - - public setAppInfo(appInfo: IAppInfo): void { - this.info = appInfo; - } - - public generateDirectory(dirName: string): void { - const dirPath = path.join(this.folder, dirName); - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath); - } - } - - public generateEndpointClass(name: string, toWrite: string): void { - const dir = 'endpoints'; - const dirPath = path.join(this.folder, dir); - this.generateDirectory(dir); - fs.writeFileSync(path.join(dirPath, `${name}.ts`), toWrite, 'utf8'); - } - - public generateCommandClass(name: string, toWrite: string): void { - const dir = 'slashCommands'; - const dirPath = path.join(this.folder, dir); - this.generateDirectory(dir); - fs.writeFileSync(path.join(dirPath, `${name}.ts`), toWrite, 'utf8'); - } - - public readSettingsFile(): string { - return fs.readFileSync(path.join(this.folder, 'settings.ts'), 'utf-8'); - } - - public writeToSettingsFile(toWrite: string): void { - fs.writeFileSync(path.join(this.folder, 'settings.ts'), toWrite, 'utf-8'); - } - /** - * Validates the "app.json" file, loads it, and then retrieves the classFile property from it. - * Throws an error when something isn't right. - */ - public async readInfoFile(): Promise { - if (!(await this.doesFileExist(this.infoFile))) { - throw new Error('No App found to package. Missing an "app.json" file.'); - } - - try { - this.info = require(this.infoFile); - } catch (e) { - throw new Error('The "app.json" file is invalid.'); - } - - // This errors out if it fails - this.validateAppDotJson(); - - if (!this.info.classFile) { - throw new Error('Invalid "app.json" file. The "classFile" is required.'); - } - - this.mainFile = path.join(this.folder, this.info.classFile); - - if (!(await this.doesFileExist(this.mainFile))) { - throw new Error(`The specified classFile (${ this.mainFile }) does not exist.`); - } - } - - public async matchAppsEngineVersion(): Promise { - if (!this.info) { - throw new Error('App Manifest not loaded. Exiting...'); - } - - if (!await this.doesFileExist('package.json')) { - throw new Error('package.json not found. Exiting...'); - } - - const packageJson: Record = require(path.join(this.folder, 'package.json')); - const appsEngineEntry = packageJson.devDependencies['@rocket.chat/apps-engine'] as string; - const appsEngineVersion = appsEngineEntry.startsWith('file:') ? - require(path.join(appsEngineEntry.replace(/^file:/, ''), 'package.json')).version : - appsEngineEntry; - - if (diffVersion( - coerceVersion(appsEngineVersion), - coerceVersion(this.info.requiredApiVersion)) - ) { - - // tslint:disable-next-line:no-console - console.log(chalk.bgYellow('Warning:'), - chalk.yellow('Different versions of the Apps Engine were found between app.json (', - this.info.requiredApiVersion, - ') and package.json (', - appsEngineVersion, - ').', - '\nUpdating app.json to reflect the same version of Apps Engine from package.json')); - - await this.updateInfoFileRequiredVersion(appsEngineVersion); - } - } - - private validateAppDotJson(): void { - const result = tv4.validateMultiple(this.info, appJsonSchema); - - // We only care if the result is invalid, as it should pass successfully - if (!this.isValidResult(result)) { - this.reportFailed(result.errors.length, result.missing.length); - - result.errors.forEach((e: tv4.ValidationError) => this.reportError(e)); - result.missing.forEach((v: string) => this.reportMissing(v)); - - throw new Error('Invalid "app.json" file, please ensure it matches the schema. (TODO: insert link here)'); - } - } - - private isValidResult(result: tv4.MultiResult): boolean { - return result.valid && result.missing.length === 0; - } - - private reportFailed(errorCount: number, missingCount: number): void { - const results = []; - if (errorCount > 0) { - results.push(chalk.red(`${errorCount} validation error(s)`)); - } - - if (missingCount > 0) { - results.push(chalk.red(`${missingCount} missing schema(s)`)); - } - - this.command.log( - chalk.red(figures.cross), - chalk.cyan(this.infoFile), - results.length > 0 ? `has ${results.join(' and ')}` : '', - ); - } - - private reportError(error: tv4.ValidationError, indent = ' ') { - this.command.log( - indent, - chalk.red(`${figures.pointerSmall} Error:`), - error.message || 'No error message provided by validation module', - ); - - this.command.log( - indent, - ' at', - chalk.blue(error.dataPath || '/'), - 'against schema', - chalk.blue(error.schemaPath || '/'), - ); - - if (error.subErrors) { - error.subErrors.forEach((err) => this.reportError(err, `${indent} `)); - } - } - - private reportMissing(uri: string, indent = ' ') { - this.command.log( - indent, - chalk.red(`${figures.pointerSmall} Missing:`), - uri, - ); - } - - private async updateInfoFileRequiredVersion(requiredApiVersion: string): Promise { - const info = { - ...this.info, - requiredApiVersion, - }; - - await fs.writeFile(path.join(this.folder, 'app.json'), JSON.stringify(info), 'utf-8'); - await this.readInfoFile(); - } -} diff --git a/src/misc/index.ts b/src/misc/index.ts deleted file mode 100644 index b76b78d..0000000 --- a/src/misc/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AppCompiler } from './appCompiler'; -import { AppCreator } from './appCreator'; -import { appJsonSchema } from './appJsonSchema'; -import { AppPackager } from './appPackager'; -import { compilerOptions } from './compilerOptions'; -import { DiagnosticReport } from './diagnosticReport'; -import { FolderDetails } from './folderDetails'; -import { IAppCategory, INormalLoginInfo, IPersonalAccessTokenLoginInfo} from './interfaces'; -import { unicodeSymbols } from './unicodeSymbols'; -import { VariousUtils } from './variousUtils'; - -export { - IAppCategory, - INormalLoginInfo, - IPersonalAccessTokenLoginInfo, - appJsonSchema, - AppCreator, - AppPackager, - AppCompiler, - compilerOptions, - DiagnosticReport, - FolderDetails, - unicodeSymbols, - VariousUtils, -}; diff --git a/src/misc/interfaces.ts b/src/misc/interfaces.ts deleted file mode 100644 index 797bf7f..0000000 --- a/src/misc/interfaces.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface IAppCategory { - title: string; - description: string; - name: string; - value: string; -} -export interface INormalLoginInfo { - url: string; - username: string; - password: string; -} -export interface IPersonalAccessTokenLoginInfo { - url: string; - userId: string; - token: string; -} diff --git a/src/misc/unicodeSymbols.ts b/src/misc/unicodeSymbols.ts deleted file mode 100644 index 6cad7cf..0000000 --- a/src/misc/unicodeSymbols.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const unicodeSymbols = new Map([ - ['checkMark', '\u2713'], - ['heavyMultiplicationX', '\u2716'], - ['longRightwardsSquiggleArrow', '\u27ff'], -]); diff --git a/src/misc/variousUtils.ts b/src/misc/variousUtils.ts deleted file mode 100644 index 3b2a219..0000000 --- a/src/misc/variousUtils.ts +++ /dev/null @@ -1,48 +0,0 @@ -import fetch from 'fetch-with-proxy'; -import * as fs from 'fs'; - -import { IAppCategory } from './interfaces'; - -export class VariousUtils { - public static slugify = function _slugify(text: string): string { - return text - .toString() - .toLowerCase() - .replace(/^\s+|\s+$/g, '') - .replace(/\s+/g, '-') // Replace spaces with - - .replace(/[^\w-]+/g, '') // Remove all non-word chars - .replace(/--+/g, '-') // Replace multiple - with single - - .replace(/^-+/, '') // Trim - from start of text - .replace(/-+$/, ''); // Trim - from end of textte - }; - - public static getTsDefVersion = function _getTsDefVersion(): string { - const devLocation = - 'node_modules/@rocket.chat/apps-engine/package.json'; - - if (fs.existsSync(devLocation)) { - const info = JSON.parse(fs.readFileSync(devLocation, 'utf8')); - return ('^' + info.version) as string; - } - - return '^1.44.0'; - }; - - // tslint:disable:promise-function-async - public static async fetchCategories(): Promise> { - const cats = await fetch( - 'https://marketplace.rocket.chat/v1/categories', - ).then((res) => res.json()); - - const categories: Array = cats.map((c: any) => { - return { - title: c.title, - description: c.description, - name: c.title, - value: c.title, - }; - }); - - return categories; - } -} diff --git a/src/templates/app/editorConfigTemplate.ts b/src/templates/app/editorConfigTemplate.ts deleted file mode 100644 index ffd949f..0000000 --- a/src/templates/app/editorConfigTemplate.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const editorConfigTemplate = (): string => { - return `# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -indent_style = space -indent_size = 4 -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -trim_trailing_whitespace = false -`; -}; diff --git a/src/templates/app/gitIgnoreTemplate.ts b/src/templates/app/gitIgnoreTemplate.ts deleted file mode 100644 index a658658..0000000 --- a/src/templates/app/gitIgnoreTemplate.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const gitIgnoreTemplate = (): string => { - return `# ignore modules pulled in from npm -node_modules/ - -# rc-apps package output -dist/ - -# JetBrains IDEs -out/ -.idea/ -.idea_modules/ - -# macOS -.DS_Store -.AppleDouble -.LSOverride -._* -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk -`; -}; diff --git a/src/templates/app/index.ts b/src/templates/app/index.ts deleted file mode 100644 index 665c8ba..0000000 --- a/src/templates/app/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { editorConfigTemplate } from './editorConfigTemplate'; -import { gitIgnoreTemplate } from './gitIgnoreTemplate'; -import { mainTemplate } from './mainTemplate'; -import { packageJsonTemplate } from './packageJsonTemplate'; -import { readmeTemplate } from './readmeTemplate'; -import { tsConfigTemplate } from './tsConfigTemplate'; -import { tsLintConfigTemplate } from './tsLintConfigTemplate'; -import { vsCodeExtsTemplate } from './vsCodeExtsTemplate'; - -export { - mainTemplate, - readmeTemplate, - tsConfigTemplate, - tsLintConfigTemplate, - packageJsonTemplate, - gitIgnoreTemplate, - editorConfigTemplate, - vsCodeExtsTemplate, -}; diff --git a/src/templates/app/mainTemplate.ts b/src/templates/app/mainTemplate.ts deleted file mode 100644 index 415d094..0000000 --- a/src/templates/app/mainTemplate.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const mainTemplate = (appName: string): string => { -return `import { - IAppAccessors, - ILogger, -} from '@rocket.chat/apps-engine/definition/accessors'; -import { App } from '@rocket.chat/apps-engine/definition/App'; -import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; - -export class ${ appName }App extends App { - constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) { - super(info, logger, accessors); - } -} -`; -}; diff --git a/src/templates/app/packageJsonTemplate.ts b/src/templates/app/packageJsonTemplate.ts deleted file mode 100644 index 21116b3..0000000 --- a/src/templates/app/packageJsonTemplate.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const packageJsonTemplate = (): string => { - return `{ - "devDependencies": { - "@rocket.chat/apps-engine": "^1.44.0", - "@types/node": "14.14.6", - "tslint": "^5.10.0", - "typescript": "^5.6.2" - }, - "dependencies": { - "@rocket.chat/icons": "^0.38.0", - "@rocket.chat/ui-kit": "^0.36.1" - } -}`; -}; diff --git a/src/templates/app/readmeTemplate.ts b/src/templates/app/readmeTemplate.ts deleted file mode 100644 index c08da4c..0000000 --- a/src/templates/app/readmeTemplate.ts +++ /dev/null @@ -1,26 +0,0 @@ -// tslint:disable: max-line-length -export const readmeTemplate = (name: string, description: string): string => { - return `# ${ name } -${ description } - -## Getting Started -Now that you have generated a blank default Rocket.Chat App, what are you supposed to do next? -Start developing! Open up your favorite editor, our recommended one is Visual Studio code, -and start working on your App. Once you have something ready to test, you can either -package it up and manually deploy it to your test instance or you can use the CLI to do so. -Here are some commands to get started: -- \`rc-apps package\`: this command will generate a packaged app file (zip) which can be installed **if** it compiles with TypeScript -- \`rc-apps deploy\`: this will do what \`package\` does but will then ask you for your server url, username, and password to deploy it for you - -## Documentation -Here are some links to examples and documentation: -- [Rocket.Chat Apps TypeScript Definitions Documentation](https://rocketchat.github.io/Rocket.Chat.Apps-engine/) -- [Rocket.Chat Apps TypeScript Definitions Repository](https://github.com/RocketChat/Rocket.Chat.Apps-engine) -- [Example Rocket.Chat Apps](https://github.com/graywolf336/RocketChatApps) -- Community Forums - - [App Requests](https://forums.rocket.chat/c/rocket-chat-apps/requests) - - [App Guides](https://forums.rocket.chat/c/rocket-chat-apps/guides) - - [Top View of Both Categories](https://forums.rocket.chat/c/rocket-chat-apps) -- [#rocketchat-apps on Open.Rocket.Chat](https://open.rocket.chat/channel/rocketchat-apps) -`; -}; diff --git a/src/templates/app/tsConfigTemplate.ts b/src/templates/app/tsConfigTemplate.ts deleted file mode 100644 index 9983efb..0000000 --- a/src/templates/app/tsConfigTemplate.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const tsConfigTemplate = (): string => { - return `{ -"compilerOptions": { - "target": "es2017", - "module": "commonjs", - "moduleResolution": "node", - "declaration": false, - "noImplicitAny": false, - "removeComments": true, - "strictNullChecks": true, - "noImplicitReturns": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - }, -"include": [ - "**/*.ts" - ] -} -`; -}; diff --git a/src/templates/app/tsLintConfigTemplate.ts b/src/templates/app/tsLintConfigTemplate.ts deleted file mode 100644 index 0ddd4f8..0000000 --- a/src/templates/app/tsLintConfigTemplate.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const tsLintConfigTemplate = (): string => { -return `{ - "extends": "tslint:recommended", - "rules": { - "array-type": [true, "generic"], - "member-access": true, - "no-console": [false], - "no-duplicate-variable": true, - "object-literal-sort-keys": false, - "quotemark": [true, "single"], - "max-line-length": [true, { - "limit": 160, - "ignore-pattern": "^import | *export .*? {" - }] - } -} -`; -}; diff --git a/src/templates/app/vsCodeExtsTemplate.ts b/src/templates/app/vsCodeExtsTemplate.ts deleted file mode 100644 index a02400d..0000000 --- a/src/templates/app/vsCodeExtsTemplate.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const vsCodeExtsTemplate = (): string => { - return ` { - "recommendations": [ - "EditorConfig.editorconfig", - "eamodio.gitlens", - "eg2.vscode-npm-script", - "wayou.vscode-todo-highlight", - "minhthai.vscode-todo-parser", - "ms-vscode.vscode-typescript-tslint-plugin", - "rbbit.typescript-hero" - ] -} -`; -}; diff --git a/src/templates/boilerplate/apiEndpoint.ts b/src/templates/boilerplate/apiEndpoint.ts deleted file mode 100644 index 3e5366f..0000000 --- a/src/templates/boilerplate/apiEndpoint.ts +++ /dev/null @@ -1,43 +0,0 @@ -import pascalCase = require('pascal-case'); - -export const apiEndpointTemplate = (endpointClassName: string, path: string): string => { -return ` -import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { ApiEndpoint, IApiEndpointInfo, IApiRequest, IApiResponse } from '@rocket.chat/apps-engine/definition/api'; - -export class ${pascalCase(endpointClassName)} extends ApiEndpoint { - public path = '${path}'; - public example = []; - - public async get(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public async head(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public async options(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public async patch(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public post(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public put(request: IApiRequest, endpoint: IApiEndpointInfo, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } -} -`; -}; diff --git a/src/templates/boilerplate/index.ts b/src/templates/boilerplate/index.ts deleted file mode 100644 index ed8592c..0000000 --- a/src/templates/boilerplate/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { apiEndpointTemplate } from './apiEndpoint'; -import { appendNewSetting, initialSettingTemplate } from './setting'; -import { slashCommandTemplate } from './slashCommand'; - -export { - apiEndpointTemplate, - appendNewSetting, - initialSettingTemplate, - slashCommandTemplate, -}; diff --git a/src/templates/boilerplate/setting.ts b/src/templates/boilerplate/setting.ts deleted file mode 100644 index baa65b3..0000000 --- a/src/templates/boilerplate/setting.ts +++ /dev/null @@ -1,24 +0,0 @@ - -export const initialSettingTemplate = (): string => { - return ` -import { ISetting, SettingType } from '@rocket.chat/apps-engine/definition/settings'; -export const settings: Array = [ -]; -`; -}; - -export const appendNewSetting = (data: string): string => { - const toWrite = ` -{ - id: '', - type: SettingType.STRING, - packageValue: '', - required: false, - public: false, - i18nLabel: '', - i18nDescription: '', -}, -`; - const index = data.lastIndexOf('];'); - return data.slice(0, index) + toWrite + data.slice(index); -}; diff --git a/src/templates/boilerplate/slashCommand.ts b/src/templates/boilerplate/slashCommand.ts deleted file mode 100644 index 0bb54ea..0000000 --- a/src/templates/boilerplate/slashCommand.ts +++ /dev/null @@ -1,32 +0,0 @@ -import pascalCase = require('pascal-case'); - -export const slashCommandTemplate = (commandName: string): string => { - return ` -import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { ISlashCommand, ISlashCommandPreview, - ISlashCommandPreviewItem, SlashCommandContext } from '@rocket.chat/apps-engine/definition/slashcommands'; - -export class ${pascalCase(commandName)} implements ISlashCommand { - public command = ''; - public i18nDescription = ''; - public i18nParamsExample = ''; - public permission = ''; - public providesPreview = false; - - public async executePreviewItem(item: ISlashCommandPreviewItem, context: SlashCommandContext, - read: IRead, modify: IModify, http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public async executor(context: SlashCommandContext,read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } - - public async previewer(context: SlashCommandContext, read: IRead, modify: IModify, - http: IHttp, persis: IPersistence): Promise { - throw new Error('Method not implemented'); - } -} -`; -}; diff --git a/src/typings/fetch-with-proxy/index.d.ts b/src/typings/fetch-with-proxy/index.d.ts deleted file mode 100644 index be388c5..0000000 --- a/src/typings/fetch-with-proxy/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module "fetch-with-proxy" { - export default function fetch(url: any, options?: any): Promise; -} diff --git a/src/utils/files.ts b/src/utils/files.ts new file mode 100644 index 0000000..4c627de --- /dev/null +++ b/src/utils/files.ts @@ -0,0 +1,42 @@ +import { Dirent } from 'fs'; +import { mkdir, readdir, readFile, writeFile } from 'fs/promises'; +import path from 'path'; + +export async function ensureDirectory(directoryPath: string): Promise { + await mkdir(directoryPath, { recursive: true }); +} + +export async function writeJsonFile(filePath: string, value: unknown): Promise { + const content = `${JSON.stringify(value, null, 2)}\n`; + await writeFile(filePath, content, 'utf8'); +} + +export async function readJsonFile(filePath: string): Promise { + const content = await readFile(filePath, 'utf8'); + return JSON.parse(content) as T; +} + +export async function walkFiles(root: string): Promise { + const results: string[] = []; + + async function walk(currentPath: string): Promise { + const entries = (await readdir(currentPath, { withFileTypes: true })) as Dirent[]; + + for (const entry of entries) { + const absolutePath = path.join(currentPath, entry.name); + + if (entry.isDirectory()) { + await walk(absolutePath); + continue; + } + + if (entry.isFile()) { + results.push(absolutePath); + } + } + } + + await walk(root); + + return results; +} diff --git a/src/utils/glob.ts b/src/utils/glob.ts new file mode 100644 index 0000000..aacff1d --- /dev/null +++ b/src/utils/glob.ts @@ -0,0 +1,48 @@ +import { normalizePathForMatch } from './strings'; + +function escapeRegexCharacter(value: string): string { + return /[|\\{}()[\]^$+?.]/.test(value) ? `\\${value}` : value; +} + +export function globToRegex(pattern: string): RegExp { + const normalized = normalizePathForMatch(pattern); + let regex = ''; + + for (let index = 0; index < normalized.length; index += 1) { + const char = normalized[index]; + + if (char === '*') { + const nextChar = normalized[index + 1]; + + if (nextChar === '*') { + const nextNextChar = normalized[index + 2]; + + if (nextNextChar === '/') { + // `**/` should match zero or more path segments. + regex += '(?:.*/)?'; + index += 2; + } else { + regex += '.*'; + index += 1; + } + } else { + regex += '[^/]*'; + } + + continue; + } + + regex += escapeRegexCharacter(char); + } + + return new RegExp(`^${regex}$`); +} + +export function buildGlobMatcher(patterns: string[]): (candidate: string) => boolean { + const regexes = patterns.map((pattern) => globToRegex(pattern)); + + return (candidate: string) => { + const normalized = normalizePathForMatch(candidate); + return regexes.some((regex) => regex.test(normalized)); + }; +} diff --git a/src/utils/output.ts b/src/utils/output.ts new file mode 100644 index 0000000..30a0509 --- /dev/null +++ b/src/utils/output.ts @@ -0,0 +1,54 @@ +type ColorName = 'blue' | 'green' | 'yellow' | 'red' | 'gray'; + +let chalkRef: any; + +try { + // Optional runtime dependency: fall back to plain text if missing. + // eslint-disable-next-line @typescript-eslint/no-var-requires + const chalkModule = require('chalk'); + chalkRef = chalkModule.default ?? chalkModule; +} catch { + chalkRef = undefined; +} + +function colorize(color: ColorName, value: string): string { + const fn = chalkRef && typeof chalkRef[color] === 'function' ? chalkRef[color] : undefined; + return fn ? fn(value) : value; +} + +function bold(value: string): string { + const fn = chalkRef && chalkRef.bold; + return typeof fn === 'function' ? fn(value) : value; +} + +export function step(message: string): void { + console.log(`${colorize('blue', '[*]')} ${message}`); +} + +export function success(message: string): void { + console.log(`${colorize('green', '[+]')} ${message}`); +} + +export function warn(message: string): void { + console.warn(`${colorize('yellow', '[!]')} ${message}`); +} + +export function failure(message: string): void { + console.error(`${colorize('red', '[-]')} ${message}`); +} + +export function info(message: string): void { + console.log(message); +} + +export function verbose(enabled: boolean, message: string): void { + if (!enabled) { + return; + } + + console.log(`${colorize('gray', '[v]')} ${message}`); +} + +export function heading(message: string): void { + console.log(bold(message)); +} diff --git a/src/utils/prompt.ts b/src/utils/prompt.ts new file mode 100644 index 0000000..99865c6 --- /dev/null +++ b/src/utils/prompt.ts @@ -0,0 +1,21 @@ +import readline from 'readline'; +import { stdin as input, stdout as output } from 'process'; + +export async function prompt(question: string, defaultValue?: string): Promise { + const rl = readline.createInterface({ input, output }); + + try { + const suffix = defaultValue ? ` (${defaultValue})` : ''; + const response = await new Promise((resolve) => { + rl.question(`${question}${suffix}: `, (answer) => resolve(answer.trim())); + }); + + if (!response && defaultValue) { + return defaultValue; + } + + return response; + } finally { + rl.close(); + } +} diff --git a/src/utils/strings.ts b/src/utils/strings.ts new file mode 100644 index 0000000..7d45a5b --- /dev/null +++ b/src/utils/strings.ts @@ -0,0 +1,38 @@ +export function slugify(value: string): string { + return value + .trim() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/g, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); +} + +export function toManifestSlug(value: string): string { + return value + .trim() + .toLowerCase() + .replace(/[^a-z]+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); +} + +export function toPascalCase(value: string): string { + const cleaned = value + .replace(/[^a-zA-Z0-9]+/g, ' ') + .trim() + .split(/\s+/) + .filter(Boolean) + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); + + if (!cleaned) { + return 'RocketChat'; + } + + return /^[0-9]/.test(cleaned) ? `App${cleaned}` : cleaned; +} + +export function normalizePathForMatch(pathValue: string): string { + return pathValue.replace(/\\/g, '/'); +} diff --git a/test/command-create.test.ts b/test/command-create.test.ts new file mode 100644 index 0000000..04f9131 --- /dev/null +++ b/test/command-create.test.ts @@ -0,0 +1,376 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const childProcess = require('node:child_process'); +const { access, mkdir, readFile, writeFile } = require('node:fs/promises'); + +const promptModule = require('../lib/utils/prompt.js'); +const { CliError } = require('../lib/core/errors.js'); +const { createTempDir, patch, removeTempDir, requireFresh } = require('./helpers.ts'); + +test('create command scaffolds app with skip-install and detected apps-engine version', async () => { + const root = await createTempDir(); + + try { + await mkdir(path.join(root, 'workspace'), { recursive: true }); + await writeFile( + path.join(root, 'workspace', 'package.json'), + JSON.stringify({ dependencies: { '@rocket.chat/apps-engine': '^9.9.9' } }, null, 2), + 'utf8', + ); + + const { createCommand } = requireFresh('../lib/commands/create.js'); + await createCommand.run( + [ + 'temp-app', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: path.join(root, 'workspace') }, + ); + + const appDir = path.join(root, 'workspace', 'temp-app'); + await access(path.join(appDir, 'app.json')); + await access(path.join(appDir, 'TempApp.ts')); + await access(path.join(appDir, 'icon.png')); + + const appClass = await readFile(path.join(appDir, 'TempApp.ts'), 'utf8'); + const packageJson = await readFile(path.join(appDir, 'package.json'), 'utf8'); + assert.equal(appClass.includes('const endpoints: IApiEndpoint[] = ['), true); + assert.equal(appClass.includes('const slashCommands: ISlashCommand[] = ['), true); + assert.equal(appClass.includes('const appSettings: ISetting[] = ['), true); + assert.equal(packageJson.includes('"@rocket.chat/apps-engine": "^9.9.9"'), true); + assert.equal(packageJson.includes('"@rocket.chat/ui-kit"'), true); + } finally { + await removeTempDir(root); + } +}); + +test('create command detects apps-engine version from devDependencies', async () => { + const root = await createTempDir(); + + try { + await writeFile( + path.join(root, 'package.json'), + JSON.stringify({ devDependencies: { '@rocket.chat/apps-engine': '^8.8.8' } }, null, 2), + 'utf8', + ); + + const { createCommand } = requireFresh('../lib/commands/create.js'); + await createCommand.run( + [ + 'temp-app', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ); + + const packageJson = await readFile(path.join(root, 'temp-app', 'package.json'), 'utf8'); + assert.equal(packageJson.includes('"@rocket.chat/apps-engine": "^8.8.8"'), true); + } finally { + await removeTempDir(root); + } +}); + +test('create command keeps folder slug while enforcing schema-safe app.json nameSlug', async () => { + const root = await createTempDir(); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await createCommand.run( + [ + 'app 2', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ); + + const appDir = path.join(root, 'app-2'); + const manifest = JSON.parse(await readFile(path.join(appDir, 'app.json'), 'utf8')) as { nameSlug: string }; + const packageJson = JSON.parse(await readFile(path.join(appDir, 'package.json'), 'utf8')) as { name: string }; + assert.equal(manifest.nameSlug, 'app'); + assert.equal(packageJson.name, 'app-2'); + } finally { + await removeTempDir(root); + } +}); + +test('create command rejects existing target directory without --force', async () => { + const root = await createTempDir(); + + try { + await mkdir(path.join(root, 'temp-app'), { recursive: true }); + const { createCommand } = requireFresh('../lib/commands/create.js'); + + await assert.rejects( + () => + createCommand.run( + [ + 'temp-app', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ), + /Directory already exists/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('create command rejects --force when target path exists as a file', async () => { + const root = await createTempDir(); + + try { + await writeFile(path.join(root, 'temp-app'), 'not-a-directory', 'utf8'); + const { createCommand } = requireFresh('../lib/commands/create.js'); + + await assert.rejects( + () => + createCommand.run( + [ + 'temp-app', + '--force', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ), + /Path exists and is not a directory/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('create command with --force clears existing directory contents before scaffolding', async () => { + const root = await createTempDir(); + + try { + const appDir = path.join(root, 'temp-app'); + await mkdir(path.join(appDir, 'stale-dir'), { recursive: true }); + await writeFile(path.join(appDir, 'stale.txt'), 'stale', 'utf8'); + await writeFile(path.join(appDir, 'stale-dir', 'old.txt'), 'old', 'utf8'); + + const { createCommand } = requireFresh('../lib/commands/create.js'); + await createCommand.run( + [ + 'temp-app', + '--force', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ); + + await access(path.join(appDir, 'app.json')); + await assert.rejects(() => access(path.join(appDir, 'stale.txt'))); + await assert.rejects(() => access(path.join(appDir, 'stale-dir', 'old.txt'))); + } finally { + await removeTempDir(root); + } +}); + +test('create command rejects empty app name from prompt', async () => { + const root = await createTempDir(); + const restorePrompt = patch(promptModule, 'prompt', async () => ' '); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await assert.rejects( + () => createCommand.run([], { cwd: root }), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message, 'App name is required.'); + return true; + }, + ); + } finally { + restorePrompt(); + await removeTempDir(root); + } +}); + +test('create command rejects names without letters for app.json nameSlug', async () => { + const root = await createTempDir(); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await assert.rejects( + () => + createCommand.run( + [ + '1234', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ), + /App name must include at least one letter for app.json nameSlug/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('create command rejects names without letters or numbers for folder slug', async () => { + const root = await createTempDir(); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await assert.rejects( + () => + createCommand.run( + [ + '!!!', + '--skip-install', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ), + /App name must include at least one letter or number/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('create command surfaces npm install failures when --skip-install is not used', async () => { + const root = await createTempDir(); + const restoreExec = patch( + childProcess, + 'execFile', + (_cmd: unknown, _args: unknown, _options: unknown, callback: (error: Error | null) => void) => callback(new Error('fail')), + ); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await assert.rejects( + () => + createCommand.run( + [ + 'temp-app', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ), + /Failed to run npm install for the generated app/, + ); + } finally { + restoreExec(); + await removeTempDir(root); + } +}); + +test('create command runs npm install successfully when enabled', async () => { + const root = await createTempDir(); + let installCall: { cmd: string; args: string[]; options: { cwd?: string } } | undefined; + const restoreExec = patch( + childProcess, + 'execFile', + (cmd: unknown, args: unknown, options: unknown, callback: (error: Error | null) => void) => { + installCall = { + cmd: String(cmd), + args: Array.isArray(args) ? args.map((arg) => String(arg)) : [], + options: typeof options === 'object' && options !== null ? (options as { cwd?: string }) : {}, + }; + callback(null); + }, + ); + + try { + const { createCommand } = requireFresh('../lib/commands/create.js'); + await createCommand.run( + [ + 'installed-app', + '--description', + 'desc', + '--author', + 'author', + '--support', + 'support@example.com', + '--homepage', + 'https://example.com', + ], + { cwd: root }, + ); + + if (!installCall) { + throw new Error('Expected npm install call.'); + } + + assert.equal(installCall.args.join(' '), 'install'); + assert.equal(typeof installCall.options.cwd === 'string', true); + assert.equal(installCall.options.cwd?.endsWith(path.join(root, 'installed-app')), true); + } finally { + restoreExec(); + await removeTempDir(root); + } +}); diff --git a/test/command-deploy.test.ts b/test/command-deploy.test.ts new file mode 100644 index 0000000..ded0430 --- /dev/null +++ b/test/command-deploy.test.ts @@ -0,0 +1,188 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const compiler = require('../lib/core/compiler.js'); +const deployCore = require('../lib/core/deploy.js'); +const envCore = require('../lib/core/env.js'); +const projectCore = require('../lib/core/project.js'); +const output = require('../lib/utils/output.js'); +const { deployCommand } = require('../lib/commands/deploy.js'); +const { patchMany } = require('./helpers.ts'); + +test('deploy command runs full deploy pipeline and shows warnings', async () => { + const calls: Array<['warn' | 'step' | 'success' | 'verbose', string]> = []; + let validatedConfig: Record | undefined; + let uploadZipPath: string | undefined; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { + obj: projectCore, + key: 'loadConfigFile', + value: async () => ({ + config: { allowHttp: true }, + legacyFields: ['url', 'username'], + }), + }, + { obj: envCore, key: 'loadDeployConfigFromEnv', value: () => ({ token: 'env-token', userId: 'env-user' }) }, + { + obj: deployCore, + key: 'validateDeployCredentials', + value: (config: unknown) => { + validatedConfig = config as Record; + }, + }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({ version: '8.1' }) }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { + obj: deployCore, + key: 'uploadApp', + value: async (_config: unknown, _project: unknown, zipPath: unknown) => { + uploadZipPath = String(zipPath); + return { mode: 'update' }; + }, + }, + { obj: output, key: 'warn', value: (message: string) => { calls.push(['warn', message]); } }, + { obj: output, key: 'step', value: (message: string) => { calls.push(['step', message]); } }, + { obj: output, key: 'success', value: (message: string) => { calls.push(['success', message]); } }, + { obj: output, key: 'verbose', value: (_enabled: boolean, message: string) => { calls.push(['verbose', message]); } }, + ]); + + try { + await deployCommand.run(['--experimental-native-compiler', '--verbose'], { cwd: '/project' }); + + assert.equal(validatedConfig?.token, 'env-token'); + assert.equal(validatedConfig?.userId, 'env-user'); + assert.equal(validatedConfig?.allowHttp, true); + assert.equal(uploadZipPath, '/project/dist/a_1.0.0.zip'); + assert.equal(calls.some(([type, message]) => type === 'warn' && message.includes('--experimental-native-compiler')), true); + assert.equal(calls.some(([type, message]) => type === 'warn' && message.includes('Ignoring legacy .rcappsconfig field')), true); + assert.equal(calls.some(([type, message]) => type === 'success' && message.includes('Deployment finished (update).')), true); + } finally { + restore(); + } +}); + +test('deploy command preserves allow-http and update from config/env when flags are not provided', async () => { + let validatedConfig: Record | undefined; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: { allowHttp: true, update: true }, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { + obj: deployCore, + key: 'validateDeployCredentials', + value: (config: unknown) => { + validatedConfig = config as Record; + }, + }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'create' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + ]); + + try { + await deployCommand.run([], { cwd: '/project' }); + assert.equal(validatedConfig?.allowHttp, true); + assert.equal(validatedConfig?.update, true); + } finally { + restore(); + } +}); + +test('deploy command applies allow-http and update when flags are provided', async () => { + let validatedConfig: Record | undefined; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: { allowHttp: false, update: false }, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { + obj: deployCore, + key: 'validateDeployCredentials', + value: (config: unknown) => { + validatedConfig = config as Record; + }, + }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + ]); + + try { + await deployCommand.run(['--allow-http', '--update'], { cwd: '/project' }); + assert.equal(validatedConfig?.allowHttp, true); + assert.equal(validatedConfig?.update, true); + } finally { + restore(); + } +}); + +test('deploy command passes legacy compiler switch to build step', async () => { + let compilerOptions: { force: boolean; verbose: boolean; useNativeCompiler: boolean } | undefined; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { + obj: compiler, + key: 'buildAndPackage', + value: async (_project: unknown, options: unknown) => { + compilerOptions = options as { force: boolean; verbose: boolean; useNativeCompiler: boolean }; + return 'dist/a_1.0.0.zip'; + }, + }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'create' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + ]); + + try { + await deployCommand.run(['--legacy-compiler'], { cwd: '/project' }); + assert.deepEqual(compilerOptions, { force: false, verbose: false, useNativeCompiler: false }); + } finally { + restore(); + } +}); diff --git a/test/command-env.test.ts b/test/command-env.test.ts new file mode 100644 index 0000000..e527f01 --- /dev/null +++ b/test/command-env.test.ts @@ -0,0 +1,20 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { envCommand } = require('../lib/commands/env.js'); +const { captureConsole } = require('./helpers.ts'); + +test('env command prints supported variables and precedence', async () => { + const { calls, restore } = captureConsole(); + + try { + await envCommand.run([], { cwd: process.cwd() }); + } finally { + restore(); + } + + const text = calls.log.join('\n'); + assert.equal(text.includes('Environment Variables'), true); + assert.equal(text.includes('RC_APPS_URL'), true); + assert.equal(text.includes('Precedence: CLI flags > environment variables > .rcappsconfig'), true); +}); diff --git a/test/command-generate.test.ts b/test/command-generate.test.ts new file mode 100644 index 0000000..ae8e9a4 --- /dev/null +++ b/test/command-generate.test.ts @@ -0,0 +1,233 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const { mkdir, readFile, writeFile } = require('node:fs/promises'); + +const promptModule = require('../lib/utils/prompt.js'); +const { generateCommand } = require('../lib/commands/generate.js'); +const { CliError } = require('../lib/core/errors.js'); +const { captureConsole, createTempDir, patch, removeTempDir } = require('./helpers.ts'); + +const DEFAULT_APP_CLASS_SOURCE = `import { + IAppAccessors, + IConfigurationExtend, + IEnvironmentRead, + ILogger, +} from '@rocket.chat/apps-engine/definition/accessors'; +import { ApiSecurity, ApiVisibility, IApiEndpoint } from '@rocket.chat/apps-engine/definition/api'; +import { App as RcApp } from '@rocket.chat/apps-engine/definition/App'; +import { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; +import { ISetting } from '@rocket.chat/apps-engine/definition/settings'; +import { ISlashCommand } from '@rocket.chat/apps-engine/definition/slashcommands'; + +export class App extends RcApp { + constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) { + super(info, logger, accessors); + } + + protected async extendConfiguration( + configuration: IConfigurationExtend, + _environmentRead: IEnvironmentRead, + ): Promise { + const endpoints: IApiEndpoint[] = [ + // rc-apps:api-endpoints + ]; + + if (endpoints.length > 0) { + await configuration.api.provideApi({ + visibility: ApiVisibility.PUBLIC, + security: ApiSecurity.UNSECURE, + endpoints, + }); + } + + const slashCommands: ISlashCommand[] = [ + // rc-apps:slash-commands + ]; + + for (const slashCommand of slashCommands) { + await configuration.slashCommands.provideSlashCommand(slashCommand); + } + + const appSettings: ISetting[] = [ + // rc-apps:settings + ]; + + for (const setting of appSettings) { + await configuration.settings.provideSetting(setting); + } + } +}`; + +async function createProject(root: string, appClassSource = DEFAULT_APP_CLASS_SOURCE): Promise { + await mkdir(path.join(root, 'src'), { recursive: true }); + await writeFile( + path.join(root, 'app.json'), + JSON.stringify( + { + id: 'id', + name: 'name', + nameSlug: 'name', + version: '1.0.0', + requiredApiVersion: '^1.0.0', + description: 'desc', + author: { name: 'n', support: 's' }, + classFile: 'src/App.ts', + iconFile: 'icon.png', + }, + null, + 2, + ), + 'utf8', + ); + await writeFile(path.join(root, 'src', 'App.ts'), appClassSource, 'utf8'); + await writeFile(path.join(root, 'icon.png'), '', 'utf8'); +} + +test('generate command creates endpoint and slash-command files', async () => { + const root = await createTempDir(); + + try { + await createProject(root); + await generateCommand.run(['endpoint', 'my endpoint', '--path', '/api-x'], { cwd: root }); + await generateCommand.run(['slash-command', 'my slash'], { cwd: root }); + + const endpoint = await readFile(path.join(root, 'endpoints', 'MyEndpoint.ts'), 'utf8'); + const slash = await readFile(path.join(root, 'slashCommands', 'MySlash.ts'), 'utf8'); + const appClass = await readFile(path.join(root, 'src', 'App.ts'), 'utf8'); + assert.equal(endpoint.includes("public path = '/api-x';"), true); + assert.equal(slash.includes("public command = 'myslash';"), true); + assert.equal(endpoint.includes("from '@rocket.chat/apps-engine/definition/api';"), true); + assert.equal(appClass.includes("import { MyEndpoint } from '../endpoints/MyEndpoint';"), true); + assert.equal(appClass.includes("import { MySlash } from '../slashCommands/MySlash';"), true); + assert.equal(appClass.includes('await configuration.api.provideApi({'), true); + assert.equal(appClass.includes('new MyEndpoint(),'), true); + assert.equal(appClass.includes('new MySlash(),'), true); + } finally { + await removeTempDir(root); + } +}); + +test('generate command creates and appends settings', async () => { + const root = await createTempDir(); + + try { + await createProject(root); + await generateCommand.run(['setting', 'first_setting'], { cwd: root }); + await generateCommand.run(['setting', 'second_setting'], { cwd: root }); + + const settings = await readFile(path.join(root, 'settings.ts'), 'utf8'); + const appClass = await readFile(path.join(root, 'src', 'App.ts'), 'utf8'); + assert.equal(settings.includes("id: 'first_setting'"), true); + assert.equal(settings.includes("id: 'second_setting'"), true); + assert.equal(appClass.includes("import { settings } from '../settings';"), true); + assert.equal(appClass.includes('...settings,'), true); + } finally { + await removeTempDir(root); + } +}); + +test('generate command uses prompts when values are missing', async () => { + const root = await createTempDir(); + const answers = ['Prompt Endpoint', '/prompt']; + const restorePrompt = patch(promptModule, 'prompt', async () => answers.shift()); + + try { + await createProject(root); + await generateCommand.run(['endpoint'], { cwd: root }); + const endpoint = await readFile(path.join(root, 'endpoints', 'PromptEndpoint.ts'), 'utf8'); + assert.equal(endpoint.includes("public path = '/prompt';"), true); + } finally { + restorePrompt(); + await removeTempDir(root); + } +}); + +test('generate command rejects missing and unknown targets', async () => { + const root = await createTempDir(); + + try { + await createProject(root); + + await assert.rejects( + () => generateCommand.run([], { cwd: root }), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message.includes('Select what to generate'), true); + return true; + }, + ); + + await assert.rejects( + () => generateCommand.run(['unknown'], { cwd: root }), + /Unknown generate target: unknown/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('generate command warns when app class does not have rc-apps markers', async () => { + const root = await createTempDir(); + const consoleCapture = captureConsole(); + + try { + await createProject(root, 'export class App extends Object {}'); + await generateCommand.run(['endpoint', 'broken', '--path', '/broken'], { cwd: root }); + + const endpoint = await readFile(path.join(root, 'endpoints', 'Broken.ts'), 'utf8'); + assert.equal(endpoint.includes("public path = '/broken';"), true); + assert.equal( + consoleCapture.calls.warn.some((entry: string) => entry.includes('Auto-registration skipped for generated endpoint')), + true, + ); + } finally { + consoleCapture.restore(); + await removeTempDir(root); + } +}); + +test('generate command errors when class declaration cannot be located', async () => { + const root = await createTempDir(); + + try { + await createProject(root, 'const broken = {};'); + await assert.rejects( + () => generateCommand.run(['endpoint', 'broken', '--path', '/broken'], { cwd: root }), + /Unable to locate app class declaration for generated registration/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('generate command errors when registration markers are malformed', async () => { + const root = await createTempDir(); + + try { + await createProject( + root, + `export class App { + protected async extendConfiguration(): Promise { + const endpoints = [ +// rc-apps:api-endpoints + ]; + const slashCommands = [ +// rc-apps:slash-commands + ]; + const appSettings = [ +// rc-apps:settings + ]; + } +}`, + ); + + await assert.rejects( + () => generateCommand.run(['endpoint', 'broken', '--path', '/broken'], { cwd: root }), + /Unable to locate generated marker/, + ); + } finally { + await removeTempDir(root); + } +}); diff --git a/test/command-package.test.ts b/test/command-package.test.ts new file mode 100644 index 0000000..60f4151 --- /dev/null +++ b/test/command-package.test.ts @@ -0,0 +1,149 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const compiler = require('../lib/core/compiler.js'); +const project = require('../lib/core/project.js'); +const sourcePackager = require('../lib/core/source-packager.js'); +const output = require('../lib/utils/output.js'); +const { CliError } = require('../lib/core/errors.js'); +const { packageCommand } = require('../lib/commands/package.js'); +const { patchMany } = require('./helpers.ts'); + +test('package command uses compiler by default and supports legacy compiler mode', async () => { + let buildArgs: { force: boolean; verbose: boolean; useNativeCompiler: boolean } | undefined; + const calls: Array<['step' | 'success' | 'warn' | 'verbose', string]> = []; + + const restore = patchMany([ + { + obj: project, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { nameSlug: 'a', version: '1.0.0' } }), + }, + { + obj: compiler, + key: 'buildAndPackage', + value: async (_project: unknown, options: unknown) => { + buildArgs = options as { force: boolean; verbose: boolean; useNativeCompiler: boolean }; + return 'dist/a_1.0.0.zip'; + }, + }, + { + obj: sourcePackager, + key: 'packageSource', + value: async () => { + throw new Error('should not call source packager'); + }, + }, + { obj: output, key: 'step', value: (message: string) => { calls.push(['step', message]); } }, + { obj: output, key: 'success', value: (message: string) => { calls.push(['success', message]); } }, + { obj: output, key: 'warn', value: (message: string) => { calls.push(['warn', message]); } }, + { obj: output, key: 'verbose', value: (_enabled: boolean, message: string) => { calls.push(['verbose', message]); } }, + ]); + + try { + await packageCommand.run(['--verbose', '--legacy-compiler'], { cwd: '/project' }); + assert.deepEqual(buildArgs, { force: false, verbose: true, useNativeCompiler: false }); + assert.equal(calls.some(([type, message]) => type === 'success' && message.includes('/project/dist/a_1.0.0.zip')), true); + } finally { + restore(); + } +}); + +test('package command supports --no-compile and warns for deprecated flags', async () => { + let sourceCalled = false; + const warnings: string[] = []; + + const restore = patchMany([ + { + obj: project, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { nameSlug: 'a', version: '1.0.0' } }), + }, + { + obj: sourcePackager, + key: 'packageSource', + value: async () => { + sourceCalled = true; + return 'dist/a_1.0.0.zip'; + }, + }, + { + obj: compiler, + key: 'buildAndPackage', + value: async () => { + throw new Error('should not call compiler'); + }, + }, + { obj: output, key: 'warn', value: (message: string) => { warnings.push(message); } }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + ]); + + try { + await packageCommand.run(['--no-compile', '--legacy-compiler', '--experimental-native-compiler'], { cwd: '/project' }); + assert.equal(sourceCalled, true); + assert.equal(warnings.some((msg) => msg.includes('--experimental-native-compiler')), true); + assert.equal(warnings.some((msg) => msg.includes('Ignoring --legacy-compiler because --no-compile was provided')), true); + } finally { + restore(); + } +}); + +test('package command rejects zip paths outside project root', async () => { + const restore = patchMany([ + { + obj: project, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: compiler, key: 'buildAndPackage', value: async () => '../outside.zip' }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { obj: output, key: 'warn', value: () => {} }, + ]); + + try { + await assert.rejects( + () => packageCommand.run([], { cwd: '/project' }), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message, 'Unexpected zip output path.'); + return true; + }, + ); + } finally { + restore(); + } +}); + +test('package command rejects root-prefix sibling paths outside project root', async () => { + const restore = patchMany([ + { + obj: project, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: compiler, key: 'buildAndPackage', value: async () => '../../project-other/dist/a.zip' }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { obj: output, key: 'warn', value: () => {} }, + ]); + + try { + await assert.rejects( + () => packageCommand.run([], { cwd: '/project' }), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message, 'Unexpected zip output path.'); + return true; + }, + ); + } finally { + restore(); + } +}); diff --git a/test/command-watch.test.ts b/test/command-watch.test.ts new file mode 100644 index 0000000..d2cac40 --- /dev/null +++ b/test/command-watch.test.ts @@ -0,0 +1,478 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const { EventEmitter } = require('node:events'); +const { mkdir, rm, writeFile } = require('node:fs/promises'); + +const compiler = require('../lib/core/compiler.js'); +const deployCore = require('../lib/core/deploy.js'); +const envCore = require('../lib/core/env.js'); +const projectCore = require('../lib/core/project.js'); +const output = require('../lib/utils/output.js'); +const { watchCommand } = require('../lib/commands/watch.js'); +const { createTempDir, patchMany, removeTempDir } = require('./helpers.ts'); + +type WatchEventHandler = (eventType: string, fileName: string | Buffer | null) => void; +type FakeWatcher = import('node:events').EventEmitter & { close: () => void }; + +async function waitForSigintListenerIncrease(initialCount: number): Promise { + for (let attempt = 0; attempt < 50; attempt += 1) { + if (process.listenerCount('SIGINT') > initialCount) { + return; + } + + await new Promise((resolve) => setTimeout(resolve, 2)); + } + + throw new Error('Timed out waiting for SIGINT listener registration.'); +} + +test('watch command handles deprecated flag, watcher events, queueing, and exits on SIGINT', async () => { + let uploadCount = 0; + let buildCount = 0; + let releaseSecondBuild: (() => void) | undefined; + let clearTimeoutCount = 0; + let watchCallback: WatchEventHandler | undefined; + const fakeWatcher = new EventEmitter() as FakeWatcher; + fakeWatcher.close = () => {}; + + const originalClearTimeout = global.clearTimeout; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: ['token'] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => ['**/dist/**'] }, + { + obj: compiler, + key: 'buildAndPackage', + value: async () => { + buildCount += 1; + + if (buildCount === 2) { + await new Promise((resolve) => { + releaseSecondBuild = () => resolve(); + }); + } + + return 'dist/a_1.0.0.zip'; + }, + }, + { + obj: deployCore, + key: 'uploadApp', + value: async () => { + uploadCount += 1; + return { mode: 'update' }; + }, + }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { + obj: fs, + key: 'watch', + value: (_target: unknown, _options: unknown, callback: WatchEventHandler) => { + watchCallback = callback; + return fakeWatcher; + }, + }, + ]); + + try { + global.clearTimeout = ((timer: Parameters[0]) => { + clearTimeoutCount += 1; + return originalClearTimeout(timer); + }) as typeof clearTimeout; + + const initialSigintListeners = process.listenerCount('SIGINT'); + const runPromise = watchCommand.run(['--debounce', '0', '--experimental-native-compiler'], { cwd: '/project' }); + + await new Promise((resolve) => setImmediate(resolve)); + const onWatchEvent = watchCallback; + if (!onWatchEvent) { + throw new Error('Expected watch callback to be registered.'); + } + onWatchEvent('change', null); + onWatchEvent('change', '../outside.ts'); + onWatchEvent('change', 'src/dist/ignored.ts'); + onWatchEvent('change', 'src/App.ts'); + onWatchEvent('change', 'src/App2.ts'); + await new Promise((resolve) => setTimeout(resolve, 5)); + onWatchEvent('change', 'src/App3.ts'); + await new Promise((resolve) => setTimeout(resolve, 5)); + if (!releaseSecondBuild) { + throw new Error('Expected queued build to be waiting.'); + } + releaseSecondBuild(); + await new Promise((resolve) => setTimeout(resolve, 5)); + await waitForSigintListenerIncrease(initialSigintListeners); + process.emit('SIGINT'); + await runPromise; + + assert.equal(uploadCount >= 3, true); + assert.equal(clearTimeoutCount >= 1, true); + } finally { + global.clearTimeout = originalClearTimeout; + restore(); + } +}); + +test('watch command reports deployment errors and keeps running', async () => { + let failedMessage = ''; + let watchCallback: WatchEventHandler | undefined; + const fakeWatcher = new EventEmitter() as FakeWatcher; + fakeWatcher.close = () => {}; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => ['**/dist/**', '**/node_modules/**', '**/.git/**'] }, + { obj: compiler, key: 'buildAndPackage', value: async () => { throw new Error('boom'); } }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: (message: string) => { failedMessage = message; } }, + { obj: output, key: 'verbose', value: () => {} }, + { + obj: fs, + key: 'watch', + value: (_target: unknown, _options: unknown, callback: WatchEventHandler) => { + watchCallback = callback; + return fakeWatcher; + }, + }, + ]); + + try { + const initialSigintListeners = process.listenerCount('SIGINT'); + const runPromise = watchCommand.run(['--debounce', '0'], { cwd: '/project' }); + await new Promise((resolve) => setImmediate(resolve)); + const onWatchEvent = watchCallback; + if (!onWatchEvent) { + throw new Error('Expected watch callback to be registered.'); + } + onWatchEvent('change', 'src/App.ts'); + await new Promise((resolve) => setTimeout(resolve, 5)); + await waitForSigintListenerIncrease(initialSigintListeners); + process.emit('SIGINT'); + await runPromise; + + assert.equal(failedMessage.includes('Watch deployment failed: boom'), true); + } finally { + restore(); + } +}); + +test('watch command preserves allow-http/update precedence and uses linux fallback watcher mode', async () => { + const root = await createTempDir(); + await mkdir(path.join(root, 'nested', 'deep'), { recursive: true }); + await mkdir(path.join(root, 'node_modules', 'dep'), { recursive: true }); + await mkdir(path.join(root, 'dist', 'cache'), { recursive: true }); + await mkdir(path.join(root, '.git', 'objects'), { recursive: true }); + await writeFile(path.join(root, 'file.txt'), 'x', 'utf8'); + + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { value: 'linux' }); + + let validatedConfig: Record | undefined; + const warnings: string[] = []; + const watcherRecords: Array<{ + callback: WatchEventHandler; + recursive: boolean; + watcher: FakeWatcher; + watchPath: string; + closeCount: number; + }> = []; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: root, appJsonPath: path.join(root, 'app.json'), manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: { allowHttp: true, update: true }, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { + obj: deployCore, + key: 'validateDeployCredentials', + value: (config: unknown) => { + validatedConfig = config as Record; + }, + }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => ['**/dist/**', '**/node_modules/**', '**/.git/**'] }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: (message: string) => { warnings.push(message); } }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { + obj: fs, + key: 'watch', + value: (watchPath: unknown, options: unknown, callback: WatchEventHandler) => { + const fakeWatcher = new EventEmitter() as FakeWatcher; + const record = { + callback, + recursive: Boolean((options as { recursive?: boolean }).recursive), + watcher: fakeWatcher, + watchPath: String(watchPath), + closeCount: 0, + }; + fakeWatcher.close = () => { + record.closeCount += 1; + }; + watcherRecords.push(record); + return fakeWatcher; + }, + }, + ]); + + const initialSigintListeners = process.listenerCount('SIGINT'); + + try { + const runPromise = watchCommand.run([], { cwd: root }); + await waitForSigintListenerIncrease(initialSigintListeners); + + assert.equal(validatedConfig?.allowHttp, true); + assert.equal(validatedConfig?.update, true); + assert.equal(warnings.some((message) => message.includes('Recursive fs.watch is not supported on this platform')), true); + assert.equal(watcherRecords.length >= 3, true); + assert.equal(watcherRecords.every((record) => record.recursive === false), true); + assert.equal(watcherRecords.some((record) => record.watchPath.includes(`${path.sep}node_modules${path.sep}`)), false); + assert.equal(watcherRecords.some((record) => record.watchPath.includes(`${path.sep}dist${path.sep}`)), false); + assert.equal(watcherRecords.some((record) => record.watchPath.includes(`${path.sep}.git${path.sep}`)), false); + + await rm(path.join(root, 'nested', 'deep'), { recursive: true, force: true }); + await mkdir(path.join(root, 'nested', 'added'), { recursive: true }); + const rootWatcher = watcherRecords.find((record) => record.watchPath === root); + if (!rootWatcher) { + throw new Error('Expected root watcher record.'); + } + rootWatcher.callback('rename', 'nested'); + await new Promise((resolve) => setTimeout(resolve, 20)); + const removedWatcher = watcherRecords.find((record) => record.watchPath === path.join(root, 'nested', 'deep')); + const addedWatcher = watcherRecords.find((record) => record.watchPath === path.join(root, 'nested', 'added')); + assert.equal(Boolean(removedWatcher && removedWatcher.closeCount > 0), true); + assert.equal(Boolean(addedWatcher), true); + + process.emit('SIGINT'); + await runPromise; + + assert.equal(process.listenerCount('SIGINT'), initialSigintListeners); + } finally { + Object.defineProperty(process, 'platform', { value: originalPlatform }); + restore(); + await removeTempDir(root); + } +}); + +test('watch command linux fallback handles missing directories during scan', async () => { + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { value: 'linux' }); + + const fakeWatcher = new EventEmitter() as FakeWatcher; + fakeWatcher.close = () => {}; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/path-that-does-not-exist', appJsonPath: '/path-that-does-not-exist/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => [] }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { obj: fs, key: 'watch', value: (_target: unknown, _options: unknown, _callback: WatchEventHandler) => fakeWatcher }, + ]); + + try { + const initialSigintListeners = process.listenerCount('SIGINT'); + const runPromise = watchCommand.run([], { cwd: '/project' }); + await waitForSigintListenerIncrease(initialSigintListeners); + process.emit('SIGINT'); + await runPromise; + } finally { + Object.defineProperty(process, 'platform', { value: originalPlatform }); + restore(); + } +}); + +test('watch command applies allow-http/update flags when explicitly provided', async () => { + let validatedConfig: Record | undefined; + const fakeWatcher = new EventEmitter() as FakeWatcher; + fakeWatcher.close = () => {}; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: { allowHttp: false, update: false }, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { + obj: deployCore, + key: 'validateDeployCredentials', + value: (config: unknown) => { + validatedConfig = config as Record; + }, + }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => [] }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { obj: fs, key: 'watch', value: (_target: unknown, _options: unknown, _callback: WatchEventHandler) => fakeWatcher }, + ]); + + try { + const initialSigintListeners = process.listenerCount('SIGINT'); + const runPromise = watchCommand.run(['--allow-http', '--update'], { cwd: '/project' }); + await waitForSigintListenerIncrease(initialSigintListeners); + process.emit('SIGINT'); + await runPromise; + + assert.equal(validatedConfig?.allowHttp, true); + assert.equal(validatedConfig?.update, true); + } finally { + restore(); + } +}); + +test('watch command rejects when watcher emits error and cleans up listeners', async () => { + const fakeWatcher = new EventEmitter() as FakeWatcher; + fakeWatcher.close = () => {}; + + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => [] }, + { obj: compiler, key: 'buildAndPackage', value: async () => 'dist/a_1.0.0.zip' }, + { obj: deployCore, key: 'uploadApp', value: async () => ({ mode: 'update' }) }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + { obj: fs, key: 'watch', value: (_target: unknown, _options: unknown, _callback: WatchEventHandler) => fakeWatcher }, + ]); + + const initialSigintListeners = process.listenerCount('SIGINT'); + + try { + const runPromise = watchCommand.run([], { cwd: '/project' }); + await waitForSigintListenerIncrease(initialSigintListeners); + const error = new Error('watch exploded'); + + fakeWatcher.emit('error', error); + + await assert.rejects(runPromise, (receivedError: unknown) => { + assert.equal(receivedError, error); + return true; + }); + assert.equal(process.listenerCount('SIGINT'), initialSigintListeners); + } finally { + restore(); + } +}); + +test('watch command rejects invalid debounce values', async () => { + const restore = patchMany([ + { + obj: projectCore, + key: 'loadProject', + value: async () => ({ rootPath: '/project', appJsonPath: '/project/app.json', manifest: { id: 'app.id', nameSlug: 'a', version: '1.0.0' } }), + }, + { obj: projectCore, key: 'loadConfigFile', value: async () => ({ config: {}, legacyFields: [] }) }, + { + obj: envCore, + key: 'loadDeployConfigFromEnv', + value: () => ({ url: 'http://localhost:3000', username: 'user', password: 'pass' }), + }, + { obj: deployCore, key: 'validateDeployCredentials', value: () => {} }, + { obj: deployCore, key: 'getServerInfo', value: async () => ({}) }, + { obj: deployCore, key: 'loadIgnoredPatterns', value: async () => [] }, + { obj: output, key: 'warn', value: () => {} }, + { obj: output, key: 'step', value: () => {} }, + { obj: output, key: 'success', value: () => {} }, + { obj: output, key: 'failure', value: () => {} }, + { obj: output, key: 'verbose', value: () => {} }, + ]); + + try { + await assert.rejects( + () => watchCommand.run(['--debounce=-1'], { cwd: '/project' }), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal((error as Error).message, 'Invalid --debounce value.'); + return true; + }, + ); + } finally { + restore(); + } +}); diff --git a/test/commands/deploy.test.ts b/test/commands/deploy.test.ts deleted file mode 100644 index 703dd57..0000000 --- a/test/commands/deploy.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, test } from '@oclif/test'; - -describe('deploy', () => { - // test - // .stdout() - // .command(['deploy']) - // .exit(2) - // .it('runs and fails'); -}); diff --git a/test/commands/package.test.ts b/test/commands/package.test.ts deleted file mode 100644 index 2999e51..0000000 --- a/test/commands/package.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { test } from '@oclif/test'; - -describe('package', function() { - this.timeout(10000); - - test - .stdout() - .command(['package']) - .exit(2) - .it('runs and fails'); -}); diff --git a/test/commands/watch.test.ts b/test/commands/watch.test.ts deleted file mode 100644 index c928807..0000000 --- a/test/commands/watch.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {test } from '@oclif/test'; - -describe('watch', () => { - test - .stdout() - .command(['watch']) - .exit(2) - .it('runs and fails'); -}); diff --git a/test/compiler.test.ts b/test/compiler.test.ts new file mode 100644 index 0000000..1e2e1f1 --- /dev/null +++ b/test/compiler.test.ts @@ -0,0 +1,218 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const { mkdir, writeFile } = require('node:fs/promises'); + +const { CliError } = require('../lib/core/errors.js'); +const { createTempDir, removeTempDir, requireFresh, captureConsole } = require('./helpers.ts'); + +const appsCompilerPath = require.resolve('@rocket.chat/apps-compiler'); + +type BuildAndPackage = typeof import('../lib/core/compiler.js').buildAndPackage; +type ProjectContext = import('../lib/core/project.js').ProjectContext; +type AppManifest = import('../lib/core/types.js').AppManifest; + +type CompilerCall = + | { type: 'ctor'; metadata: unknown; projectPath: string; ts: unknown; useNativeCompiler: boolean } + | { type: 'compile' } + | { type: 'bundle' } + | { type: 'outputZip'; name: string }; + +async function makeProjectRoot(): Promise { + const root = await createTempDir(); + await mkdir(path.join(root, 'node_modules', 'typescript'), { recursive: true }); + await writeFile(path.join(root, 'node_modules', 'typescript', 'index.js'), 'module.exports = { version: "5.x" };', 'utf8'); + await writeFile(path.join(root, 'app.json'), '{}', 'utf8'); + return root; +} + +async function withFakeAppsCompiler( + FakeCompiler: { prototype: unknown }, + run: (buildAndPackage: BuildAndPackage) => Promise, +): Promise { + require(appsCompilerPath); + const moduleRecord = require.cache[appsCompilerPath]; + if (!moduleRecord) { + throw new Error('Unable to resolve apps-compiler module cache.'); + } + const originalExports = moduleRecord.exports; + moduleRecord.exports = { AppsCompiler: FakeCompiler }; + delete require.cache[require.resolve('../lib/core/compiler.js')]; + + try { + const { buildAndPackage } = requireFresh('../lib/core/compiler.js'); + return await run(buildAndPackage); + } finally { + delete require.cache[require.resolve('../lib/core/compiler.js')]; + moduleRecord.exports = originalExports; + } +} + +function makeManifest(version: string): AppManifest { + return { + id: 'id', + name: 'demo', + nameSlug: 'demo', + version, + requiredApiVersion: '^1.0.0', + description: 'desc', + author: { name: 'n', support: 's' }, + classFile: 'src/App.ts', + iconFile: 'icon.png', + }; +} + +function makeProjectContext(root: string, version: string): ProjectContext { + return { + rootPath: root, + appJsonPath: path.join(root, 'app.json'), + manifest: makeManifest(version), + }; +} + +test('buildAndPackage compiles, bundles, and writes zip', async () => { + const root = await makeProjectRoot(); + const calls: CompilerCall[] = []; + + class FakeCompiler { + constructor(metadata: unknown, projectPath: string, ts: unknown, useNativeCompiler: boolean) { + calls.push({ type: 'ctor', metadata, projectPath, ts, useNativeCompiler }); + } + + async compile() { + calls.push({ type: 'compile' }); + return { diagnostics: [], typeScriptVersion: '5.7.2' }; + } + + async bundle() { + calls.push({ type: 'bundle' }); + return { diagnostics: [] }; + } + + async outputZip(name: string) { + calls.push({ type: 'outputZip', name }); + } + } + + const { calls: consoleCalls, restore: restoreConsole } = captureConsole(); + + try { + await withFakeAppsCompiler(FakeCompiler, async (buildAndPackage) => { + const zipName = await buildAndPackage( + makeProjectContext(root, '1.2.3'), + { force: false, verbose: true, useNativeCompiler: true }, + ); + + assert.equal(zipName, path.join('dist', 'demo_1.2.3.zip')); + }); + + const firstCall = calls[0]; + assert.equal(firstCall?.type, 'ctor'); + if (!firstCall || firstCall.type !== 'ctor') { + throw new Error('Expected constructor call.'); + } + assert.equal(firstCall.projectPath, root); + assert.equal(firstCall.useNativeCompiler, true); + assert.equal(calls.some((item) => item.type === 'compile'), true); + assert.equal(calls.some((item) => item.type === 'bundle'), true); + assert.equal(calls.some((item) => item.type === 'outputZip' && item.name === path.join('dist', 'demo_1.2.3.zip')), true); + assert.equal(consoleCalls.log.some((line: string) => line.includes('using TypeScript 5.7.2')), true); + } finally { + restoreConsole(); + await removeTempDir(root); + } +}); + +test('buildAndPackage throws for compile diagnostics unless force is true', async () => { + const root = await makeProjectRoot(); + + class FakeCompiler { + async compile() { + return { diagnostics: [{ message: 'compile failed' }] }; + } + + async bundle() { + return { diagnostics: [] }; + } + + async outputZip() {} + } + + try { + await withFakeAppsCompiler(FakeCompiler, async (buildAndPackage) => { + await assert.rejects( + () => + buildAndPackage( + makeProjectContext(root, '1.2.3'), + { force: false, verbose: false, useNativeCompiler: false }, + ), + /TypeScript errors occurred:\ncompile failed/, + ); + + await assert.doesNotReject(() => + buildAndPackage( + makeProjectContext(root, '1.2.3'), + { force: true, verbose: false, useNativeCompiler: false }, + ), + ); + }); + } finally { + await removeTempDir(root); + } +}); + +test('buildAndPackage throws for bundler diagnostics', async () => { + const root = await makeProjectRoot(); + + class FakeCompiler { + async compile() { + return { diagnostics: [] }; + } + + async bundle() { + return { diagnostics: [{ message: 'bundle failed' }] }; + } + + async outputZip() {} + } + + try { + await withFakeAppsCompiler(FakeCompiler, async (buildAndPackage) => { + await assert.rejects( + () => + buildAndPackage( + makeProjectContext(root, '1.2.3'), + { force: false, verbose: false, useNativeCompiler: false }, + ), + /Bundler errors occurred:\nbundle failed/, + ); + }); + } finally { + await removeTempDir(root); + } +}); + +test('buildAndPackage throws when app project has no TypeScript dependency', async () => { + const root = await createTempDir(); + await writeFile(path.join(root, 'app.json'), '{}', 'utf8'); + + try { + const { buildAndPackage } = requireFresh('../lib/core/compiler.js'); + + await assert.rejects( + () => + buildAndPackage( + makeProjectContext(root, '1.2.3'), + { force: false, verbose: false, useNativeCompiler: false }, + ), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message.includes('TypeScript is required in the app project'), true); + return true; + }, + ); + } finally { + await removeTempDir(root); + } +}); diff --git a/test/config.test.ts b/test/config.test.ts new file mode 100644 index 0000000..11c08e1 --- /dev/null +++ b/test/config.test.ts @@ -0,0 +1,15 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { mergeDeployConfig } = require('../lib/core/project.js'); + +test('mergeDeployConfig overrides only defined CLI values', () => { + const merged = mergeDeployConfig( + { url: 'http://localhost:3000', username: 'base', password: 'base-pass' }, + { username: 'cli', password: '', token: undefined }, + ); + + assert.equal(merged.url, 'http://localhost:3000'); + assert.equal(merged.username, 'cli'); + assert.equal(merged.password, 'base-pass'); +}); diff --git a/test/deploy-core.test.ts b/test/deploy-core.test.ts new file mode 100644 index 0000000..2979611 --- /dev/null +++ b/test/deploy-core.test.ts @@ -0,0 +1,334 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const { writeFile } = require('node:fs/promises'); + +const { + getServerInfo, + loadIgnoredPatterns, + uploadApp, + validateDeployCredentials, +} = require('../lib/core/deploy.js'); +const { CliError } = require('../lib/core/errors.js'); +const { createTempDir, patch, removeTempDir } = require('./helpers.ts'); + +interface FetchOptionsLike { + method?: string; + headers?: Record; + body?: unknown; +} + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { 'content-type': 'application/json' }, + }); +} + +test('validateDeployCredentials accepts supported auth combinations', () => { + validateDeployCredentials({ username: 'u', password: 'p' }); + validateDeployCredentials({ token: 't', userId: 'id' }); +}); + +test('validateDeployCredentials rejects incomplete auth combinations', () => { + assert.throws(() => validateDeployCredentials({ username: 'u' }), /Missing --password/); + assert.throws(() => validateDeployCredentials({ password: 'p' }), /Missing --username/); + assert.throws(() => validateDeployCredentials({ token: 't' }), /Missing --userId/); + assert.throws(() => validateDeployCredentials({ userId: 'id' }), /Missing --token/); + assert.throws(() => validateDeployCredentials({}), /Authentication is required/); +}); + +test('getServerInfo validates URL constraints', async () => { + await assert.rejects( + () => getServerInfo({}), + (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal((error as Error).message.includes('Missing server URL'), true); + assert.equal((error as Error).message.includes('--url'), true); + assert.equal((error as Error).message.includes('RC_APPS_URL'), true); + return true; + }, + ); + await assert.rejects(() => getServerInfo({ url: 'not-a-url' }), /Invalid URL/); + await assert.rejects(() => getServerInfo({ url: 'ftp://example.com' }), /protocol must be http or https/); + await assert.rejects( + () => getServerInfo({ url: 'https://user:pass@example.com' }), + /Credentials in URL are not supported/, + ); + await assert.rejects(() => getServerInfo({ url: 'https://example.com?a=1' }), /must not include query string or hash/); + await assert.rejects( + () => getServerInfo({ url: 'http://example.com' }), + /Refusing insecure HTTP for non-localhost target/, + ); +}); + +test('getServerInfo handles successful and invalid responses', async () => { + const restoreFetch = patch(global, 'fetch', async (url: unknown) => { + if (String(url).endsWith('/api/info')) { + return jsonResponse({ version: '8.1' }); + } + throw new Error('unexpected url'); + }); + + try { + const info = await getServerInfo({ url: 'http://localhost:3000' }); + assert.equal(info.version, '8.1'); + } finally { + restoreFetch(); + } + + const restoreNonJson = patch(global, 'fetch', async () => + new Response('', { + status: 200, + headers: { 'content-type': 'text/html' }, + }), + ); + + try { + await assert.rejects( + () => getServerInfo({ url: 'http://localhost:3000' }), + /Received non-JSON response \(content-type: text\/html\)/, + ); + } finally { + restoreNonJson(); + } + + const restoreNotOk = patch(global, 'fetch', async () => jsonResponse({ ok: false }, 500)); + + try { + await assert.rejects(() => getServerInfo({ url: 'http://localhost:3000' }), /Unable to connect to Rocket.Chat server/); + } finally { + restoreNotOk(); + } +}); + +test('uploadApp deploys via token auth and creates app when not installed', async () => { + const root = await createTempDir(); + const zipPath = path.join(root, 'app.zip'); + await writeFile(zipPath, 'zip-content', 'utf8'); + + const calls: Array<{ url: string; options: FetchOptionsLike }> = []; + const restoreFetch = patch(global, 'fetch', async (url: unknown, options: FetchOptionsLike = {}) => { + calls.push({ url: String(url), options }); + + if (String(url).endsWith('/api/v1/me')) { + return jsonResponse({ success: true }); + } + if (String(url).endsWith('/api/apps/app.id')) { + return jsonResponse({ success: false }, 404); + } + if (String(url).endsWith('/api/apps')) { + return jsonResponse({ success: true, status: 'ok' }); + } + + throw new Error(`unexpected url: ${String(url)}`); + }); + + try { + const result = await uploadApp( + { url: 'http://localhost:3000', token: 'token', userId: 'uid' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ); + + assert.equal(result.mode, 'create'); + const firstCall = calls[0]; + const uploadCall = calls[2]; + assert.ok(firstCall); + assert.ok(uploadCall); + assert.equal(firstCall.options.method, 'GET'); + assert.equal(uploadCall.options.method, 'POST'); + assert.equal(uploadCall.options.headers?.['X-Auth-Token'], 'token'); + } finally { + restoreFetch(); + await removeTempDir(root); + } +}); + +test('uploadApp deploys via username/password and updates existing app', async () => { + const root = await createTempDir(); + const zipPath = path.join(root, 'app.zip'); + await writeFile(zipPath, 'zip-content', 'utf8'); + + const seenBodies: unknown[] = []; + const restoreFetch = patch(global, 'fetch', async (url: unknown, options: FetchOptionsLike = {}) => { + const target = String(url); + + if (target.endsWith('/api/v1/login')) { + seenBodies.push(options.body); + return jsonResponse({ + status: 'success', + data: { authToken: 'authed', userId: 'u1' }, + }); + } + if (target.endsWith('/api/apps/app.id')) { + if (options.method === 'GET') { + return jsonResponse({ success: true }); + } + return jsonResponse({ success: true, status: 'ok' }); + } + + throw new Error(`unexpected url: ${target}`); + }); + + try { + const result = await uploadApp( + { url: 'http://localhost:3000', username: 'user', password: 'pass', code: '222' }, + { + rootPath: root, + appJsonPath: '', + manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0', permissions: { x: true } }, + }, + zipPath, + ); + + assert.equal(result.mode, 'update'); + assert.equal(String(seenBodies[0]).includes('"code":"222"'), true); + } finally { + restoreFetch(); + await removeTempDir(root); + } +}); + +test('uploadApp surfaces auth and deployment failures', async () => { + const root = await createTempDir(); + const zipPath = path.join(root, 'app.zip'); + await writeFile(zipPath, 'zip-content', 'utf8'); + + const restoreInvalidToken = patch(global, 'fetch', async (url: unknown) => { + if (String(url).endsWith('/api/v1/me')) { + return jsonResponse({ success: false }, 401); + } + throw new Error('unexpected'); + }); + + try { + await assert.rejects( + () => + uploadApp( + { url: 'http://localhost:3000', token: 'bad', userId: 'uid' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ), + /Invalid personal access token or userId/, + ); + } finally { + restoreInvalidToken(); + } + + const restoreCompilerError = patch(global, 'fetch', async (url: unknown, options: FetchOptionsLike = {}) => { + const target = String(url); + if (target.endsWith('/api/v1/login')) { + return jsonResponse({ status: 'success', data: { authToken: 'ok', userId: 'id' } }); + } + if (target.endsWith('/api/apps/app.id') && options.method === 'GET') { + return jsonResponse({ success: true }); + } + if (target.endsWith('/api/apps/app.id') && options.method === 'POST') { + return jsonResponse({ status: 'compiler_error', messages: [{ msg: 'bad' }] }, 400); + } + throw new Error('unexpected'); + }); + + try { + await assert.rejects( + () => + uploadApp( + { url: 'http://localhost:3000', username: 'user', password: 'pass' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ), + /Deployment compiler errors/, + ); + } finally { + restoreCompilerError(); + } + + const restoreDeploymentError = patch(global, 'fetch', async (url: unknown, options: FetchOptionsLike = {}) => { + const target = String(url); + if (target.endsWith('/api/v1/login')) { + return jsonResponse({ status: 'success', data: { authToken: 'ok', userId: 'id' } }); + } + if (target.endsWith('/api/apps/app.id') && options.method === 'GET') { + return jsonResponse({ success: true }); + } + if (target.endsWith('/api/apps/app.id') && options.method === 'POST') { + return jsonResponse({ status: 'error', error: 'deploy failed' }, 500); + } + throw new Error('unexpected'); + }); + + try { + await assert.rejects( + () => + uploadApp( + { url: 'http://localhost:3000', username: 'user', password: 'pass' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ), + /deploy failed/, + ); + } finally { + restoreDeploymentError(); + await removeTempDir(root); + } +}); + +test('uploadApp rejects invalid username/password login', async () => { + const root = await createTempDir(); + const zipPath = path.join(root, 'app.zip'); + await writeFile(zipPath, 'zip-content', 'utf8'); + + const restoreFetch = patch(global, 'fetch', async (url: unknown) => { + if (String(url).endsWith('/api/v1/login')) { + return jsonResponse({ status: 'error' }, 401); + } + throw new Error('unexpected'); + }); + + try { + await assert.rejects( + () => + uploadApp( + { url: 'http://localhost:3000', username: 'u', password: 'p' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ), + /Invalid username\/password or missing 2FA code/, + ); + } finally { + restoreFetch(); + await removeTempDir(root); + } +}); + +test('uploadApp requires username and password for login flow', async () => { + const root = await createTempDir(); + const zipPath = path.join(root, 'app.zip'); + await writeFile(zipPath, 'zip-content', 'utf8'); + + try { + await assert.rejects( + () => + uploadApp( + { url: 'http://localhost:3000', username: 'user' }, + { rootPath: root, appJsonPath: '', manifest: { id: 'app.id', nameSlug: 'app', version: '1.0.0' } }, + zipPath, + ), + /Authentication is required/, + ); + } finally { + await removeTempDir(root); + } +}); + +test('loadIgnoredPatterns adds defaults and de-duplicates custom patterns', async () => { + const defaults = await loadIgnoredPatterns({}); + assert.equal(defaults.includes('**/dist/**'), true); + + const merged = await loadIgnoredPatterns({ + ignoredFiles: ['**/custom/**', '**/dist/**'], + }); + assert.equal(merged.includes('**/custom/**'), true); + assert.equal(merged.filter((item: string) => item === '**/dist/**').length, 1); +}); diff --git a/test/env.test.ts b/test/env.test.ts new file mode 100644 index 0000000..c9992dd --- /dev/null +++ b/test/env.test.ts @@ -0,0 +1,34 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { loadDeployConfigFromEnv } = require('../lib/core/env.js'); + +test('loadDeployConfigFromEnv maps RC_APPS vars', () => { + const config = loadDeployConfigFromEnv({ + RC_APPS_URL: 'https://chat.example.com', + RC_APPS_USERNAME: 'user', + RC_APPS_PASSWORD: 'pass', + RC_APPS_TOKEN: 'token', + RC_APPS_USER_ID: 'uid', + RC_APPS_2FA_CODE: '123456', + RC_APPS_ALLOW_HTTP: 'true', + }); + + assert.equal(config.url, 'https://chat.example.com'); + assert.equal(config.username, 'user'); + assert.equal(config.password, 'pass'); + assert.equal(config.token, 'token'); + assert.equal(config.userId, 'uid'); + assert.equal(config.code, '123456'); + assert.equal(config.allowHttp, true); +}); + +test('loadDeployConfigFromEnv handles falsey allow-http', () => { + const config = loadDeployConfigFromEnv({ RC_APPS_ALLOW_HTTP: 'false' }); + assert.equal(config.allowHttp, false); +}); + +test('loadDeployConfigFromEnv keeps allow-http undefined when not set', () => { + const config = loadDeployConfigFromEnv({}); + assert.equal(typeof config.allowHttp, 'undefined'); +}); diff --git a/test/files.test.ts b/test/files.test.ts new file mode 100644 index 0000000..822a976 --- /dev/null +++ b/test/files.test.ts @@ -0,0 +1,33 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const { readFile, writeFile } = require('node:fs/promises'); + +const { ensureDirectory, writeJsonFile, readJsonFile, walkFiles } = require('../lib/utils/files.js'); +const { createTempDir, removeTempDir } = require('./helpers.ts'); + +test('file helpers create directories, read/write json, and walk files recursively', async () => { + const root = await createTempDir(); + + try { + const nested = path.join(root, 'a', 'b'); + await ensureDirectory(nested); + + const jsonPath = path.join(nested, 'data.json'); + await writeJsonFile(jsonPath, { a: 1, b: 'ok' }); + const json = await readJsonFile(jsonPath); + assert.deepEqual(json, { a: 1, b: 'ok' }); + + const jsonContent = await readFile(jsonPath, 'utf8'); + assert.equal(jsonContent.endsWith('\n'), true); + + await writeFile(path.join(root, 'root.txt'), 'x', 'utf8'); + await writeFile(path.join(nested, 'leaf.txt'), 'y', 'utf8'); + + const files = await walkFiles(root); + const relative = files.map((item: string) => path.relative(root, item).replace(/\\/g, '/')).sort(); + assert.deepEqual(relative, ['a/b/data.json', 'a/b/leaf.txt', 'root.txt']); + } finally { + await removeTempDir(root); + } +}); diff --git a/test/glob.test.ts b/test/glob.test.ts new file mode 100644 index 0000000..6dc372a --- /dev/null +++ b/test/glob.test.ts @@ -0,0 +1,20 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { buildGlobMatcher } = require('../lib/utils/glob.js'); + +test('glob matcher handles nested patterns and Windows paths', () => { + const match = buildGlobMatcher(['**/dist/**', '**/*.test.ts']); + + assert.equal(match('dist/file.js'), true); + assert.equal(match('src/dist/file.js'), true); + assert.equal(match('src\\dist\\file.js'), true); + assert.equal(match('src/main.test.ts'), true); + assert.equal(match('src/main.ts'), false); +}); + +test('glob matcher escapes regex characters in literals', () => { + const match = buildGlobMatcher(['src/file(+).ts']); + assert.equal(match('src/file(+).ts'), true); + assert.equal(match('src/fileaaa.ts'), false); +}); diff --git a/test/help-command-index.test.ts b/test/help-command-index.test.ts new file mode 100644 index 0000000..d57d175 --- /dev/null +++ b/test/help-command-index.test.ts @@ -0,0 +1,55 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { renderHelp, renderCommandHelp } = require('../lib/commands/help.js'); +const { buildCommandIndex } = require('../lib/core/command-index.js'); + +test('renderHelp sorts commands and includes aliases', () => { + const output = renderHelp([ + { name: 'watch', description: 'watch', usage: 'watch' }, + { name: 'create', aliases: ['c'], description: 'create', usage: 'create' }, + ]); + + assert.equal(output.includes('create'), true); + assert.equal(output.includes('aliases: c'), true); + assert.equal(output.indexOf('create') < output.indexOf('watch'), true); +}); + +test('renderCommandHelp includes details only when present', () => { + const withDetails = renderCommandHelp({ + name: 'deploy', + description: 'Deploy app', + usage: 'rc-apps deploy', + details: ['line 1', 'line 2'], + }); + const withoutDetails = renderCommandHelp({ + name: 'env', + description: 'Env help', + usage: 'rc-apps env', + }); + + assert.equal(withDetails.includes('line 1'), true); + assert.equal(withDetails.includes('line 2'), true); + assert.equal(withoutDetails.includes('line 1'), false); +}); + +test('buildCommandIndex maps names and aliases', () => { + const commandA = { + name: 'deploy', + aliases: ['d'], + description: 'x', + usage: 'x', + run: async () => {}, + }; + const commandB = { + name: 'package', + description: 'x', + usage: 'x', + run: async () => {}, + }; + + const index = buildCommandIndex([commandA, commandB]); + assert.equal(index.get('deploy'), commandA); + assert.equal(index.get('d'), commandA); + assert.equal(index.get('package'), commandB); +}); diff --git a/test/helpers.ts b/test/helpers.ts new file mode 100644 index 0000000..9595402 --- /dev/null +++ b/test/helpers.ts @@ -0,0 +1,82 @@ +const assert = require('node:assert/strict'); +const os = require('node:os'); +const path = require('node:path'); +const { mkdtemp, rm } = require('node:fs/promises'); + +interface PatchEntry { + obj: unknown; + key: PropertyKey; + value: unknown; +} + +interface CapturedConsole { + log: string[]; + warn: string[]; + error: string[]; +} + +async function createTempDir(prefix = 'rc-apps-cli-test-'): Promise { + return mkdtemp(path.join(os.tmpdir(), prefix)); +} + +async function removeTempDir(directory: string): Promise { + await rm(directory, { recursive: true, force: true }); +} + +function requireFresh(modulePath: string): T { + delete require.cache[require.resolve(modulePath)]; + return require(modulePath) as T; +} + +function patch(obj: unknown, key: PropertyKey, value: unknown): () => void { + const target = obj as Record; + const original = target[key]; + target[key] = value; + return () => { + target[key] = original; + }; +} + +function patchMany(entries: PatchEntry[]): () => void { + const restores = entries.map(({ obj, key, value }) => patch(obj, key, value)); + return () => { + for (const restore of restores.reverse()) { + restore(); + } + }; +} + +function captureConsole(): { calls: CapturedConsole; restore: () => void } { + const calls: CapturedConsole = { + log: [] as string[], + warn: [] as string[], + error: [] as string[], + }; + + const restore = patchMany([ + { obj: console, key: 'log', value: (...args: unknown[]) => { calls.log.push(args.map(String).join(' ')); } }, + { obj: console, key: 'warn', value: (...args: unknown[]) => { calls.warn.push(args.map(String).join(' ')); } }, + { obj: console, key: 'error', value: (...args: unknown[]) => { calls.error.push(args.map(String).join(' ')); } }, + ]); + + return { calls, restore }; +} + +async function waitForMicrotasks(): Promise { + await new Promise((resolve) => setImmediate(resolve)); +} + +function assertIncludes(collection: string[], expected: string): void { + assert.equal(collection.some((entry) => entry.includes(expected)), true, `Expected "${expected}" in collection.`); +} + +module.exports = { + assertIncludes, + captureConsole, + createTempDir, + patch, + patchMany, + removeTempDir, + requireFresh, + waitForMicrotasks, +}; diff --git a/test/helpers/init.js b/test/helpers/init.js deleted file mode 100644 index 7f1bfb7..0000000 --- a/test/helpers/init.js +++ /dev/null @@ -1,2 +0,0 @@ -const path = require('path'); -process.env.TS_NODE_PROJECT = path.resolve('test/tsconfig.json'); diff --git a/test/logger-errors-templates.test.ts b/test/logger-errors-templates.test.ts new file mode 100644 index 0000000..dd0c989 --- /dev/null +++ b/test/logger-errors-templates.test.ts @@ -0,0 +1,62 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { Logger } = require('../lib/core/logger.js'); +const { CliError } = require('../lib/core/errors.js'); +const templates = require('../lib/core/templates.js'); +const { captureConsole } = require('./helpers.ts'); + +test('Logger prints info/warn/error and gates verbose', () => { + const { calls, restore } = captureConsole(); + + try { + const quiet = new Logger(false); + quiet.info('info'); + quiet.warn('warn'); + quiet.error('error'); + quiet.verbose('hidden'); + + const loud = new Logger(true); + loud.verbose('shown'); + } finally { + restore(); + } + + assert.equal(calls.log.includes('info'), true); + assert.equal(calls.warn.includes('warn'), true); + assert.equal(calls.error.includes('error'), true); + assert.equal(calls.log.includes('hidden'), false); + assert.equal(calls.log.includes('shown'), true); +}); + +test('CliError stores exit code', () => { + const error = new CliError('boom', 9); + assert.equal(error.name, 'CliError'); + assert.equal(error.message, 'boom'); + assert.equal(error.exitCode, 9); +}); + +test('template helpers render expected values', () => { + const manifest = { + name: 'App Name', + description: 'App description', + }; + + assert.equal(templates.appClassTemplate('MyApp').includes('class MyApp extends App'), true); + assert.equal(templates.appReadmeTemplate(manifest).includes('# App Name'), true); + assert.equal(templates.appTsConfigTemplate().includes('"target": "ES2021"'), true); + + const packageJson = templates.appPackageJsonTemplate('my-app', '^1.0.0'); + assert.equal(packageJson.includes('"name": "my-app"'), true); + assert.equal(packageJson.includes('"@rocket.chat/apps-engine": "^1.0.0"'), true); + + assert.equal(templates.endpointTemplate('TestEndpoint', '/x').includes("public path = '/x';"), true); + assert.equal(templates.slashCommandTemplate('MyCommand').includes("public command = 'mycommand';"), true); + assert.equal(templates.initialSettingsTemplate().includes('export const settings: ISetting[] = [];'), true); + + const appendedToInitial = templates.appendSettingTemplate(templates.initialSettingsTemplate(), 'my_setting'); + assert.equal(appendedToInitial.includes("id: 'my_setting'"), true); + + const appendedToExisting = templates.appendSettingTemplate("settings.push({ id: 'a' });\n", 'new_id'); + assert.equal(appendedToExisting.includes("id: 'new_id'"), true); +}); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index ccc7f34..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,7 +0,0 @@ ---require test/helpers/init.js ---require ts-node/register ---require source-map-support/register ---watch-extensions ts ---recursive ---reporter spec ---timeout 5000 diff --git a/test/output.test.ts b/test/output.test.ts new file mode 100644 index 0000000..85f9a9b --- /dev/null +++ b/test/output.test.ts @@ -0,0 +1,59 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const Module = require('node:module'); + +const output = require('../lib/utils/output.js'); +const { captureConsole, requireFresh } = require('./helpers.ts'); + +test('output helpers print formatted messages', () => { + const { calls, restore } = captureConsole(); + + try { + output.step('step message'); + output.success('success message'); + output.warn('warn message'); + output.failure('failure message'); + output.info('info message'); + output.verbose(false, 'hidden'); + output.verbose(true, 'visible'); + output.heading('heading message'); + } finally { + restore(); + } + + assert.equal(calls.log.some((line: string) => line.includes('step message')), true); + assert.equal(calls.log.some((line: string) => line.includes('success message')), true); + assert.equal(calls.warn.some((line: string) => line.includes('warn message')), true); + assert.equal(calls.error.some((line: string) => line.includes('failure message')), true); + assert.equal(calls.log.includes('info message'), true); + assert.equal(calls.log.some((line: string) => line.includes('visible')), true); + assert.equal(calls.log.some((line: string) => line.includes('hidden')), false); + assert.equal(calls.log.some((line: string) => line.includes('heading message')), true); +}); + +test('output falls back to plain text when chalk is unavailable', () => { + const originalLoad = Module._load as (request: string, parent: NodeModule | null, isMain: boolean) => unknown; + Module._load = function patchedLoad( + this: unknown, + request: string, + parent: NodeModule | null, + isMain: boolean, + ): unknown { + if (request === 'chalk') { + throw new Error('missing chalk'); + } + return originalLoad.call(this, request, parent, isMain); + } as typeof Module._load; + + const plainOutput = requireFresh('../lib/utils/output.js'); + const { calls, restore } = captureConsole(); + + try { + plainOutput.step('plain step'); + } finally { + restore(); + Module._load = originalLoad; + } + + assert.equal(calls.log.some((line: string) => line.includes('[*] plain step')), true); +}); diff --git a/test/project.test.ts b/test/project.test.ts new file mode 100644 index 0000000..8f303d2 --- /dev/null +++ b/test/project.test.ts @@ -0,0 +1,143 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const fsPromises = require('node:fs/promises'); +const { mkdir, writeFile } = require('node:fs/promises'); + +const { loadProject, loadConfigFile } = require('../lib/core/project.js'); +const { CliError } = require('../lib/core/errors.js'); +const { createTempDir, patch, removeTempDir } = require('./helpers.ts'); + +async function writeValidProject(root: string, overrides: Record = {}): Promise { + const manifest = { + id: 'id', + name: 'name', + nameSlug: 'name', + version: '1.0.0', + requiredApiVersion: '^1.0.0', + description: 'desc', + author: { name: 'n', support: 's' }, + classFile: 'src/App.ts', + iconFile: 'icon.png', + ...overrides, + }; + + await mkdir(path.join(root, 'src'), { recursive: true }); + await writeFile(path.join(root, 'src', 'App.ts'), 'export class App {}', 'utf8'); + await writeFile(path.join(root, 'icon.png'), '', 'utf8'); + await writeFile(path.join(root, 'app.json'), JSON.stringify(manifest, null, 2), 'utf8'); +} + +test('loadProject loads a valid app project', async () => { + const root = await createTempDir(); + + try { + await writeValidProject(root); + const project = await loadProject(root); + + assert.equal(project.rootPath, path.resolve(root)); + assert.equal(project.manifest.nameSlug, 'name'); + assert.equal(project.appJsonPath.endsWith('app.json'), true); + } finally { + await removeTempDir(root); + } +}); + +test('loadProject fails when app.json is missing', async () => { + const root = await createTempDir(); + await assert.rejects(() => loadProject(root), (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal(error instanceof CliError, true); + assert.equal((error as Error).message.includes('Missing app.json'), true); + return true; + }); + await removeTempDir(root); +}); + +test('loadProject fails with invalid json', async () => { + const root = await createTempDir(); + + try { + await writeFile(path.join(root, 'app.json'), '{not-json', 'utf8'); + await assert.rejects(() => loadProject(root), (error: unknown) => { + assert.equal(error instanceof Error, true); + assert.equal((error as Error).message, 'app.json is not valid JSON.'); + return true; + }); + } finally { + await removeTempDir(root); + } +}); + +test('loadProject validates required fields and author', async () => { + const root = await createTempDir(); + + try { + await writeValidProject(root, { id: '' }); + await assert.rejects(() => loadProject(root), /Missing required field: id/); + + await writeValidProject(root, { author: { name: 'n' } }); + await assert.rejects(() => loadProject(root), /author\.name and author\.support are required/); + } finally { + await removeTempDir(root); + } +}); + +test('loadProject validates classFile path exists and is file', async () => { + const root = await createTempDir(); + + try { + await writeValidProject(root, { classFile: 'src/NotFound.ts' }); + await assert.rejects(() => loadProject(root), /classFile does not exist/); + } finally { + await removeTempDir(root); + } +}); + +test('loadProject returns explicit not-a-file error for classFile path', async () => { + const root = await createTempDir(); + const restoreStat = patch(fsPromises, 'stat', async () => ({ isFile: () => false })); + + try { + await writeValidProject(root); + await assert.rejects(() => loadProject(root), /classFile path is not a file/); + } finally { + restoreStat(); + await removeTempDir(root); + } +}); + +test('loadConfigFile handles modern, legacy, invalid, and missing files', async () => { + const root = await createTempDir(); + + try { + await writeFile( + path.join(root, '.rcappsconfig'), + JSON.stringify( + { + ignoredFiles: ['**/tmp/**'], + allowHttp: true, + url: 'http://old', + username: 'legacy', + }, + null, + 2, + ), + 'utf8', + ); + + const loaded = await loadConfigFile(root); + assert.equal(loaded.config.allowHttp, true); + assert.deepEqual(loaded.config.ignoredFiles, ['**/tmp/**']); + assert.deepEqual(loaded.legacyFields.sort(), ['url', 'username']); + + await writeFile(path.join(root, '.rcappsconfig'), 'not-json', 'utf8'); + const invalid = await loadConfigFile(root); + assert.deepEqual(invalid, { config: {}, legacyFields: [] }); + + const missing = await loadConfigFile(path.join(root, 'missing')); + assert.deepEqual(missing, { config: {}, legacyFields: [] }); + } finally { + await removeTempDir(root); + } +}); diff --git a/test/prompt.test.ts b/test/prompt.test.ts new file mode 100644 index 0000000..04a8e29 --- /dev/null +++ b/test/prompt.test.ts @@ -0,0 +1,35 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const readline = require('node:readline'); + +const { patch } = require('./helpers.ts'); +const { prompt } = require('../lib/utils/prompt.js'); + +test('prompt uses trimmed answer and falls back to default', async () => { + const answers = [' answer ', ' ']; + const questions: string[] = []; + let closeCount = 0; + + const restore = patch(readline, 'createInterface', () => ({ + question(message: string, callback: (answer: string) => void) { + questions.push(message); + callback(answers.shift() ?? ''); + }, + close() { + closeCount += 1; + }, + })); + + try { + const first = await prompt('Question'); + const second = await prompt('Question', 'fallback'); + + assert.equal(first, 'answer'); + assert.equal(second, 'fallback'); + assert.equal(questions[0], 'Question: '); + assert.equal(questions[1], 'Question (fallback): '); + assert.equal(closeCount, 2); + } finally { + restore(); + } +}); diff --git a/test/source-packager.test.ts b/test/source-packager.test.ts new file mode 100644 index 0000000..4ff9841 --- /dev/null +++ b/test/source-packager.test.ts @@ -0,0 +1,58 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const path = require('node:path'); +const { mkdir, stat, writeFile } = require('node:fs/promises'); + +const { packageSource } = require('../lib/core/source-packager.js'); +const { createTempDir, removeTempDir } = require('./helpers.ts'); + +test('packageSource creates a dist zip for source files', async () => { + const root = await createTempDir(); + + try { + await mkdir(path.join(root, 'src'), { recursive: true }); + await writeFile(path.join(root, 'app.json'), '{"id":"x"}', 'utf8'); + await writeFile(path.join(root, 'src', 'App.ts'), 'export class App {}', 'utf8'); + await writeFile(path.join(root, 'README.md'), 'ignored', 'utf8'); + await writeFile(path.join(root, '.hidden'), 'ignored', 'utf8'); + + const zipRelativePath = await packageSource({ + rootPath: root, + appJsonPath: path.join(root, 'app.json'), + manifest: { nameSlug: 'demo', version: '0.0.1' }, + }); + + assert.equal(zipRelativePath, path.join('dist', 'demo_0.0.1.zip')); + + const zipAbsolutePath = path.join(root, zipRelativePath); + const info = await stat(zipAbsolutePath); + assert.equal(info.isFile(), true); + assert.equal(info.size > 0, true); + } finally { + await removeTempDir(root); + } +}); + +test('packageSource fails when every file is ignored', async () => { + const root = await createTempDir(); + + try { + await mkdir(path.join(root, 'nested', 'dist'), { recursive: true }); + await mkdir(path.join(root, 'nested', '.git'), { recursive: true }); + await writeFile(path.join(root, 'nested', 'dist', 'already.zip'), 'x', 'utf8'); + await writeFile(path.join(root, 'nested', '.git', 'config'), 'x', 'utf8'); + await writeFile(path.join(root, 'nested', '.env'), 'x', 'utf8'); + + await assert.rejects( + () => + packageSource({ + rootPath: root, + appJsonPath: path.join(root, 'app.json'), + manifest: { nameSlug: 'demo', version: '0.0.1' }, + }), + /No files to package were found/, + ); + } finally { + await removeTempDir(root); + } +}); diff --git a/test/strings.test.ts b/test/strings.test.ts new file mode 100644 index 0000000..bf79a63 --- /dev/null +++ b/test/strings.test.ts @@ -0,0 +1,19 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const { slugify, toManifestSlug, toPascalCase } = require('../lib/utils/strings.js'); + +test('slugify normalizes names for app folders', () => { + assert.equal(slugify(' My Awesome App! '), 'my-awesome-app'); +}); + +test('toManifestSlug removes unsupported characters for app.json nameSlug', () => { + assert.equal(toManifestSlug(' My App 2.0 '), 'my-app'); +}); + +test('toPascalCase creates valid class names', () => { + assert.equal(toPascalCase('my app plugin'), 'MyAppPlugin'); + assert.equal(toPascalCase('123 app'), 'App123App'); + assert.equal(toPascalCase('DemoEndpoint'), 'DemoEndpoint'); + assert.equal(toPascalCase('!!!'), 'RocketChat'); +}); diff --git a/test/tsconfig.json b/test/tsconfig.json index 04c22f3..5604ca2 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,11 +1,12 @@ { - "declaration": false, - "extends": "../tsconfig", + "extends": "../tsconfig.json", "compilerOptions": { - "sourceMap": true + "noEmit": true, + "rootDir": "..", + "declaration": false, + "sourceMap": false, + "strict": true, + "moduleDetection": "force" }, - "include": [ - "./**/*", - "../src/**/*" - ] + "include": ["./**/*.ts"] } diff --git a/tsconfig.json b/tsconfig.json index f44d7df..7d0522e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,18 @@ { "compilerOptions": { - "sourceMap": true, - "target": "es2017", - "module": "commonjs", + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "Node", "declaration": true, - "noImplicitAny": true, - "skipLibCheck": true, - "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "importHelpers": true, + "skipLibCheck": true, "outDir": "./lib", - "rootDirs": [ "./src" ], - "typeRoots": [ "./node_modules/@types", "./src/typings" ] + "rootDir": "./src", + "types": ["node"], + "lib": ["ES2022", "DOM", "DOM.Iterable"] }, - "include": [ - "./src/**/*" - ] + "include": ["src/**/*.ts"] }