diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..f1cc3ad329c5d5be1f19d75f27352ea695de0afc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..b5ef26151bf2d28215dfe411a819d7959536ad5c --- /dev/null +++ b/.eslintignore @@ -0,0 +1,18 @@ +# 排除依赖包检测 +**/node_modules +# 排除脚本检测 +scripts +# 排除配置文件 +.editorconfig +.prettierrc.js +gulpfile.js +lerna.json +package.json +tsconfig.json +**/pnpm-lock.yaml +pnpm-workspace.yaml +**/webpack.*.js +# 排除编译文件 +**/out +# 排除编译缓存 +**/.rollup.cache diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..3f162c9cba3445f4b8d6751385570c6bb7a7ddf4 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + parser: '@typescript-eslint/parser', + extends: ['prettier', 'plugin:@typescript-eslint/recommended'], + plugins: ['@typescript-eslint'], + env: { + node: true, + }, + rules: { + '@typescript-eslint/no-explicit-any': [0], + '@typescript-eslint/explicit-module-boundary-types': [0], + '@typescript-eslint/no-empty-function': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-unused-vars': [0, { varsIgnorePattern: 'h|Component|__stencil_registerInstance' }], + '@typescript-eslint/no-empty-interface': [0], + '@typescript-eslint/no-inferrable-types': [0], + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0932b1c778e5c4f27569c5d48b10f5ff9339f148 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +**/node_modules +**/pnpm-global +# 文件历史 +**/.history +# 编译文件 +**/out +**/dist +**/tsconfig.tsbuildinfo +# 编译缓存 +**/.rollup.cache +# 日志文件 +**/*.log diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000000000000000000000000000000000000..8b1c3e54a7a7815bb62a96153d2f0234a25aacda --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,12 @@ +module.exports = { + printWidth: 200, + semi: true, + singleQuote: true, + trailingComma: 'all', + bracketSpacing: true, + quoteProps: 'as-needed', + arrowParens: 'avoid', + tabWidth: 2, + useTabs: false, + endOfLine: 'lf', +}; diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000000000000000000000000000000000..161672f401432084b64aa51fc1ba51d05234782b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,96 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Genertor Cli - linux", + "cwd": "${workspaceFolder}/packages", + "program": "${workspaceFolder}/packages/cli/out/bin.js", + "outFiles": [ + "${workspaceFolder}/packages/cli/out/**/*.js", + "${workspaceFolder}/packages/core/out/**/*.js", + "${workspaceFolder}/packages/generator/out/**/*.js", + "${workspaceFolder}/packages/handlebars/out/**/*.js", + "${workspaceFolder}/packages/template/out/**/*.js", + "${workspaceFolder}/packages/model/out/**/*.js", + ], + "sourceMaps": true, + "protocol": "inspector", + "args": [ + "pub", + "-m", + "/root/workspace/projects/MyProjectN/model", + "-t", + "/root/workspace/projects/ibizlab-generator/modules/ibizlab-generator-core/src/main/resources/templ/r7", + "-o", + "/root/workspace/test-projects/pms-project-cli-test", + ], + "env": { + "DEBUG": "*" + } + }, + { + "type": "node", + "request": "launch", + "name": "Genertor Cli - win", + "cwd": "${workspaceFolder}/packages", + "program": "${workspaceFolder}/packages/cli/out/bin.js", + "outFiles": [ + "${workspaceFolder}/packages/cli/out/**/*.js", + "${workspaceFolder}/packages/core/out/**/*.js", + "${workspaceFolder}/packages/generator/out/**/*.js", + "${workspaceFolder}/packages/handlebars/out/**/*.js", + "${workspaceFolder}/packages/template/out/**/*.js", + "${workspaceFolder}/packages/model/out/**/*.js", + ], + "sourceMaps": true, + "protocol": "inspector", + "args": [ + "pub", + "-m", + "D:/workspace/MyProjectN/model", + "-t", + "D:/workspace/ibizlab-generator/modules/ibizlab-generator-core/src/main/resources/templ/r7", + "-o", + "D:/workspace/pms-project-cli-test", + ], + "env": { + "DEBUG": "*" + } + }, + { + "type": "node", + "request": "launch", + "name": "Preview Cli", + "cwd": "${workspaceFolder}/packages", + "program": "${workspaceFolder}/packages/cli/out/bin.js", + "outFiles": [ + "${workspaceFolder}/packages/cli/out/**/*.js", + "${workspaceFolder}/packages/core/out/**/*.js", + "${workspaceFolder}/packages/generator/out/**/*.js", + "${workspaceFolder}/packages/handlebars/out/**/*.js", + "${workspaceFolder}/packages/template/out/**/*.js", + "${workspaceFolder}/packages/model/out/**/*.js", + ], + "sourceMaps": true, + "protocol": "inspector", + "args": [ + "preview", + "-m", + "D:\\workspace\\MyProjectN\\model", + "-t", + "D:\\workspace\\ibizlab-generator\\modules\\ibizlab-generator-core\\src\\main\\resources\\templ\\r7", + "--file", + "app_{{apps}}\\src\\views\\{{appModules}}\\{{pages@DEEDITVIEW}}\\{{pages@DEEDITVIEW}}.vue.hbs", + ], + "env": { + "DEBUG": "*" + } + // ibizlab preview -m D:/workspace/MyProjectN/model --file D:/workspace/ibizlab-generator/modules/ibizlab-generator-core/src/main/resources/templ/r7/app_{{apps}}/src/views/{{appModules}}/{{pages@APPINDEXVIEW}}/{{pages@APPINDEXVIEW}}.vue.hbs --model-id PSSYSAPPS/Web/PSSYSAPP.json + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000000000000000000000000000000000..b8a5a20dc1a13fc3db6ed5254b7f0b73a1fe426b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,158 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "dev", + "path": "packages/core/", + "problemMatcher": [], + "label": "npm: dev - core", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "type": "npm", + "script": "dev", + "path": "packages/model/", + "problemMatcher": [], + "label": "npm: dev - model", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "type": "npm", + "script": "dev", + "path": "packages/generator/", + "problemMatcher": [], + "label": "npm: dev - generator", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "type": "npm", + "script": "dev", + "path": "packages/handlebars/", + "problemMatcher": [], + "label": "npm: dev - handlebars", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "type": "npm", + "script": "dev", + "path": "packages/template/", + "problemMatcher": [], + "label": "npm: dev - template", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "type": "npm", + "script": "dev", + "path": "packages/cli/", + "problemMatcher": [], + "label": "npm: dev - cli", + "detail": "tsc --watch", + "presentation": { + "group": "dev", + "close": true + } + }, + { + "label": "run dev", + "dependsOn": [ + "npm: dev - core", + "npm: dev - model", + "npm: dev - generator", + "npm: dev - handlebars", + "npm: dev - template", + "npm: dev - cli" + ], + "presentation": { + "group": "dev", + "close": true + }, + "problemMatcher": [] + }, + { + "type": "npm", + "script": "build", + "path": "packages/core/", + "problemMatcher": [], + "label": "npm: build - core", + "detail": "tsc --build", + }, + { + "type": "npm", + "script": "build", + "path": "packages/model/", + "problemMatcher": [], + "label": "npm: build - model", + "detail": "tsc --build", + }, + { + "type": "npm", + "script": "build", + "path": "packages/generator/", + "problemMatcher": [], + "label": "npm: build - generator", + "detail": "tsc --build", + }, + { + "type": "npm", + "script": "build", + "path": "packages/handlebars/", + "problemMatcher": [], + "label": "npm: build - handlebars", + "detail": "tsc --build", + }, + { + "type": "npm", + "script": "build", + "path": "packages/template/", + "problemMatcher": [], + "label": "npm: build - template", + "detail": "tsc --build", + }, + { + "type": "npm", + "script": "build", + "path": "packages/cli/", + "problemMatcher": [], + "label": "npm: build - cli", + "detail": "tsc --build", + }, + { + "label": "run build", + "dependsOn": [ + "npm: build - core", + "npm: build - generator", + "npm: build - model", + "npm: build - handlebars", + "npm: build - template", + "npm: build - cli" + ], + "dependsOrder": "sequence", + "presentation": { + "group": "build", + "close": true + }, + "problemMatcher": [] + }, + ] +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000000000000000000000000000000000000..e59b04fd73af014d0b3f86bfe5029dd9afec2b84 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,16 @@ +'use strict'; +/** + * Load the TypeScript compiler, then load the TypeScript gulpfile which simply loads all + * the tasks. The tasks are really inside tools/gulp/tasks. + */ + +const path = require('path'); + +const projectDir = __dirname; +const tsconfigPath = path.join(projectDir, 'tools/gulp/tsconfig.json'); + +require('ts-node').register({ + project: tsconfigPath, +}); + +require('./tools/gulp/gulpfile'); diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000000000000000000000000000000000000..e461bd8a8859b8f021827cb4a77e1ca12659ca6b --- /dev/null +++ b/lerna.json @@ -0,0 +1,7 @@ +{ + "version": "0.1.10", + "npmClient": "pnpm", + "packages": [ + "packages/*" + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..f3ecdc3a0fd2137a092591e6185b0176cdc154e1 --- /dev/null +++ b/package.json @@ -0,0 +1,60 @@ +{ + "name": "ibiz-mustache-generator-cli", + "version": "0.0.1", + "description": "模板生成器", + "main": "index.js", + "scripts": { + "clean": "gulp clean:output", + "clean:packages": "gulp clean:node-modules", + "prettier": "prettier --write packages/*/src/**/*.ts", + "prettier:check": "prettier --check packages/*/src/**/*.ts" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/iBizModeling/ibiz-mustache-generator-cli.git" + }, + "keywords": [ + "cli", + "mustache" + ], + "author": "chitanda", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "lodash": "^4.17.21", + "npmlog": "^6.0.1", + "pluralize": "^8.0.0", + "qx-util": "^0.1.0", + "ramda": "^0.28.0", + "tapable": "^2.2.1" + }, + "devDependencies": { + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/glob": "^7.2.0", + "@types/jest": "^27.4.0", + "@types/lodash": "^4.14.178", + "@types/node": "^17.0.16", + "@types/npmlog": "^4.1.4", + "@types/pluralize": "^0.0.29", + "@types/ramda": "^0.27.64", + "@typescript-eslint/eslint-plugin": "^5.11.0", + "@typescript-eslint/parser": "^5.11.0", + "delete-empty": "^3.0.0", + "eslint": "^8.8.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "gulp": "^4.0.2", + "gulp-clean": "^0.4.0", + "jest": "^27.5.1", + "lerna": "^4.0.0", + "prettier": "^2.5.1", + "rimraf": "^3.0.2", + "ts-jest": "^27.1.3", + "ts-node": "^10.5.0", + "typescript": "^4.5.5" + } +} diff --git a/packages/cli/.npmignore b/packages/cli/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/cli/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/cli/.npmrc b/packages/cli/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/cli/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000000000000000000000000000000000000..358354d70959697ccbb12c1a4e70a57b91bf37c1 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,25 @@ +{ + "name": "@ibizlab/cli", + "version": "0.1.10", + "description": "核心代码", + "bin": { + "ibizlab": "out/bin.js" + }, + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public" + }, + "license": "MIT", + "dependencies": { + "@ibizlab/template": "^0.1.10", + "commander": "^8.3.0" + } +} diff --git a/packages/cli/pnpm-lock.yaml b/packages/cli/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4c125ff5654c434b75729b0483091650f1aa37a3 --- /dev/null +++ b/packages/cli/pnpm-lock.yaml @@ -0,0 +1,156 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/npmlog': ^4.1.3 + chalk: ^5.0.0 + commander: ^8.3.0 + npmlog: ^6.0.0 + +dependencies: + chalk: 5.0.0 + commander: 8.3.0 + npmlog: 6.0.0 + +devDependencies: + '@types/npmlog': 4.1.3 + +packages: + + /@types/npmlog/4.1.3: + resolution: {integrity: sha512-1TcL7YDYCtnHmLhTWbum+IIwLlvpaHoEKS2KNIngEwLzwgDeHaebaEHHbQp8IqzNQ9IYiboLKUjAf7MZqG63+w==} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: false + + /chalk/5.0.0: + resolution: {integrity: sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /console-control-strings/1.1.0: + resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} + dev: false + + /delegates/1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /gauge/4.0.0: + resolution: {integrity: sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + ansi-regex: 5.0.1 + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.6 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /has-unicode/2.0.1: + resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} + dev: false + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /npmlog/6.0.0: + resolution: {integrity: sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 4.0.0 + set-blocking: 2.0.0 + dev: false + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /set-blocking/2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + dev: false + + /signal-exit/3.0.6: + resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} + dev: false + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /util-deprecate/1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + dev: false + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false diff --git a/packages/cli/src/bin.ts b/packages/cli/src/bin.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a300469587ae337f43891239f115039489283c9 --- /dev/null +++ b/packages/cli/src/bin.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { bootstrap } from './index'; + +bootstrap(); diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8b68d0c0c1ac827f91009def92542d5bc720a52 --- /dev/null +++ b/packages/cli/src/commands/index.ts @@ -0,0 +1,22 @@ +import * as chalk from 'chalk'; +import { Command } from 'commander'; + +import { ERROR_PREFIX } from '../ui'; +import { TemplatePreviewCommand } from './template/preview/preview'; +import { TemplatePubCommand } from './template/pub/pub'; + +export class CommandLoader { + public static load(program: Command): void { + new TemplatePubCommand().load(program); + new TemplatePreviewCommand().load(program); + this.handleInvalidCommand(program); + } + + private static handleInvalidCommand(program: Command) { + program.on('command:*', () => { + console.error(`\n${ERROR_PREFIX} Invalid command: ${chalk.red('%s')}`, program.args.join(' ')); + console.log(`See ${chalk.red('--help')} for a list of available commands.\n`); + process.exit(1); + }); + } +} diff --git a/packages/cli/src/commands/template/preview/preview.ts b/packages/cli/src/commands/template/preview/preview.ts new file mode 100644 index 0000000000000000000000000000000000000000..98b6fa80b5a323531e69a58398704421a98b3fc0 --- /dev/null +++ b/packages/cli/src/commands/template/preview/preview.ts @@ -0,0 +1,87 @@ +import { TemplatePreview } from '@ibizlab/template'; +import { Command } from 'commander'; +import { pathExistsSync } from 'fs-extra'; +import { normalize, resolve } from 'path'; +import { ICommand } from '../../../interface'; + +/** + * 命令输入参数 + * + * @author chitanda + * @date 2021-12-19 20:12:47 + * @export + * @interface TemplatePreviewCommandOptions + */ +export interface TemplatePreviewCommandOptions { + /** + * 模型目录 + * + * @author chitanda + * @date 2021-12-19 20:12:24 + * @type {string} + */ + model: string; + /** + * 模板目录 + * + * @author chitanda + * @date 2022-01-18 18:01:21 + * @type {string} + */ + template: string; + /** + * 模板目录 + * + * @author chitanda + * @date 2021-12-19 20:12:32 + * @type {string} + */ + file: string; + /** + * 需要预览的模型标识 + * + * @author chitanda + * @date 2022-01-17 17:01:36 + * @type {string} + */ + modelId: string; +} + +/** + * 运行模板编译 + * + * @author chitanda + * @date 2021-12-18 15:12:19 + * @export + * @class RunCommand + * @implements {ICommand} + */ +export class TemplatePreviewCommand implements ICommand { + load(program: Command): void { + program + .command('preview') + .description('编译模板并运行') + .option('-m, --model ', '模型目录') + .option('-t, --template ', '模板目录') + .option('-f, --file ', '需要预览的模板文件') + .option('--model-id ', '指定需要预览的主模型标识') + .action(this.action.bind(this)); + } + + async action(options: TemplatePreviewCommandOptions): Promise { + const { model, template, file, modelId } = options; + const modelFolder = normalize(resolve(model)); + if (pathExistsSync(modelFolder) === false) { + throw new Error(`模型目录不存在: ${modelFolder}`); + } + const templateFolder = normalize(resolve(template)); + if (pathExistsSync(templateFolder) === false) { + throw new Error(`模板目录不存在: ${templateFolder}`); + } + const preview = new TemplatePreview(modelFolder, templateFolder); + const result = preview.execute(file, modelId); + if (process.send) { + process.send({ type: 'preview', result }); + } + } +} diff --git a/packages/cli/src/commands/template/pub/pub.ts b/packages/cli/src/commands/template/pub/pub.ts new file mode 100644 index 0000000000000000000000000000000000000000..250347e2a800bbcad24da7d04076db8f8af8db13 --- /dev/null +++ b/packages/cli/src/commands/template/pub/pub.ts @@ -0,0 +1,86 @@ +import { Command } from 'commander'; +import { ICommand } from '../../../interface'; +import { template as t } from '@ibizlab/template'; +import * as rm from 'rimraf'; +import { normalize, resolve } from 'path'; + +/** + * 命令输入参数 + * + * @author chitanda + * @date 2021-12-19 20:12:47 + * @export + * @interface TemplatePubCommandOptions + */ +export interface TemplatePubCommandOptions { + /** + * 模型目录 + * + * @author chitanda + * @date 2021-12-19 20:12:24 + * @type {string} + */ + model: string; + /** + * 模板目录 + * + * @author chitanda + * @date 2021-12-19 20:12:32 + * @type {string} + */ + template: string; + /** + * 模板输出目录 + * + * @author chitanda + * @date 2021-12-19 20:12:37 + * @type {string} + */ + output: string; + /** + * 清理输出目录 + * + * @author chitanda + * @date 2021-12-21 10:12:47 + * @type {boolean} + */ + clean: boolean; +} + +/** + * 运行模板编译 + * + * @author chitanda + * @date 2021-12-18 15:12:19 + * @export + * @class TemplatePubCommand + * @implements {ICommand} + */ +export class TemplatePubCommand implements ICommand { + load(program: Command): void { + program + .command('pub') + .description('编译模板并运行') + .option('-m, --model ', '模型目录') + .option('-t, --template ', '模板目录') + .option('-o, --output ', '输出目录, 默认输出: 模板目录/out') + .option('--clean', '清理输出目录') + .action(this.action.bind(this)); + } + + async action(options: TemplatePubCommandOptions): Promise { + const { model, template, output, clean } = options; + const modelFolder = normalize(resolve(model)); + const templateFolder = normalize(resolve(template)); + const outputFolder = normalize(resolve(output || `${templateFolder}/out`)); + if (clean === true) { + rm.sync(`${outputFolder}/*`); + } + t.setOptions({ + modelFolder: modelFolder, + tempFolder: templateFolder, + outFolder: outputFolder, + }); + await t.run(); + } +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2fcd041e626fe06e415364261b70adc7d93332cb --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,33 @@ +import { program } from 'commander'; +import { CommandLoader } from './commands'; +import { loadLocalBinCommandLoader, localBinExists } from './utils'; + +export function bootstrap(): void { + program + .version( + // eslint-disable-next-line @typescript-eslint/no-var-requires + require('../package.json').version, + '-v, --version', + '查看当前版本', + ) + .usage(' [options]') + .helpOption('-h, --help', '获取帮助信息') + .configureOutput({ + // Visibly override write routines as example! + writeErr: str => process.stdout.write(`[ERR] ${str}`), + // Highlight errors in color. + outputError: (str, write) => write(`\x1b[31m${str}\x1b[0m`), + }); + + if (localBinExists()) { + const localCommandLoader = loadLocalBinCommandLoader(); + localCommandLoader.load(program); + } else { + CommandLoader.load(program); + } + program.parse(process.argv); + + if (!process.argv.slice(2).length) { + program.outputHelp(); + } +} diff --git a/packages/cli/src/interface/i-command/i-command.ts b/packages/cli/src/interface/i-command/i-command.ts new file mode 100644 index 0000000000000000000000000000000000000000..c035a0cb3ef93ba10133ac58f39150f851d008cd --- /dev/null +++ b/packages/cli/src/interface/i-command/i-command.ts @@ -0,0 +1,29 @@ +import { Command } from 'commander'; + +/** + * 命令项 + * + * @author chitanda + * @date 2021-12-18 15:12:13 + * @export + * @interface ICommand + */ +export interface ICommand { + /** + * 加载命令 + * + * @author chitanda + * @date 2021-12-18 15:12:22 + * @param {Command} program + */ + load(program: Command): void; + /** + * 执行行为 + * + * @author chitanda + * @date 2021-12-21 16:12:22 + * @param {...unknown[]} args + * @return {*} {(void | Promise)} + */ + action(...args: unknown[]): void | Promise; +} diff --git a/packages/cli/src/interface/index.ts b/packages/cli/src/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2e51d3390a1bdfb7c6d025d4c0d4cda085026190 --- /dev/null +++ b/packages/cli/src/interface/index.ts @@ -0,0 +1 @@ +export * from './i-command/i-command'; diff --git a/packages/cli/src/types/index.d.ts b/packages/cli/src/types/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..93684abcc567e7e1cedc8c1214728564a6d4cab9 --- /dev/null +++ b/packages/cli/src/types/index.d.ts @@ -0,0 +1,7 @@ +declare module 'rimraf' { + export function sync(p: string, options?: Record): void; + + export function rimraf(p: string, options?: Record, cb?: (...args) => void): void; + + export default rimraf; +} diff --git a/packages/cli/src/ui/index.ts b/packages/cli/src/ui/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbd4fd3e6b8fbffe0070f56f67a4dd9cde980979 --- /dev/null +++ b/packages/cli/src/ui/index.ts @@ -0,0 +1 @@ +export * from './prefixes/prefixes'; diff --git a/packages/cli/src/ui/prefixes/prefixes.ts b/packages/cli/src/ui/prefixes/prefixes.ts new file mode 100644 index 0000000000000000000000000000000000000000..08157bc88361b2ee75b73a6fe7beb8c187345f21 --- /dev/null +++ b/packages/cli/src/ui/prefixes/prefixes.ts @@ -0,0 +1,8 @@ +import * as chalk from 'chalk'; + +export const ERROR_PREFIX = chalk.bgRgb(210, 0, 75).bold.rgb(0, 0, 0)( + ' Error ', +); +export const INFO_PREFIX = chalk.bgRgb(60, 190, 100).bold.rgb(0, 0, 0)( + ' Info ', +); diff --git a/packages/cli/src/utils/index.ts b/packages/cli/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2d2681f55fa9bde5f4c6a8965a5c8e8d12ef366 --- /dev/null +++ b/packages/cli/src/utils/index.ts @@ -0,0 +1 @@ +export { localBinExists, loadLocalBinCommandLoader } from './local-binaries/local-binaries'; diff --git a/packages/cli/src/utils/local-binaries/local-binaries.ts b/packages/cli/src/utils/local-binaries/local-binaries.ts new file mode 100644 index 0000000000000000000000000000000000000000..a16d46c0331c5eb6bdad1a683c1349a443bf754e --- /dev/null +++ b/packages/cli/src/utils/local-binaries/local-binaries.ts @@ -0,0 +1,16 @@ +import { existsSync } from 'fs-extra'; +import { join, posix } from 'path'; +import { CommandLoader } from '../../commands/index'; + +const localBinPathSegments = [process.cwd(), 'node_modules', '@nestjs', 'cli']; + +export function localBinExists() { + return existsSync(join(...localBinPathSegments)); +} + +export function loadLocalBinCommandLoader(): typeof CommandLoader { + const path = posix.join(...localBinPathSegments, 'commands'); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const commandsFile = require(path); + return commandsFile.CommandLoader; +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/packages/core/.npmignore b/packages/core/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/core/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/core/.npmrc b/packages/core/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/core/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000000000000000000000000000000000000..a76329470e05bc3fffb9a381f61aff7e745c20a1 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,22 @@ +{ + "name": "@ibizlab/template-core", + "version": "0.1.9", + "description": "核心代码", + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public" + }, + "author": "chitanda", + "license": "MIT", + "dependencies": { + "tapable": "^2.2.1" + } +} diff --git a/packages/core/pnpm-lock.yaml b/packages/core/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10bd3b0de10f614124e15abb99b8e5871705c10f --- /dev/null +++ b/packages/core/pnpm-lock.yaml @@ -0,0 +1,50 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/mustache': ^4.1.2 + fs-extra: ^10.0.0 + mustache: ^4.2.0 + +dependencies: + fs-extra: 10.0.0 + mustache: 4.2.0 + +devDependencies: + '@types/mustache': 4.1.2 + +packages: + + /@types/mustache/4.1.2: + resolution: {integrity: sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg==} + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + + /mustache/4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false diff --git a/packages/core/src/constants/global/global.ts b/packages/core/src/constants/global/global.ts new file mode 100644 index 0000000000000000000000000000000000000000..57cafe15d7fff2480200cdce19fe65407271c3c7 --- /dev/null +++ b/packages/core/src/constants/global/global.ts @@ -0,0 +1,14 @@ +/** + * 全局静态变量 + * + * @author chitanda + * @date 2021-12-21 10:12:56 + * @export + * @enum {string} + */ +export const enum GlobalConst { + /** + * 忽略文件 or 文件夹,配置文件 + */ + IGNORE_FILES = '.ibizlab-generator-ignore', +} diff --git a/packages/core/src/constants/index.ts b/packages/core/src/constants/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cacb8bec3d96e75dd2410e3bbb96a1157c85a6a0 --- /dev/null +++ b/packages/core/src/constants/index.ts @@ -0,0 +1 @@ +export { GlobalConst } from './global/global'; diff --git a/packages/core/src/context/global/global.ts b/packages/core/src/context/global/global.ts new file mode 100644 index 0000000000000000000000000000000000000000..5f4e4d4577cff2acd909760d3744c47b17720d5f --- /dev/null +++ b/packages/core/src/context/global/global.ts @@ -0,0 +1,9 @@ +/** + * 全局上下文 + * + * @author chitanda + * @date 2021-12-21 14:12:22 + * @export + * @class GlobalContext + */ +export class GlobalContext {} diff --git a/packages/core/src/context/index.ts b/packages/core/src/context/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5a0d05f6f828939be453e17fc560f1513e50c3bf --- /dev/null +++ b/packages/core/src/context/index.ts @@ -0,0 +1,3 @@ +import { GlobalContext } from './global/global'; + +export const ctx = new GlobalContext(); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa1a56643fc741baa8443846979d6a24ce2efb17 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,3 @@ +export * from './constants'; +export * from './interface'; +export * from './utils'; diff --git a/packages/core/src/interface/index.ts b/packages/core/src/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..86b1a185f64c5a4d535492fb686e734f34714951 --- /dev/null +++ b/packages/core/src/interface/index.ts @@ -0,0 +1,4 @@ +export { ModelData } from './model-data/model-data'; +export { Options } from './options/options'; +export { TemplateEngine } from './template-engine/template-engine'; +export { TemplateEngineHooks } from './template-engine-hooks/template-engine-hooks'; diff --git a/packages/core/src/interface/model-data/model-data.ts b/packages/core/src/interface/model-data/model-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..edb5b93ae5c4e327ce2c9a0fd90f90daecd8e870 --- /dev/null +++ b/packages/core/src/interface/model-data/model-data.ts @@ -0,0 +1,11 @@ +/** + * 模板输出模型数据 + * + * @author chitanda + * @date 2021-12-23 13:12:49 + * @export + * @interface ModelData + */ +export interface ModelData { + [key: string]: unknown; +} diff --git a/packages/core/src/interface/options/options.ts b/packages/core/src/interface/options/options.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5d669ae1903ee260a57b2f7ec5f9b0cfee6db31 --- /dev/null +++ b/packages/core/src/interface/options/options.ts @@ -0,0 +1,50 @@ +/** + * 核心配置参数 + * + * @author chitanda + * @date 2021-12-22 18:12:53 + * @export + * @interface Options + */ +export interface Options { + /** + * 模型文件夹 + * + * @author chitanda + * @date 2021-12-22 18:12:00 + * @type {string} + */ + modelFolder: string; + /** + * 模板文件 + * + * @author chitanda + * @date 2021-12-22 18:12:06 + * @type {string} + */ + tempFolder: string; + /** + * 文件输出目录 + * + * @author chitanda + * @date 2021-12-22 18:12:13 + * @type {string} + */ + outFolder: string; + /** + * 模板文件后缀 + * + * @author chitanda + * @date 2021-12-22 18:12:21 + * @type {string} + */ + extension?: string; + /** + * 宏文件夹名称 + * + * @author chitanda + * @date 2021-12-22 18:12:27 + * @type {string} + */ + macroFolderName?: string; +} diff --git a/packages/core/src/interface/template-engine-hooks/template-engine-hooks.ts b/packages/core/src/interface/template-engine-hooks/template-engine-hooks.ts new file mode 100644 index 0000000000000000000000000000000000000000..843b94afc58acff81fd1b9af2cb1aa23076abea5 --- /dev/null +++ b/packages/core/src/interface/template-engine-hooks/template-engine-hooks.ts @@ -0,0 +1,21 @@ +import { SyncHook } from 'tapable'; +import { TemplateEngine } from '../template-engine/template-engine'; + +/** + * 模板引擎需要实现的钩子 + * + * @author chitanda + * @date 2021-12-24 14:12:23 + * @export + * @interface TemplateEngineHooks + */ +export interface TemplateEngineHooks { + /** + * 初始换 + * + * @author chitanda + * @date 2021-12-24 14:12:42 + * @type {SyncHook} + */ + init: SyncHook; +} diff --git a/packages/core/src/interface/template-engine/template-engine.ts b/packages/core/src/interface/template-engine/template-engine.ts new file mode 100644 index 0000000000000000000000000000000000000000..687b45152bacbe439c5a38c948dfb6c6402d9a50 --- /dev/null +++ b/packages/core/src/interface/template-engine/template-engine.ts @@ -0,0 +1,85 @@ +import { TemplateEngineHooks } from '..'; +import { ModelData } from '../model-data/model-data'; + +/** + * 模板引擎 + * + * @description 主要负责对模板进行编译 + * @author chitanda + * @date 2021-12-23 13:12:38 + * @export + * @interface TemplateEngine + */ +export interface TemplateEngine { + /** + * 钩子 + * + * @author chitanda + * @date 2021-12-24 14:12:24 + * @type {TemplateEngineHooks} + */ + hooks: TemplateEngineHooks; + /** + * 模板文件扩展名 + * + * @author chitanda + * @date 2021-12-23 14:12:18 + * @type {string} + */ + extension: string; + /** + * 当前模板引擎宏文件夹名称 + * + * @author chitanda + * @date 2021-12-23 14:12:42 + * @type {string} + */ + macroFolderName: string; + /** + * 注册模板宏 + * + * @author chitanda + * @date 2021-12-23 14:12:50 + * @param {string} key + * @param {string | unknown} template + */ + registerMacro(key: string, template: string | unknown): void; + /** + * 预编译 + * + * @author chitanda + * @date 2021-12-24 14:12:18 + * @param {string | unknown} template + * @return {*} {string | unknown} + */ + preparse(template: string | unknown): string | unknown; + /** + * 编译模板文本 + * + * @author chitanda + * @date 2021-12-23 14:12:13 + * @param {string | unknown} template + * @param {ModelData} data + * @return {*} {string} + */ + parse(template: string | unknown, data: ModelData): string; + /** + * 获取所有上下文级参数标签 + * + * @author chitanda + * @date 2021-12-23 19:12:06 + * @param {string} template + * @return {*} {string} + */ + parseContextTags(template: string): string[]; + /** + * 根据字符串模板 和 数据模型 返回渲染后的字符串 + * + * @author chitanda + * @date 2021-12-28 17:12:18 + * @param {string} template + * @param {ModelData} data + * @return {*} {string} + */ + render(template: string, data: ModelData): string; +} diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..311b50d5cad5557a0cf870fdad540c222dee55a4 --- /dev/null +++ b/packages/core/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './is-error/is-error'; +export * from './log/log'; +export { winToUnixPath, unixToWinPath } from './util/util'; diff --git a/packages/core/src/utils/is-error/is-error.ts b/packages/core/src/utils/is-error/is-error.ts new file mode 100644 index 0000000000000000000000000000000000000000..82a7043231097779383fb9dd413d3efed8f9642c --- /dev/null +++ b/packages/core/src/utils/is-error/is-error.ts @@ -0,0 +1,9 @@ +export function isError(e: any) { + return ( + e && + e.stack && + e.message && + typeof e.stack === 'string' && + typeof e.message === 'string' + ); +} diff --git a/packages/core/src/utils/log/log.ts b/packages/core/src/utils/log/log.ts new file mode 100644 index 0000000000000000000000000000000000000000..7661654116738780fada41efb120dcefde03c7a5 --- /dev/null +++ b/packages/core/src/utils/log/log.ts @@ -0,0 +1,62 @@ +import * as npmLog from 'npmlog'; + +/** + * 全局日志输出 + * + * @author chitanda + * @date 2021-12-19 23:12:49 + * @export + * @class GlobalLog + */ +export class GlobalLog { + protected log = npmLog; + + constructor() { + // 设置日志输出级别 + (npmLog as any).level = process.env['LOG_LEVEL'] || 'info'; + // 添加自定义命令 + // npmLog.addLevel('success', 2000, { fg: 'green', bold: true }); + } + + silly(prefix: string, message: string, ...args: any[]): void { + this.log.silly(prefix, message, ...args); + } + + verbose(prefix: string, message: string, ...args: any[]): void { + this.log.verbose(prefix, message, ...args); + } + + info(prefix: string, message: string, ...args: any[]): void { + this.log.info(prefix, message, ...args); + } + + timing(prefix: string, message: string, ...args: any[]): void { + this.log.timing(prefix, message, ...args); + } + + http(prefix: string, message: string, ...args: any[]): void { + this.log.http(prefix, message, ...args); + } + + notice(prefix: string, message: string, ...args: any[]): void { + this.log.notice(prefix, message, ...args); + } + + warn(prefix: string, message: string, ...args: any[]): void { + this.log.warn(prefix, message, ...args); + } + + error(prefix: string, message: string, ...args: any[]): void { + this.log.error(prefix, message, ...args); + } + + silent(prefix: string, message: string, ...args: any[]): void { + this.log.silent(prefix, message, ...args); + } + + // success(prefix: string, message: string, ...args: any[]): void { + // this.log.success(prefix, message, ...args); + // } +} +// 全局日志工具类 +export const log = new GlobalLog(); diff --git a/packages/core/src/utils/util/util.ts b/packages/core/src/utils/util/util.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f23a87a5ce9d5a4d0398cab6d12a70f8179447a --- /dev/null +++ b/packages/core/src/utils/util/util.ts @@ -0,0 +1,25 @@ +/** + * win 路径 \\ 转 linux 路径 / + * + * @author chitanda + * @date 2022-01-19 09:01:23 + * @export + * @param {string} path + * @return {*} {string} + */ +export function winToUnixPath(path: string): string { + return path.replace(/\\/g, '/'); +} + +/** + * linux 路径 / 转 win 路径 \\ + * + * @author chitanda + * @date 2022-01-19 10:01:34 + * @export + * @param {string} path + * @return {*} {string} + */ +export function unixToWinPath(path: string): string { + return path.replace(/\//g, '\\'); +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/packages/generator/.npmignore b/packages/generator/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/generator/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/generator/.npmrc b/packages/generator/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/generator/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/generator/package.json b/packages/generator/package.json new file mode 100644 index 0000000000000000000000000000000000000000..5e419320b1e1f8d54387c3c564db08c8dfd83f4e --- /dev/null +++ b/packages/generator/package.json @@ -0,0 +1,23 @@ +{ + "name": "@ibizlab/template-generator", + "version": "0.1.10", + "description": "核心代码", + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public" + }, + "author": "chitanda", + "license": "MIT", + "dependencies": { + "@ibizlab/template-core": "^0.1.9", + "tapable": "^2.2.1" + } +} diff --git a/packages/generator/pnpm-lock.yaml b/packages/generator/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10bd3b0de10f614124e15abb99b8e5871705c10f --- /dev/null +++ b/packages/generator/pnpm-lock.yaml @@ -0,0 +1,50 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/mustache': ^4.1.2 + fs-extra: ^10.0.0 + mustache: ^4.2.0 + +dependencies: + fs-extra: 10.0.0 + mustache: 4.2.0 + +devDependencies: + '@types/mustache': 4.1.2 + +packages: + + /@types/mustache/4.1.2: + resolution: {integrity: sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg==} + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + + /mustache/4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false diff --git a/packages/generator/src/compiler.ts b/packages/generator/src/compiler.ts new file mode 100644 index 0000000000000000000000000000000000000000..5fc368c43227399bf3752e8aa4134282aeaed84b --- /dev/null +++ b/packages/generator/src/compiler.ts @@ -0,0 +1,44 @@ +import { TemplateOutFile } from '.'; +import { TemplateFile } from './file/template-file/template-file'; +import { CompilerHooks } from './hooks'; + +/** + * 编译器 + * + * @author chitanda + * @date 2021-12-21 16:12:28 + * @export + * @class Compiler + */ +export class Compiler { + readonly hooks: CompilerHooks = new CompilerHooks(); + + /** + * 执行编译 + * + * @author chitanda + * @date 2021-12-22 19:12:15 + * @param {TemplateFile[]} temps + * @return {*} {Promise} + */ + async run(temps: TemplateFile[]): Promise { + for (let i = 0; i < temps.length; i++) { + const temp = temps[i]; + this.hooks.compile.call(temp); + } + } + + /** + * 发布模板生成文件 + * + * @author chitanda + * @date 2021-12-23 18:12:41 + * @param {TemplateOutFile} out + * @return {*} {Promise} + */ + async pub(out: TemplateOutFile): Promise { + this.hooks.publish.call(out); + } +} +// 唯一实例 +export const compiler = new Compiler(); diff --git a/packages/generator/src/constants/generator/generator.ts b/packages/generator/src/constants/generator/generator.ts new file mode 100644 index 0000000000000000000000000000000000000000..aaf08950cb48ec0bba0012ff0e26bffe49423dbc --- /dev/null +++ b/packages/generator/src/constants/generator/generator.ts @@ -0,0 +1,18 @@ +/** + * 编译器常量 + * + * @author chitanda + * @date 2021-12-24 12:12:29 + * @export + * @enum {number} + */ +export class GeneratorConst { + /** + * 路径拼接特殊标签 + */ + static readonly pathSpecialTag = '@'; + /** + * 路径特殊标签替换 + */ + static readonly pathReplaceSpecialTag = ':'; +} diff --git a/packages/generator/src/constants/index.ts b/packages/generator/src/constants/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b0a3c6d51155e52150e48c0a53701249a5c68dd9 --- /dev/null +++ b/packages/generator/src/constants/index.ts @@ -0,0 +1 @@ +export { GeneratorConst } from './generator/generator'; diff --git a/packages/generator/src/file/index.ts b/packages/generator/src/file/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..35a99f2389ddd96fb182ffe55019baca7fca53ac --- /dev/null +++ b/packages/generator/src/file/index.ts @@ -0,0 +1,4 @@ +export { TemplateContextItem } from './template-context-item/template-context-item'; +export { TemplateFile } from './template-file/template-file'; +export { TemplateMacroFile } from './template-macro-file/template-macro-file'; +export { TemplateOutFile } from './template-out-file/template-out-file'; diff --git a/packages/generator/src/file/template-context-item/template-context-item.ts b/packages/generator/src/file/template-context-item/template-context-item.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ab169717414e7efb9f5e400cb5505b1beba467f --- /dev/null +++ b/packages/generator/src/file/template-context-item/template-context-item.ts @@ -0,0 +1,98 @@ +import * as pluralize from 'pluralize'; +import { GeneratorConst } from '../../constants'; + +/** + * 模板上下文项 + * + * @author chitanda + * @date 2021-12-24 13:12:03 + * @export + * @class TemplateContextItem + */ +export class TemplateContextItem { + /** + * 标识 + * + * @author chitanda + * @date 2021-12-27 18:12:26 + * @type {string} + */ + readonly tag: string; + /** + * 只有在名称为复数时有值 + * + * @author chitanda + * @date 2021-12-28 13:12:41 + * @type {string} + */ + readonly singularTag?: string; + /** + * 参数名称 + * + * @author chitanda + * @date 2021-12-24 13:12:48 + * @type {string} + */ + readonly name: string; + /** + * 非复数名称,当名称 name 为复数时,此参数才会有值 + * + * @author chitanda + * @date 2021-12-28 13:12:05 + * @type {string} + */ + readonly singularName?: string; + /** + * 参数子类型 + * + * @author chitanda + * @date 2021-12-24 13:12:43 + * @type {string} + */ + readonly subType?: string; + /** + * Creates an instance of TemplateContextItem. + * + * @author chitanda + * @date 2021-12-24 13:12:18 + * @param {string} tag 参数标识 + */ + constructor(tag: string) { + const arr = tag.split(GeneratorConst.pathReplaceSpecialTag); + this.name = arr[0]; + this.tag = this.name; + if (arr.length > 1) { + this.subType = arr[1]; + this.tag += `${GeneratorConst.pathReplaceSpecialTag}${this.subType}`; + } + if (pluralize.isPlural(this.name)) { + this.singularName = pluralize.singular(this.name); + this.singularTag = this.singularName; + if (this.subType) { + this.singularTag += `${GeneratorConst.pathReplaceSpecialTag}${this.subType}`; + } + } + } + + /** + * 名称是否为复数 + * + * @author chitanda + * @date 2021-12-28 13:12:21 + * @return {*} {boolean} + */ + isPlural(): boolean { + return pluralize.isPlural(this.name); + } + + /** + * 名称为单数形式 + * + * @author chitanda + * @date 2021-12-28 13:12:41 + * @return {*} {boolean} + */ + isSingular(): boolean { + return pluralize.isSingular(this.name); + } +} diff --git a/packages/generator/src/file/template-file/template-file.ts b/packages/generator/src/file/template-file/template-file.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a3d2e36791b7291302e68fb2710341c4d7de10b --- /dev/null +++ b/packages/generator/src/file/template-file/template-file.ts @@ -0,0 +1,74 @@ +import { dirname } from 'path'; +import { notNilEmpty } from 'qx-util'; +import { TemplateContextItem } from '..'; +import { GeneratorConst } from '../../constants'; + +/** + * 模板文件 + * + * @author chitanda + * @date 2021-12-22 17:12:12 + * @export + * @class TemplateFile + */ +export class TemplateFile { + /** + * 相对于模板目录的路径 + * + * @author chitanda + * @date 2021-12-19 16:12:35 + * @type {string} + */ + folder: string; + /** + * 在操作系统中的路径 + * + * @author chitanda + * @date 2021-12-21 15:12:20 + * @type {string} + */ + fullFolder: string; + /** + * 文件名称 + * + * @author chitanda + * @date 2021-12-21 14:12:39 + * @type {string} + */ + name: string; + /** + * 模板域上下文 + * + * @author chitanda + * @date 2021-12-24 13:12:54 + * @type {TemplateContextItem[]} + */ + contexts: TemplateContextItem[] = []; + /** + * 是否为模板文件 + * + * @author chitanda + * @date 2022-01-27 11:01:23 + * @type {boolean} + */ + isTemplate: boolean = false; + /** + * Creates an instance of TemplateFile. + * @author chitanda + * @date 2021-12-19 16:12:50 + * @param {string} extension 文件扩展名称 + * @param {string} path 相对于模板目录的路径 + * @param {string} fullPath 文件的完整路径 + * @param {string} fileName 文件名称带扩展名 + * @param {string | unknown} content 文件内容 + */ + constructor(public extension: string, public path: string, public fullPath: string, public fileName: string, public content: string | unknown) { + this.folder = dirname(path).replace(GeneratorConst.pathSpecialTag, GeneratorConst.pathReplaceSpecialTag); + this.fullFolder = dirname(fullPath); + let name = fileName; + if (notNilEmpty(extension) && fileName.endsWith(extension)) { + name = name.replace(`.${extension}`, ''); + } + this.name = name.replace(GeneratorConst.pathSpecialTag, GeneratorConst.pathReplaceSpecialTag); + } +} diff --git a/packages/generator/src/file/template-macro-file/template-macro-file.ts b/packages/generator/src/file/template-macro-file/template-macro-file.ts new file mode 100644 index 0000000000000000000000000000000000000000..00019b00c18af83103fd0bd47995bc3c099e9b5a --- /dev/null +++ b/packages/generator/src/file/template-macro-file/template-macro-file.ts @@ -0,0 +1,12 @@ +import { TemplateFile } from '../template-file/template-file'; + +/** + * 模板宏文件 + * + * @author chitanda + * @date 2021-12-23 14:12:06 + * @export + * @class TemplateMacroFile + * @extends {TemplateFile} + */ +export class TemplateMacroFile extends TemplateFile {} diff --git a/packages/generator/src/file/template-out-file/template-out-file.ts b/packages/generator/src/file/template-out-file/template-out-file.ts new file mode 100644 index 0000000000000000000000000000000000000000..b697f7609044c1193c02c464c81a91e0f7bb5a1a --- /dev/null +++ b/packages/generator/src/file/template-out-file/template-out-file.ts @@ -0,0 +1,20 @@ +/** + * 输出文件 + * + * @author chitanda + * @date 2021-12-19 17:12:13 + * @export + * @class TemplateOutFile + */ +export class TemplateOutFile { + /** + * Creates an instance of TemplateOutFile. + * + * @author chitanda + * @date 2021-12-19 17:12:20 + * @param {string} folder 相对于模板目录的路径 + * @param {string} name 文件名称 + * @param {string} content 文件内容 + */ + constructor(public folder: string, public name: string, public content: string) {} +} diff --git a/packages/generator/src/generator.ts b/packages/generator/src/generator.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c68de6b927011a3f0f06fbe84af8a4fe5d920ce --- /dev/null +++ b/packages/generator/src/generator.ts @@ -0,0 +1,87 @@ +import { Options } from '@ibizlab/template-core'; +import { manager } from './manager'; +import { macro } from './macro'; +import { output } from './output'; +import { GeneratorOptions } from './options/generator-options'; +import { compiler } from './compiler'; + +/** + * 生成器 + * + * @author chitanda + * @date 2021-12-21 14:12:29 + * @export + * @class Generator + */ +export class Generator { + /** + * 配置参数 + * + * @author chitanda + * @date 2021-12-22 18:12:36 + * @protected + * @type {GeneratorOptions} + */ + protected opt!: GeneratorOptions; + + /** + * 设置参数 + * + * @author chitanda + * @date 2021-12-22 18:12:28 + * @param {Options} opt + */ + setOptions(opt: Options): void { + this.opt = new GeneratorOptions(opt); + macro.setOptions({ + tempFolder: this.opt.tempFolder, + macroFolderName: this.opt.macroFolderName, + extension: this.opt.extension, + }); + { + manager.setOptions({ + folder: this.opt.tempFolder, + extension: this.opt.extension, + }); + manager.ignore.addRule(`**/${this.opt.macroFolderName}/**`); + } + output.setOptions({ + outFolder: this.opt.outFolder, + }); + this.taps(); + } + + /** + * 订阅钩子 + * + * @author chitanda + * @date 2021-12-22 19:12:47 + * @protected + */ + protected taps(): void { + const tag = 'Generator'; + compiler.hooks.publish.tap(tag, output.write.bind(output)); + } + + /** + * 执行 + * + * @author chitanda + * @date 2021-12-22 18:12:21 + * @param {Options} [opt] + * @return {*} {Promise} + */ + async execute(opt?: Options): Promise { + if (opt) { + this.setOptions(opt); + } + if (!this.opt) { + throw new Error('请先设置参数'); + } + await macro.scan(); + await manager.scan(); + await compiler.run(manager.files); + } +} +// 唯一实例 +export const generator = new Generator(); diff --git a/packages/generator/src/hooks/compiler/compiler.ts b/packages/generator/src/hooks/compiler/compiler.ts new file mode 100644 index 0000000000000000000000000000000000000000..f9cb894347af0b656a5b736e2afd638827992f4f --- /dev/null +++ b/packages/generator/src/hooks/compiler/compiler.ts @@ -0,0 +1,27 @@ +import { SyncHook } from 'tapable'; +import { TemplateFile, TemplateOutFile } from '../../file'; + +/** + * 编译器钩子 + * + * @author chitanda + * @date 2021-12-22 19:12:11 + * @export + * @class CompilerHooks + */ +export class CompilerHooks { + /** + * 编译单个模板 + * + * @author chitanda + * @date 2021-12-22 19:12:13 + */ + compile = new SyncHook<[TemplateFile]>(['temp']); + /** + * 编译完成 + * + * @author chitanda + * @date 2021-12-22 19:12:03 + */ + publish = new SyncHook<[TemplateOutFile]>(['out']); +} diff --git a/packages/generator/src/hooks/index.ts b/packages/generator/src/hooks/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..64d05393944326e2da370698af975bed4107dbde --- /dev/null +++ b/packages/generator/src/hooks/index.ts @@ -0,0 +1,4 @@ +export { CompilerHooks } from './compiler/compiler'; +export { MacroHooks } from './macro/macro'; +export { ManagerHooks } from './manager/manager'; +export { OperationHooks } from './operation/operation'; diff --git a/packages/generator/src/hooks/macro/macro.ts b/packages/generator/src/hooks/macro/macro.ts new file mode 100644 index 0000000000000000000000000000000000000000..590bec54a08d87ffdc5f1402fd9a108d30fd0714 --- /dev/null +++ b/packages/generator/src/hooks/macro/macro.ts @@ -0,0 +1,20 @@ +import { SyncHook } from 'tapable'; +import { TemplateFile } from '../../file'; + +/** + * 宏钩子 + * + * @author chitanda + * @date 2021-12-22 19:12:49 + * @export + * @class MacroHooks + */ +export class MacroHooks { + /** + * 宏加载完成 + * + * @author chitanda + * @date 2021-12-22 19:12:24 + */ + complete = new SyncHook<[TemplateFile[]]>(['macros']); +} diff --git a/packages/generator/src/hooks/manager/manager.ts b/packages/generator/src/hooks/manager/manager.ts new file mode 100644 index 0000000000000000000000000000000000000000..41c4a05f26ad934b85234499d62309b3ff12743e --- /dev/null +++ b/packages/generator/src/hooks/manager/manager.ts @@ -0,0 +1,34 @@ +import { SyncWaterfallHook } from 'tapable'; +import { TemplateContextItem, TemplateFile } from '../../file'; + +/** + * 管理器钩子 + * + * @author chitanda + * @date 2021-12-22 17:12:52 + * @export + * @class ManagerHooks + */ +export class ManagerHooks { + /** + * 读取模板文件之前 + * + * @author chitanda + * @date 2021-12-23 18:12:56 + */ + beforeRead = new SyncWaterfallHook<[string]>(['path']); + /** + * 读取完成模板文件 + * + * @author chitanda + * @date 2021-12-23 18:12:52 + */ + afterRead = new SyncWaterfallHook<[TemplateFile]>(['temp']); + /** + * 计算 temp 文件需要的上下文 + * + * @author chitanda + * @date 2021-12-24 13:12:39 + */ + calcTempContext = new SyncWaterfallHook<[TemplateContextItem[], TemplateFile]>(['contexts', 'temp']); +} diff --git a/packages/generator/src/hooks/operation/operation.ts b/packages/generator/src/hooks/operation/operation.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8ae26976394119413c0b0cd5ab74243edeb045c --- /dev/null +++ b/packages/generator/src/hooks/operation/operation.ts @@ -0,0 +1,9 @@ +/** + * 操作器钩子 + * + * @author chitanda + * @date 2021-12-22 19:12:29 + * @export + * @class OperationHooks + */ +export class OperationHooks {} diff --git a/packages/generator/src/ignore-help/ignore-help.ts b/packages/generator/src/ignore-help/ignore-help.ts new file mode 100644 index 0000000000000000000000000000000000000000..74ec660cfcc02a9dcac6266661b3b821b3420d43 --- /dev/null +++ b/packages/generator/src/ignore-help/ignore-help.ts @@ -0,0 +1,90 @@ +import { existsSync, readFileSync } from 'fs-extra'; +import { join } from 'path'; + +/** + * 忽略文件帮助类 + * + * @author chitanda + * @date 2021-12-21 10:12:14 + * @export + * @class IgnoreHelp + */ +export class IgnoreHelp { + /** + * 配置文件内容 + * + * @author chitanda + * @date 2021-12-21 10:12:21 + * @protected + */ + protected fileContent = ''; + /** + * 忽略文件 or 文件夹规则 + * + * @author chitanda + * @date 2021-12-21 10:12:07 + * @protected + * @type {string[]} + */ + protected rules: string[] = []; + /** + * 忽略规则 + * + * @author chitanda + * @date 2021-12-21 12:12:59 + * @protected + * @type {RegExp} + */ + protected reg?: RegExp; + + /** + * Creates an instance of IgnoreHelp. + * + * @author chitanda + * @date 2021-12-21 10:12:25 + * @param {string} ignoreFilePath 配置文件名称 + */ + constructor(protected readonly ignoreFilePath: string) { + this.readIgnoreFile(); + } + + /** + * 读取配置文件 + * + * @author chitanda + * @date 2021-12-21 15:12:45 + * @protected + */ + protected readIgnoreFile(): void { + if (existsSync(this.ignoreFilePath)) { + const content = readFileSync(this.ignoreFilePath, 'utf-8'); + if (content) { + this.fileContent = content; + const rules = content.split('\n').filter(item => item.trim() !== ''); + rules.forEach(rule => this.addRule(rule)); + } + } + } + + /** + * 新增忽略规则 + * + * @author chitanda + * @date 2021-12-21 16:12:08 + * @param {string} rule + */ + addRule(rule: string): void { + this.rules.push(rule); + } + + /** + * 需要排除的目录条件 + * + * @author chitanda + * @date 2021-12-21 12:12:07 + * @return {*} {string[]} + */ + getRules(): string[] { + return this.rules; + } +} diff --git a/packages/generator/src/index.ts b/packages/generator/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..31fc9614d1da7ddd3f8b195698928518ab424a89 --- /dev/null +++ b/packages/generator/src/index.ts @@ -0,0 +1,7 @@ +export { GeneratorConst } from './constants'; +export { Compiler, compiler } from './compiler'; +export { Macro, macro } from './macro'; +export { Manager, manager } from './manager'; +export { Output, output } from './output'; +export { TemplateFile, TemplateMacroFile, TemplateContextItem, TemplateOutFile } from './file'; +export { generator } from './generator'; diff --git a/packages/generator/src/macro.ts b/packages/generator/src/macro.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d52c4edc46b49ed7886d387e83b88151d4f2414 --- /dev/null +++ b/packages/generator/src/macro.ts @@ -0,0 +1,106 @@ +import { readFileSync } from 'fs-extra'; +import { glob } from 'glob'; +import { basename, dirname, join, normalize, sep } from 'path'; +import { MacroHooks } from './hooks'; +import { TemplateMacroFile } from './file'; + +/** + * 宏管理器 + * + * @author chitanda + * @date 2021-12-21 13:12:50 + * @export + * @class Macro + */ +export class Macro { + readonly hooks: MacroHooks = new MacroHooks(); + /** + * 模板文件 + * + * @author chitanda + * @date 2021-12-21 13:12:02 + * @type {TemplateMacroFile[]} + */ + readonly files: TemplateMacroFile[] = []; + /** + * 分割后模板文件路径 + * + * @author chitanda + * @date 2021-12-20 18:12:51 + * @protected + * @type {string[]} + */ + protected folders: string[] = []; + /** + * 模板文件夹 + * + * @author chitanda + * @date 2021-12-23 10:12:59 + * @protected + * @type {string} + */ + protected tempFolder!: string; + /** + * 宏文件夹名称 + * + * @author chitanda + * @date 2021-12-23 10:12:05 + * @protected + * @type {string} + */ + protected macroFolderName!: string; + /** + * 模板扩展名 + * + * @author chitanda + * @date 2021-12-23 10:12:12 + * @protected + * @type {string} + */ + protected extension!: string; + + setOptions(opt: { tempFolder: string; macroFolderName: string; extension: string }): void { + if (opt.tempFolder) { + this.folders = opt.tempFolder.split(sep); + } + this.tempFolder = opt.tempFolder; + this.macroFolderName = opt.macroFolderName; + this.extension = opt.extension; + } + + /** + * 扫描宏模板文件夹 + * + * @author chitanda + * @date 2021-12-21 14:12:35 + * @return {*} {Promise} + */ + async scan(): Promise { + this.syncScan(); + } + + /** + * 同步扫描宏模板文件夹 + * + * @author chitanda + * @date 2022-01-18 18:01:59 + */ + syncScan(): void { + const globRule = normalize(join(this.tempFolder, this.macroFolderName, `**${sep}*.${this.extension}`)); + const paths = glob.sync(globRule, { + cwd: this.tempFolder, + dot: true, + }); + paths.forEach(fullPath => { + fullPath = normalize(fullPath); + const file = readFileSync(fullPath, 'utf-8'); + const folders = dirname(fullPath).split(sep); + const path = folders.slice(this.folders.length).join(sep); + const fileName = basename(fullPath); + this.files.push(new TemplateMacroFile(this.extension, join(path, fileName), fullPath, fileName, file)); + }); + this.hooks.complete.call(this.files); + } +} +// 唯一实例 +export const macro = new Macro(); diff --git a/packages/generator/src/manager.ts b/packages/generator/src/manager.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5bf9e92aebd686fffbe9c275f39444a1352cbfb --- /dev/null +++ b/packages/generator/src/manager.ts @@ -0,0 +1,147 @@ +import { pathExistsSync, readFileSync } from 'fs-extra'; +import { GlobalConst } from '@ibizlab/template-core'; +import { basename, dirname, extname, join, normalize, sep } from 'path'; +import { TemplateContextItem, TemplateFile } from './file'; +import { IgnoreHelp } from './ignore-help/ignore-help'; +import { glob } from 'glob'; +import { ManagerHooks } from './hooks'; + +/** + * 模板管理器 + * + * @author chitanda + * @date 2021-12-20 17:12:12 + * @export + * @class Manager + */ +export class Manager { + readonly hooks: ManagerHooks = new ManagerHooks(); + /** + * 所有模板文件 + * + * @author chitanda + * @date 2021-12-20 17:12:23 + * @type {TemplateFile[]} + */ + readonly files: TemplateFile[] = []; + /** + * 分割后模板文件路径 + * + * @author chitanda + * @date 2021-12-20 18:12:51 + * @type {string[]} + */ + readonly folders: string[] = []; + /** + * 忽略文件帮助类 + * + * @author chitanda + * @date 2021-12-21 10:12:17 + */ + ignore!: IgnoreHelp; + /** + * 模板文件夹 + * + * @author chitanda + * @date 2021-12-23 10:12:16 + * @protected + * @type {string} + */ + protected folder!: string; + /** + * 模板文件扩展名 + * + * @author chitanda + * @date 2021-12-23 10:12:44 + * @protected + * @type {string} + */ + protected extension!: string; + + setOptions(opt: { folder: string; extension: string }): void { + if (opt.folder) { + this.folders.splice(0, this.folders.length); + this.folders.push(...opt.folder.split(sep)); + } + this.folder = opt.folder; + this.extension = opt.extension; + this.ignore = new IgnoreHelp(join(this.folder, GlobalConst.IGNORE_FILES)); + } + + /** + * 扫描模板目录,并且读取链接目录 or 文件 + * + * @author chitanda + * @date 2021-12-20 17:12:03 + * @return {*} + */ + async scan(): Promise { + if (pathExistsSync(this.folder)) { + this.files.splice(0, this.files.length); + this.readFiles(); + return this.files; + } + throw new Error(`模板目录不存在: ${this.folder}`); + } + + async scanTemplateFile(templateFilePath: string): Promise { + if (pathExistsSync(templateFilePath)) { + const tempFile = this.createTemplateFile(templateFilePath); + return this.hooks.afterRead.call(tempFile); + } + throw new Error(`模板文件不存在: ${templateFilePath}`); + } + + /** + * 深度读取文件,并且读取链接目录 or 文件 + * + * @author chitanda + * @date 2021-12-19 23:12:22 + * @protected + * @return {*} {void} + */ + protected readFiles(): void { + const globRule = `${this.folder}/**`; + const rules = this.ignore.getRules(); + const ignorePaths = rules.map(rule => normalize(join(this.folder, rule))); + const paths = glob.sync(globRule, { + cwd: this.folder, + nodir: true, + dot: true, + ignore: ignorePaths, + }); + paths.forEach((fullPath: string) => { + const tempFile = this.createTemplateFile(fullPath); + this.files.push(tempFile); + }); + } + + /** + * 创建模板文件 + * + * @author chitanda + * @date 2021-12-22 10:12:28 + * @protected + * @param {string} fullPath + * @return {*} {TemplateFile} + */ + protected createTemplateFile(fullPath: string): TemplateFile { + fullPath = normalize(fullPath); + const folders = dirname(fullPath).split(sep); + const path = folders.slice(this.folders.length).join(sep); + const fileName = basename(fullPath); + this.hooks.beforeRead.call(fullPath); + const fileContent = readFileSync(fullPath, 'utf-8'); + const fileExt = extname(fullPath); + const tempFile = new TemplateFile(fileExt.replace('.', ''), join(path, fileName), fullPath, fileName, fileContent); + if (tempFile.extension === this.extension) { + tempFile.isTemplate = true; + } + const ctxs: TemplateContextItem[] = []; + this.hooks.calcTempContext.call(ctxs, tempFile); + tempFile.contexts = ctxs; + return this.hooks.afterRead.call(tempFile); + } +} +// 唯一实例 +export const manager = new Manager(); diff --git a/packages/generator/src/options/generator-options.ts b/packages/generator/src/options/generator-options.ts new file mode 100644 index 0000000000000000000000000000000000000000..bdd18e225d5404e300e9cc0f643753a4587be746 --- /dev/null +++ b/packages/generator/src/options/generator-options.ts @@ -0,0 +1,33 @@ +import { Options } from '@ibizlab/template-core'; + +/** + * 生成器配置参数 + * + * @author chitanda + * @date 2021-12-22 18:12:53 + * @export + * @class GeneratorOptions + * @implements {Options} + */ +export class GeneratorOptions implements Options { + modelFolder: string; + tempFolder: string; + outFolder: string; + extension: string; + macroFolderName: string; + + /** + * Creates an instance of GeneratorOptions. + * + * @author chitanda + * @date 2021-12-22 18:12:15 + * @param {Options} options + */ + constructor(options: Options) { + this.modelFolder = options.modelFolder; + this.tempFolder = options.tempFolder; + this.outFolder = options.outFolder; + this.extension = options.extension || 'ftl'; + this.macroFolderName = options.macroFolderName || '@macro'; + } +} diff --git a/packages/generator/src/output.ts b/packages/generator/src/output.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f6930f19e07a8ccf6237acab08c5e9502512c3d --- /dev/null +++ b/packages/generator/src/output.ts @@ -0,0 +1,54 @@ +import { existsSync, mkdirSync, writeFileSync } from 'fs-extra'; +import { join } from 'path'; +import { OperationHooks } from './hooks'; +import { TemplateOutFile } from './file'; +import { log } from '@ibizlab/template-core'; + +/** + * 输出操作 + * + * @author chitanda + * @date 2021-12-21 19:12:53 + * @export + * @class Output + */ +export class Output { + readonly hooks: OperationHooks = new OperationHooks(); + /** + * 成果物输出目录 + * + * @author chitanda + * @date 2021-12-23 10:12:24 + * @protected + * @type {string} + */ + protected outFolder!: string; + + setOptions(opt: { outFolder: string }): void { + this.outFolder = opt.outFolder; + } + + /** + * 写编译后文件 + * + * @author chitanda + * @date 2021-12-20 18:12:19 + * @param {TemplateOutFile} out + */ + async write(out: TemplateOutFile): Promise { + const folder = join(this.outFolder, out.folder.replace(/\./g, '/')); + if (!existsSync(folder)) { + mkdirSync(folder, { recursive: true }); + } + const filePath = join(folder, out.name); + try { + writeFileSync(filePath, out.content, 'utf-8'); + log.info('生成文件', `${filePath}`); + } catch (err: any) { + throw new Error(`写入文件异常: ${filePath},${err.message}`); + } + return out; + } +} +// 唯一实例 +export const output = new Output(); diff --git a/packages/generator/tsconfig.json b/packages/generator/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/generator/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/packages/handlebars/.npmignore b/packages/handlebars/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/handlebars/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/handlebars/.npmrc b/packages/handlebars/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/handlebars/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/handlebars/jest.config.js b/packages/handlebars/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..96a6ff28ed245225a15825bcea0ecef7c924feef --- /dev/null +++ b/packages/handlebars/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + roots: ['./test', './src'], + testRegex: 'test/(.+)\\.test\\.(jsx?|tsx?)$', + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], +}; diff --git a/packages/handlebars/package.json b/packages/handlebars/package.json new file mode 100644 index 0000000000000000000000000000000000000000..36dc1eae37244b42b87d2dfb3c883179a99e2a4f --- /dev/null +++ b/packages/handlebars/package.json @@ -0,0 +1,29 @@ +{ + "name": "@ibizlab/template-handlebars", + "version": "0.1.10", + "description": "核心代码", + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public", + "test": "jest" + }, + "author": "chitanda", + "license": "MIT", + "dependencies": { + "@ibizlab/template-core": "^0.1.9", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "tapable": "^2.2.1" + }, + "peerDependencies": { + "@ibizlab/template-generator": "^0.1.1" + } +} diff --git a/packages/handlebars/pnpm-lock.yaml b/packages/handlebars/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10bd3b0de10f614124e15abb99b8e5871705c10f --- /dev/null +++ b/packages/handlebars/pnpm-lock.yaml @@ -0,0 +1,50 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/mustache': ^4.1.2 + fs-extra: ^10.0.0 + mustache: ^4.2.0 + +dependencies: + fs-extra: 10.0.0 + mustache: 4.2.0 + +devDependencies: + '@types/mustache': 4.1.2 + +packages: + + /@types/mustache/4.1.2: + resolution: {integrity: sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg==} + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + + /mustache/4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false diff --git a/packages/handlebars/src/exception/handlebars-exception/handlebars-exception.ts b/packages/handlebars/src/exception/handlebars-exception/handlebars-exception.ts new file mode 100644 index 0000000000000000000000000000000000000000..49618a6a32e2e96e56ab774b87ec4e2f9d358ea8 --- /dev/null +++ b/packages/handlebars/src/exception/handlebars-exception/handlebars-exception.ts @@ -0,0 +1,16 @@ +import * as Handlebars from 'handlebars'; + +/** + * 模板异常 + * + * @author chitanda + * @date 2021-12-29 16:12:06 + * @export + * @class HandlebarsException + * @extends {Error} + */ +export class HandlebarsException extends Error { + constructor(message: string, options?: Handlebars.HelperOptions) { + super(message); + } +} diff --git a/packages/handlebars/src/exception/index.ts b/packages/handlebars/src/exception/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2db7f8a7c3c49397255e3c105a9d33ef7dda3a6e --- /dev/null +++ b/packages/handlebars/src/exception/index.ts @@ -0,0 +1 @@ +export { HandlebarsException } from './handlebars-exception/handlebars-exception'; diff --git a/packages/handlebars/src/handlebars/handlebars-engine.ts b/packages/handlebars/src/handlebars/handlebars-engine.ts new file mode 100644 index 0000000000000000000000000000000000000000..5dccc66836f49331e727e0041e7a752893737036 --- /dev/null +++ b/packages/handlebars/src/handlebars/handlebars-engine.ts @@ -0,0 +1,197 @@ +import { ModelData, TemplateEngine, TemplateEngineHooks, winToUnixPath } from '@ibizlab/template-core'; +import * as Handlebars from 'handlebars'; +import { installHelpers } from '../helpers'; +import { HandlebarsHooks } from '../hooks'; +import { HelperUtil } from '../utils'; + +/** + * 生成器 + * + * @author chitanda + * @date 2021-12-21 14:12:41 + * @export + * @class HandlebarsEngine + */ +export class HandlebarsEngine implements TemplateEngine { + /** + * 编译参数 + * + * @author chitanda + * @date 2022-01-07 11:01:29 + * @protected + * @type {CompileOptions} + */ + protected compileOpt: CompileOptions = { compat: true, noEscape: true }; + /** + * Handlebars 运行时参数 + * + * @author chitanda + * @date 2021-12-29 16:12:46 + * @protected + * @type {Handlebars.RuntimeOptions} + */ + protected runtimeOpt: Handlebars.RuntimeOptions = { allowProtoPropertiesByDefault: true }; + + /** + * 忽略编译的上下文标签规则 + * + * @author chitanda + * @date 2021-12-30 09:12:35 + * @protected + */ + protected tagReg = /^[a-zA-Z:_-]+$/; + + /** + * 模板引擎钩子 + * + * @author chitanda + * @date 2021-12-29 16:12:18 + * @type {TemplateEngineHooks} + */ + hooks: TemplateEngineHooks = new HandlebarsHooks(); + + /** + * 模板文件后缀 + * + * @author chitanda + * @date 2021-12-29 16:12:28 + */ + extension = 'hbs'; + + /** + * 模板宏文件夹名称,在项目根目录 + * + * @author chitanda + * @date 2021-12-29 16:12:54 + */ + macroFolderName = '@macro'; + + /** + * Creates an instance of HandlebarsEngine. + * + * @author chitanda + * @date 2021-12-29 16:12:40 + */ + constructor() { + this.init(); + } + + /** + * 初始化 + * + * @author chitanda + * @date 2021-12-29 16:12:35 + * @protected + */ + protected init(): void { + installHelpers(); + this.hooks.init.call(this); + } + + /** + * 注册宏 + * + * @author chitanda + * @date 2021-12-29 16:12:16 + * @param {string} key 宏标识 + * @param {string} template 宏模板内容 + */ + registerMacro(key: string, template: string): void { + key = winToUnixPath(key); + Handlebars.registerPartial(key, template); + if (key.endsWith(this.extension)) { + key = key.replace(`.${this.extension}`, ''); + Handlebars.registerPartial(key, template); + } + } + + /** + * 预编译模板 + * + * @author chitanda + * @date 2021-12-29 16:12:16 + * @param {string} template + * @return {*} {HandlebarsTemplateDelegate} + */ + preparse(template: string): HandlebarsTemplateDelegate { + return Handlebars.compile(template, this.compileOpt); + } + + /** + * 根据内容编译模板 + * + * @author chitanda + * @date 2021-12-29 16:12:25 + * @param {(HandlebarsTemplateDelegate | string)} template + * @param {ModelData} data + * @return {*} {string} + */ + parse(template: HandlebarsTemplateDelegate | string, data: ModelData): string { + if (typeof template === 'string') { + return Handlebars.compile(template, this.compileOpt)(data, this.runtimeOpt); + } + return template(data, this.runtimeOpt); + } + + /** + * 编译模板获取所有使用到的上下文级参数标识 + * + * @author chitanda + * @date 2021-12-29 16:12:37 + * @param {string} template + * @return {*} {string[]} + */ + parseContextTags(template: string): string[] { + const program = Handlebars.parse(template); + const set: Set = new Set(); + this.calcTemplateTags(set, program.body); + return Array.from(set); + } + + /** + * 计算编译模板中的参数标签 + * + * @author chitanda + * @date 2021-12-30 10:12:46 + * @protected + * @param {Set} set + * @param {Record[]} tags + */ + protected calcTemplateTags(set: Set, tags: Record[]): void { + tags.forEach(item => { + switch (item.type) { + case 'SubExpression': + if (item.params?.length > 0) { + this.calcTemplateTags(set, item.params); + } + return; + case 'MustacheStatement': + case 'PathExpression': + const tag = item.path ? item.path.original : item.original; + if (HelperUtil.isHelperName(tag)) { + if (item.params?.length > 0) { + this.calcTemplateTags(set, item.params); + } + return; + } + if (this.tagReg.test(tag)) { + set.add(tag); + } + return; + } + }); + } + + /** + * 直接工具模板和数据编译 + * + * @author chitanda + * @date 2021-12-29 16:12:01 + * @param {string} template + * @param {ModelData} data + * @return {*} {string} + */ + render(template: string, data: ModelData): string { + return Handlebars.compile(template, this.compileOpt)(data, this.runtimeOpt); + } +} diff --git a/packages/handlebars/src/helpers/and/and.ts b/packages/handlebars/src/helpers/and/and.ts new file mode 100644 index 0000000000000000000000000000000000000000..eed972c967ff3c494cc99705b3523fd68259fc91 --- /dev/null +++ b/packages/handlebars/src/helpers/and/and.ts @@ -0,0 +1,26 @@ +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 并且条件模式 + * + * @description 判断: word wor2 word3 必须在判断中必须全部为 true, 用法: {{#and word word2 word3}}xxx{{else}}yyy{{/and}}、{{and word word2 word3}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-29 14:12:10 + * @export + * @class HelperAnd + * @extends {HelperBase} + */ +export class HelperAnd extends HelperBase { + constructor() { + super('and'); + } + + onExecute(...args: unknown[] | Handlebars.HelperOptions[]): string | boolean { + const options = args[args.length - 1] as Handlebars.HelperOptions; + args.pop(); + const arr = (args as unknown[]).filter(item => !!item); + const bol = arr.length === args.length; + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/camel-case/camel-case.ts b/packages/handlebars/src/helpers/camel-case/camel-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf169a9c67254cd20607a4632ea57e564d9df0d3 --- /dev/null +++ b/packages/handlebars/src/helpers/camel-case/camel-case.ts @@ -0,0 +1,25 @@ +import { camelCase } from 'lodash'; +import { HelperBase } from '../helper-base'; + +/** + * 转驼峰 + * + * @description 用法 {{camelCase xxx}},效果: this-is-my-name => thisIsMyName + * @author chitanda + * @date 2021-12-24 15:12:59 + * @export + * @class HelperCamelCase + * @extends {HelperBase} + */ +export class HelperCamelCase extends HelperBase { + constructor() { + super('camelCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return camelCase(param); + } +} diff --git a/packages/handlebars/src/helpers/eq/eq.ts b/packages/handlebars/src/helpers/eq/eq.ts new file mode 100644 index 0000000000000000000000000000000000000000..547019b29aa245690b5dbe72b0ac0c6e007ecc7c --- /dev/null +++ b/packages/handlebars/src/helpers/eq/eq.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { eq } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 等于 + * + * @description 判断: word === word2, 用法: {{#eq word word2}}xxx{{else}}yyy{{/eq}}、{{eq word 'xxx'}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 14:12:25 + * @export + * @class HelperEq + * @extends {HelperBase} + */ +export class HelperEq extends HelperBase { + constructor() { + super('eq'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = eq(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/gt/gt.ts b/packages/handlebars/src/helpers/gt/gt.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab3c7f0595c454c03dd6eccd299aad9556051585 --- /dev/null +++ b/packages/handlebars/src/helpers/gt/gt.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { gt } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 大于 + * + * @description 判断: word > word2, 用法: {{#gt word word2}}xxx{{else}}yyy{{/gt}}、{{gt word word2}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 15:12:56 + * @export + * @class HelperGt + * @extends {HelperBase} + */ +export class HelperGt extends HelperBase { + constructor() { + super('gt'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = gt(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/gte/gte.ts b/packages/handlebars/src/helpers/gte/gte.ts new file mode 100644 index 0000000000000000000000000000000000000000..b892aa2d0e6cf1ad65711c825584796b6e10ed10 --- /dev/null +++ b/packages/handlebars/src/helpers/gte/gte.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { gte } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 大于等于 + * + * @description 判断: word >= word2, 用法 {{#gte word word2}}xxx{{else}}yyy{{/gte}}、{{gte word word2}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 15:12:35 + * @export + * @class HelperGte + * @extends {HelperBase} + */ +export class HelperGte extends HelperBase { + constructor() { + super('gte'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = gte(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/helper-base.ts b/packages/handlebars/src/helpers/helper-base.ts new file mode 100644 index 0000000000000000000000000000000000000000..118adf588f453775913cbf6a45d085da56147c72 --- /dev/null +++ b/packages/handlebars/src/helpers/helper-base.ts @@ -0,0 +1,33 @@ +import * as Handlebars from 'handlebars'; + +/** + * helper 基类 + * + * @author chitanda + * @date 2021-12-29 14:12:34 + * @export + * @class HelperBase + */ +export abstract class HelperBase { + /** + * Creates an instance of HelperBase. + * + * @author chitanda + * @date 2021-12-29 14:12:47 + * @param {string} tag 助手标识 + */ + constructor(tag: string) { + Handlebars.registerHelper(tag, this.onExecute); + } + + /** + * 助手执行 + * + * @author chitanda + * @date 2021-12-29 14:12:11 + * @abstract + * @param {(...(any | Handlebars.HelperOptions)[])} args + * @return {*} {(string | boolean)} + */ + abstract onExecute(...args: (any | Handlebars.HelperOptions)[]): string | boolean; +} diff --git a/packages/handlebars/src/helpers/index.ts b/packages/handlebars/src/helpers/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..31a1ba0dc63df5446c119a1bb23b600a6aa1964a --- /dev/null +++ b/packages/handlebars/src/helpers/index.ts @@ -0,0 +1,44 @@ +import { HelperAnd } from './and/and'; +import { HelperCamelCase } from './camel-case/camel-case'; +import { HelperEq } from './eq/eq'; +import { HelperGt } from './gt/gt'; +import { HelperGte } from './gte/gte'; +import { HelperJson } from './json/json'; +import { HelperLowerCase } from './lower-case/lower-case'; +import { HelperLt } from './lt/lt'; +import { HelperLte } from './lte/lte'; +import { HelperNeq } from './neq/neq'; +import { HelperNot } from './not/not'; +import { HelperOr } from './or/or'; +import { HelperPascalCase } from './pascal-case/pascal-case'; +import { HelperPluralize } from './pluralize/pluralize'; +import { HelperSnakeCase } from './snake-case/snake-case'; +import { HelperSpinalCase } from './spinal-case/spinal-case'; +import { HelperUpperCase } from './upper-case/upper-case'; + +/** + * 安装自定义助手 + * + * @author chitanda + * @date 2021-12-24 14:12:05 + * @export + */ +export function installHelpers(): void { + new HelperAnd(); + new HelperCamelCase(); + new HelperEq(); + new HelperGt(); + new HelperGte(); + new HelperJson(); + new HelperLowerCase(); + new HelperLt(); + new HelperLte(); + new HelperNeq(); + new HelperNot(); + new HelperOr(); + new HelperPascalCase(); + new HelperPluralize(); + new HelperSnakeCase(); + new HelperSpinalCase(); + new HelperUpperCase(); +} diff --git a/packages/handlebars/src/helpers/json/json.ts b/packages/handlebars/src/helpers/json/json.ts new file mode 100644 index 0000000000000000000000000000000000000000..d76493960dc40da55f21f85009a4862d89259c8e --- /dev/null +++ b/packages/handlebars/src/helpers/json/json.ts @@ -0,0 +1,21 @@ +import { HelperBase } from '../helper-base'; + +/** + * 转驼峰 + * + * @description 用法 {{json xxx}},效果: 将 + * @author chitanda + * @date 2021-12-24 15:12:59 + * @export + * @class HelperJson + * @extends {HelperBase} + */ +export class HelperJson extends HelperBase { + constructor() { + super('json'); + } + + onExecute(param: Record | Array): string { + return JSON.stringify(param); + } +} diff --git a/packages/handlebars/src/helpers/lower-case/lower-case.ts b/packages/handlebars/src/helpers/lower-case/lower-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..3b5de4e6d92a200489705858dfb511b9af6cf74a --- /dev/null +++ b/packages/handlebars/src/helpers/lower-case/lower-case.ts @@ -0,0 +1,24 @@ +import { HelperBase } from '../helper-base'; + +/** + * 字符串转换小写 + * + * @description 用法 {{lowerCase word}}, 效果: MyName => myname + * @author chitanda + * @date 2021-12-24 15:12:35 + * @export + * @class HelperLowerCase + * @extends {HelperBase} + */ +export class HelperLowerCase extends HelperBase { + constructor() { + super('lowerCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return param.toLowerCase(); + } +} diff --git a/packages/handlebars/src/helpers/lt/lt.ts b/packages/handlebars/src/helpers/lt/lt.ts new file mode 100644 index 0000000000000000000000000000000000000000..656229ce90c84af352424b50a436afd126238efe --- /dev/null +++ b/packages/handlebars/src/helpers/lt/lt.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { lt } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 小于 + * + * @description 判断: word < word2, 用法 {{#lt word word2}}xxx{{else}}yyy{{/lt}}、{{lt word word2}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 15:12:53 + * @export + * @class HelperLt + * @extends {HelperBase} + */ +export class HelperLt extends HelperBase { + constructor() { + super('lt'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = lt(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/lte/lte.ts b/packages/handlebars/src/helpers/lte/lte.ts new file mode 100644 index 0000000000000000000000000000000000000000..57c136b394278256ada10a78ee01bb154334811c --- /dev/null +++ b/packages/handlebars/src/helpers/lte/lte.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { lte } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 小于等于 + * + * @description 判断: word <= word2, 用法 {{#lte word word2}}xxx{{else}}yyy{{/lte}}、{{lte word word2}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 15:12:18 + * @export + * @class HelperLte + * @extends {HelperBase} + */ +export class HelperLte extends HelperBase { + constructor() { + super('lte'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = lte(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/neq/neq.ts b/packages/handlebars/src/helpers/neq/neq.ts new file mode 100644 index 0000000000000000000000000000000000000000..42c64c62ce740f159bfc4260a48449273a2e090e --- /dev/null +++ b/packages/handlebars/src/helpers/neq/neq.ts @@ -0,0 +1,25 @@ +import * as Handlebars from 'handlebars'; +import { eq } from 'lodash'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 不等于 + * + * @description 判断: word !== word2, 用法 {{#neq word 'xxx'}}xxx{{else}}yyy{{/neq}}、{{neq word 'xxx'}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-24 15:12:21 + * @export + * @class HelperNeq + * @extends {HelperBase} + */ +export class HelperNeq extends HelperBase { + constructor() { + super('neq'); + } + + onExecute(param: unknown, param2: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = !eq(param, param2); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/not/not.ts b/packages/handlebars/src/helpers/not/not.ts new file mode 100644 index 0000000000000000000000000000000000000000..c1cc91afc0e575dffc767b7a46a6fc5fcf8b12b2 --- /dev/null +++ b/packages/handlebars/src/helpers/not/not.ts @@ -0,0 +1,24 @@ +import * as Handlebars from 'handlebars'; +import { HelperUtil } from '../../utils'; +import { HelperBase } from '../helper-base'; + +/** + * 参数不存在或者为空时返回 true + * + * @description 判断: 参数为 null、undefined、空字符串、空数组、空对象时返回 true, 用法: {{#not value}}xxx{{else}}yyy{{/not}}、{{not value}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-29 15:12:38 + * @export + * @class HelperNot + * @extends {HelperBase} + */ +export class HelperNot extends HelperBase { + constructor() { + super('not'); + } + + onExecute(param: unknown, options: Handlebars.HelperOptions): string | boolean { + const bol = Handlebars.Utils.isEmpty(param); + return HelperUtil.handleJudgmentExecute(this, bol, options); + } +} diff --git a/packages/handlebars/src/helpers/or/or.ts b/packages/handlebars/src/helpers/or/or.ts new file mode 100644 index 0000000000000000000000000000000000000000..2fbd56af676393b506af7bfab39984beacad2bf5 --- /dev/null +++ b/packages/handlebars/src/helpers/or/or.ts @@ -0,0 +1,28 @@ +import { HelperBase } from '../helper-base'; + +/** + * 或者条件 + * + * @description 判断: word word2 word3 其中任意一个值在判断中为 true, 用法 {{#or word word2 word3}}xxx{{else}}yyy{{/or}}、{{or word word2 word3}} 返回值为 boolean 类型 + * @author chitanda + * @date 2021-12-29 10:12:00 + * @export + * @class HelperOr + * @extends {HelperBase} + */ +export class HelperOr extends HelperBase { + constructor() { + super('or'); + } + + onExecute(...args: unknown[] | Handlebars.HelperOptions[]): string { + const options = args[args.length - 1] as Handlebars.HelperOptions; + args.pop(); + const item: any = (args as unknown[]).find(item => !!item); + if (options.fn) { + const data = options.data?.root || {}; + return item ? options.fn(data) : options.inverse(data); + } + return item ? item : ''; + } +} diff --git a/packages/handlebars/src/helpers/pascal-case/pascal-case.ts b/packages/handlebars/src/helpers/pascal-case/pascal-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..0007771081f4da4e85681e52505fa32dedd85c14 --- /dev/null +++ b/packages/handlebars/src/helpers/pascal-case/pascal-case.ts @@ -0,0 +1,25 @@ +import { upperFirst } from 'lodash'; +import { HelperBase } from '../helper-base'; + +/** + * 首字母转大写 + * + * @description 用法 {{pascalCase word}},效果: myName => MyName + * @author chitanda + * @date 2021-12-24 15:12:13 + * @export + * @class HelperPascalCase + * @extends {HelperBase} + */ +export class HelperPascalCase extends HelperBase { + constructor() { + super('pascalCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return upperFirst(param); + } +} diff --git a/packages/handlebars/src/helpers/pluralize/pluralize.ts b/packages/handlebars/src/helpers/pluralize/pluralize.ts new file mode 100644 index 0000000000000000000000000000000000000000..90e11cae2572d2f519b903ff6cb8c64df13075fe --- /dev/null +++ b/packages/handlebars/src/helpers/pluralize/pluralize.ts @@ -0,0 +1,25 @@ +import * as pluralize from 'pluralize'; +import { HelperBase } from '../helper-base'; + +/** + * 单词转换为复数 + * + * @description 用法 {{pluralize word}}, 效果: myName => myNames + * @author chitanda + * @date 2021-12-24 15:12:15 + * @export + * @class HelperPluralize + * @extends {HelperBase} + */ +export class HelperPluralize extends HelperBase { + constructor() { + super('pluralize'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return pluralize(param).toLowerCase(); + } +} diff --git a/packages/handlebars/src/helpers/snake-case/snake-case.ts b/packages/handlebars/src/helpers/snake-case/snake-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..4016d2a5dd8d9c3c288fc66fe29764fe12ac4dc2 --- /dev/null +++ b/packages/handlebars/src/helpers/snake-case/snake-case.ts @@ -0,0 +1,25 @@ +import { snakeCase } from 'lodash'; +import { HelperBase } from '../helper-base'; + +/** + * 驼峰转蛇形命名法 + * + * @description 用法 {{snakeCase word}},效果: myName => my_name + * @author chitanda + * @date 2021-12-24 15:12:06 + * @export + * @class HelperSnakeCase + * @extends {HelperBase} + */ +export class HelperSnakeCase extends HelperBase { + constructor() { + super('snakeCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return snakeCase(param); + } +} diff --git a/packages/handlebars/src/helpers/spinal-case/spinal-case.ts b/packages/handlebars/src/helpers/spinal-case/spinal-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..a342a2d1eb82838ea14bd6137b51ee0b195c89b6 --- /dev/null +++ b/packages/handlebars/src/helpers/spinal-case/spinal-case.ts @@ -0,0 +1,25 @@ +import { kebabCase } from 'lodash'; +import { HelperBase } from '../helper-base'; + +/** + * 驼峰命名法转为横线命名法 + * + * @description 用法 {{spinalCase word}},效果: myName => my-name + * @author chitanda + * @date 2021-12-24 15:12:37 + * @export + * @class HelperSpinalCase + * @extends {HelperBase} + */ +export class HelperSpinalCase extends HelperBase { + constructor() { + super('spinalCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return kebabCase(param); + } +} diff --git a/packages/handlebars/src/helpers/upper-case/upper-case.ts b/packages/handlebars/src/helpers/upper-case/upper-case.ts new file mode 100644 index 0000000000000000000000000000000000000000..e2a7e8fe7bba7576b716f42c632857a8c5bfbb55 --- /dev/null +++ b/packages/handlebars/src/helpers/upper-case/upper-case.ts @@ -0,0 +1,24 @@ +import { HelperBase } from '../helper-base'; + +/** + * 字符串转大写 + * + * @description 用法 {{upperCase word}},效果: myName => MYNAME + * @author chitanda + * @date 2021-12-24 15:12:21 + * @export + * @class HelperUpCase + * @extends {HelperBase} + */ +export class HelperUpperCase extends HelperBase { + constructor() { + super('upperCase'); + } + + onExecute(param: string): string { + if (!param) { + return ''; + } + return param.toUpperCase(); + } +} diff --git a/packages/handlebars/src/hooks/handlebars/handlebars.ts b/packages/handlebars/src/hooks/handlebars/handlebars.ts new file mode 100644 index 0000000000000000000000000000000000000000..307e5b556d18fb11627f24d0f5dba1bc13674192 --- /dev/null +++ b/packages/handlebars/src/hooks/handlebars/handlebars.ts @@ -0,0 +1,21 @@ +import { TemplateEngineHooks } from '@ibizlab/template-core'; +import { SyncHook } from 'tapable'; +import { HandlebarsEngine } from '../../handlebars/handlebars-engine'; + +/** + * handlebars 引擎钩子 + * + * @author chitanda + * @date 2021-12-24 14:12:55 + * @export + * @class HandlebarsHooks + */ +export class HandlebarsHooks implements TemplateEngineHooks { + /** + * 初始化之后 + * + * @author chitanda + * @date 2021-12-24 14:12:10 + */ + init = new SyncHook<[HandlebarsEngine]>(['handlebarsEngine']); +} diff --git a/packages/handlebars/src/hooks/index.ts b/packages/handlebars/src/hooks/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9824550adbf482ab00143e848ea49c423a9528f6 --- /dev/null +++ b/packages/handlebars/src/hooks/index.ts @@ -0,0 +1 @@ +export { HandlebarsHooks } from './handlebars/handlebars'; diff --git a/packages/handlebars/src/index.ts b/packages/handlebars/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa1a6baa9a0aaddb3477391ee647d6e60d9cc8ed --- /dev/null +++ b/packages/handlebars/src/index.ts @@ -0,0 +1 @@ +export { HandlebarsEngine } from './handlebars/handlebars-engine'; diff --git a/packages/handlebars/src/utils/helper/helper.ts b/packages/handlebars/src/utils/helper/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..0074b3503b523b867d1c10a756d25cab4d602617 --- /dev/null +++ b/packages/handlebars/src/utils/helper/helper.ts @@ -0,0 +1,71 @@ +import * as handlebars from 'handlebars'; + +/** + * 助手工具类 + * + * @author chitanda + * @date 2021-12-29 17:12:32 + * @export + * @class HelperUtil + */ +export class HelperUtil { + /** + * 当前所有助手 tag 名称 + * + * @author chitanda + * @date 2021-12-30 10:12:39 + * @protected + * @type {string[]} + */ + protected static helperNames: string[] = [ + 'lookup', + 'log', + 'and', + 'camelCase', + 'eq', + 'gt', + 'get', + 'lowerCase', + 'lt', + 'lte', + 'neq', + 'not', + 'or', + 'pascalCase', + 'pluralize', + 'snakeCase', + 'spinalCase', + 'upperCase', + ]; + + /** + * 判断字符串是否为助手 + * + * @author chitanda + * @date 2021-12-30 10:12:26 + * @static + * @param {string} name + * @return {*} {boolean} + */ + static isHelperName(name: string): boolean { + return this.helperNames.includes(name); + } + + /** + * 判断类助手统一结果调用处理 + * + * @author chitanda + * @date 2021-12-29 17:12:23 + * @static + * @param {unknown} context 执行上下文 + * @param {boolean} bol 判断结果 + * @param {Handlebars.HelperOptions} options + * @return {*} {(string | boolean)} + */ + static handleJudgmentExecute(context: unknown, bol: boolean, options: Handlebars.HelperOptions): string | boolean { + if (options.fn) { + return bol ? options.fn(context) : options.inverse(context); + } + return bol ? (options.hash.yes = true) : (options.hash.no = false); + } +} diff --git a/packages/handlebars/src/utils/index.ts b/packages/handlebars/src/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1451276e24d047521b75c05989aed2793638685 --- /dev/null +++ b/packages/handlebars/src/utils/index.ts @@ -0,0 +1 @@ +export { HelperUtil } from './helper/helper'; diff --git a/packages/handlebars/test/handlebars/handlebars-engine.test.ts b/packages/handlebars/test/handlebars/handlebars-engine.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5f6d2993065e5e2ece23cf0831842eea856e1e8 --- /dev/null +++ b/packages/handlebars/test/handlebars/handlebars-engine.test.ts @@ -0,0 +1,24 @@ +import { HandlebarsEngine } from '../../src'; + +describe('handlebars 引擎测试', () => { + // 模板引擎初始化 + const engine = new HandlebarsEngine(); + + it('模板上下文标识编译测试', () => { + { + const template = `{{projectName}}-core/{{modules}}/{{entities}}/{{spinalCase entity.codeName}}/{{spinalCase (or module.codeName entity.codeName)}}.ts.hbs`; + const tags = engine.parseContextTags(template); + expect(tags).toEqual(['projectName', 'modules', 'entities']); + } + { + const template = `app_{{apps}}/src/page/{{appModules}}/{{spinalCase pages@DEEDITVIEW}}/index.ts.hbs`.replace(/@/g, ':'); + const tags = engine.parseContextTags(template); + expect(tags).toEqual(['apps', 'appModules', 'pages:DEEDITVIEW']); + } + { + const template = `app_{{apps}}/src/widgets/{{appEntities}}/{{ctrls@GRID}}-grid/index.ts.hbs`.replace(/@/g, ':'); + const tags = engine.parseContextTags(template); + expect(tags).toEqual(['apps', 'appEntities', 'ctrls:GRID']); + } + }); +}); diff --git a/packages/handlebars/test/helpers/helper.test.ts b/packages/handlebars/test/helpers/helper.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..a64edb7e0e50e08123885952d18dea89928b1ff7 --- /dev/null +++ b/packages/handlebars/test/helpers/helper.test.ts @@ -0,0 +1,368 @@ +import { HandlebarsEngine } from '../../src'; + +describe('模板助手测试', () => { + // 模板引擎初始化 + const engine = new HandlebarsEngine(); + + it('并且: and', () => { + { + const template = `{{#and age '张三' '李四'}}真的{{else}}假的{{/and}}`; + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: null }); + expect(str).toBe('假的'); + } + } + { + const template = `{{and age '张三' '李四'}}`; + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: null }); + expect(str).toBe('false'); + } + } + }); + + it('横线命名法转换为驼峰命名法: camel-case', () => { + const template = `{{camelCase "global-model"}}`; + const str = engine.render(template, {}); + expect(str).toBe('globalModel'); + }); + + it('等于: eq', () => { + { + const template = `{{#eq name '张三'}}真的{{else}}假的{{/eq}}`; + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: '李四' }); + expect(str).toBe('假的'); + } + } + { + const template = `{{eq name '张三'}}`; + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { name: '李四' }); + expect(str).toBe('false'); + } + } + { + const template = `{{eq bol false}}`; + { + const str = engine.render(template, { bol: true }); + expect(str).toBe('false'); + } + { + const str = engine.render(template, { bol: false }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { bol: null }); + expect(str).toBe('false'); + } + { + const str = engine.render(template, { bol: undefined }); + expect(str).toBe('false'); + } + { + const str = engine.render(template, { bol: '' }); + expect(str).toBe('false'); + } + } + }); + + it('大于: gt', () => { + { + const template = `{{#gt age 18}}真的{{else}}假的{{/gt}}`; + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('假的'); + } + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('假的'); + } + } + { + const template = `{{gt age 18}}`; + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('false'); + } + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('false'); + } + } + }); + + it('大于等于: gte', () => { + { + const template = `{{#gte age 18}}真的{{else}}假的{{/gte}}`; + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('假的'); + } + } + { + const template = `{{gte age 18}}`; + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('false'); + } + } + }); + + it('字符串转小写: lower-case', () => { + { + const template = `{{lowerCase "GlobalModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('globalmodel'); + } + }); + + it('小于: lt', () => { + { + const template = `{{#lt age 18}}真的{{else}}假的{{/lt}}`; + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('假的'); + } + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('假的'); + } + } + { + const template = `{{lt age 18}}`; + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('false'); + } + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('false'); + } + } + }); + + it('小于等于: lte', () => { + { + const template = `{{#lte age 18}}真的{{else}}假的{{/lte}}`; + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('假的'); + } + } + { + const template = `{{lte age 18}}`; + { + const str = engine.render(template, { age: 17 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 18 }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { age: 20 }); + expect(str).toBe('false'); + } + } + }); + + it('不等于: neq', () => { + { + const template = `{{#neq name '张三'}}真的{{else}}假的{{/neq}}`; + { + const str = engine.render(template, { name: '李四' }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('假的'); + } + } + { + const template = `{{neq name '张三'}}`; + { + const str = engine.render(template, { name: '李四' }); + expect(str).toBe('true'); + } + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('false'); + } + } + }); + + it('不存在: not', () => { + const template = `{{#not name}}真的{{else}}假的{{/not}}`; + { + const str = engine.render(template, { name: null }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: undefined }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: '' }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: [] }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, { name: {} }); + expect(str).toBe('假的'); + } + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('假的'); + } + }); + + it('或者: or', () => { + { + const template = `{{#or name false null}}真的{{else}}假的{{/or}}`; + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('真的'); + } + { + const str = engine.render(template, {}); + expect(str).toBe('假的'); + } + } + { + const template = `{{or name '张三' '李四'}}`; + { + const str = engine.render(template, { name: '王五' }); + expect(str).toBe('王五'); + } + { + const str = engine.render(template, { name: null }); + expect(str).toBe('张三'); + } + } + { + const template = `{{or name null '李四'}}`; + { + const str = engine.render(template, { name: '张三' }); + expect(str).toBe('张三'); + } + { + const str = engine.render(template, { name: undefined }); + expect(str).toBe('李四'); + } + } + }); + + it('首字母转大写: pascal-case', () => { + const template = `{{pascalCase "globalModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('GlobalModel'); + }); + + it('单词转换为复数: pluralize', () => { + const template = `{{pluralize "globalModel"}}_{{pluralize "entity"}}`; + const str = engine.render(template, {}); + expect(str).toBe('globalmodels_entities'); + }); + + it('驼峰转蛇形命名法: snake-case', () => { + { + const template = `{{snakeCase "iBizModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('i_biz_model'); + } + { + const template = `{{snakeCase "IBizModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('i_biz_model'); + } + { + const template = `{{snakeCase "IBIZModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('ibiz_model'); + } + }); + + it('驼峰命名法转为横线命名法: spinal-case', () => { + { + const template = `{{spinalCase "iBizModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('i-biz-model'); + } + { + const template = `{{spinalCase "IBizModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('i-biz-model'); + } + { + const template = `{{spinalCase "IBIZModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('ibiz-model'); + } + }); + + it('字符串转大写: upper-case', () => { + const template = `{{upperCase "globalModel"}}`; + const str = engine.render(template, {}); + expect(str).toBe('GLOBALMODEL'); + }); +}); diff --git a/packages/handlebars/tsconfig.json b/packages/handlebars/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/handlebars/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/packages/model/.npmignore b/packages/model/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/model/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/model/.npmrc b/packages/model/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/model/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/model/package.json b/packages/model/package.json new file mode 100644 index 0000000000000000000000000000000000000000..0f22ce8022714f1c6a361e677fd71605e07060e3 --- /dev/null +++ b/packages/model/package.json @@ -0,0 +1,26 @@ +{ + "name": "@ibizlab/template-model", + "version": "0.1.10", + "description": "核心代码", + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prettier": "prettier --write src/**/*.ts", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public" + }, + "author": "chitanda", + "license": "MIT", + "dependencies": { + "@ibizlab/model": "^0.0.20", + "@ibizlab/template-generator": "^0.1.10", + "lodash": "^4.17.21", + "pluralize": "^8.0.0" + } +} diff --git a/packages/model/pnpm-lock.yaml b/packages/model/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10bd3b0de10f614124e15abb99b8e5871705c10f --- /dev/null +++ b/packages/model/pnpm-lock.yaml @@ -0,0 +1,50 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/mustache': ^4.1.2 + fs-extra: ^10.0.0 + mustache: ^4.2.0 + +dependencies: + fs-extra: 10.0.0 + mustache: 4.2.0 + +devDependencies: + '@types/mustache': 4.1.2 + +packages: + + /@types/mustache/4.1.2: + resolution: {integrity: sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg==} + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + + /mustache/4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false diff --git a/packages/model/src/constants/context-model-type/context-model-type.ts b/packages/model/src/constants/context-model-type/context-model-type.ts new file mode 100644 index 0000000000000000000000000000000000000000..91407ff02ce34c59c1e832fc732462aaa9011f57 --- /dev/null +++ b/packages/model/src/constants/context-model-type/context-model-type.ts @@ -0,0 +1,124 @@ +/** + * 支持的发布对象类型对应在上下文中的名称 + * + * @author chitanda + * @date 2022-01-05 19:01:58 + * @export + * @class ContextModelTypeConst + */ +export class ContextModelTypeConst { + /** + * 系统级 + * + * @author chitanda + * @date 2022-01-18 10:01:49 + * @static + */ + static readonly SYSTEM = 'system'; + /** + * 系统模块 + * + * @author chitanda + * @date 2022-01-05 19:01:19 + * @static + */ + static readonly MODULES = 'modules'; + /** + * 实体 + * + * @author chitanda + * @date 2022-01-05 19:01:25 + * @static + */ + static readonly ENTITIES = 'entities'; + /** + * 服务接口 + * + * @author chitanda + * @date 2022-01-05 19:01:30 + * @static + */ + static readonly APIS = 'apis'; + /** + * 接口实体 + * + * @author chitanda + * @date 2022-01-05 19:01:35 + * @static + */ + static readonly API_ENTITIES = 'apiEntities'; + /** + * 接口实体 dto + * + * @author chitanda + * @date 2022-01-07 16:01:47 + * @static + */ + static readonly API_DTOS = 'apiDtos'; + /** + * 应用 + * + * @author chitanda + * @date 2022-01-05 19:01:40 + * @static + */ + static readonly APPS = 'apps'; + /** + * 应用模块 + * + * @author chitanda + * @date 2022-01-05 19:01:47 + * @static + */ + static readonly APP_MODULES = 'appModules'; + /** + * 应用实体 + * + * @author chitanda + * @date 2022-01-05 19:01:52 + * @static + */ + static readonly APP_ENTITIES = 'appEntities'; + /** + * 应用视图 + * + * @author chitanda + * @date 2022-01-05 19:01:57 + * @static + */ + static readonly PAGES = 'pages'; + /** + * 部件发布对象 + * + * @author chitanda + * @date 2022-01-05 19:01:05 + * @static + */ + static readonly CTRLS = 'ctrls'; + + /** + * 测试是否为上下文发布对象参数 + * + * @author chitanda + * @date 2022-01-05 19:01:13 + * @param {string} tag + * @return {*} {boolean} + */ + static test(tag: string): boolean { + switch (tag) { + case ContextModelTypeConst.MODULES: + case ContextModelTypeConst.ENTITIES: + case ContextModelTypeConst.APIS: + case ContextModelTypeConst.API_ENTITIES: + case ContextModelTypeConst.API_DTOS: + case ContextModelTypeConst.APPS: + case ContextModelTypeConst.APP_MODULES: + case ContextModelTypeConst.APP_ENTITIES: + case ContextModelTypeConst.PAGES: + case ContextModelTypeConst.CTRLS: + return true; + default: + return false; + } + } +} diff --git a/packages/model/src/constants/index.ts b/packages/model/src/constants/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c74aa116196e87cf84147f5c92dbe48c2476b3b3 --- /dev/null +++ b/packages/model/src/constants/index.ts @@ -0,0 +1 @@ +export { ContextModelTypeConst } from './context-model-type/context-model-type'; diff --git a/packages/model/src/index.ts b/packages/model/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e51f744817ebd703080c2f7c23fd75c6845f1d3 --- /dev/null +++ b/packages/model/src/index.ts @@ -0,0 +1,10 @@ +export * from './constants'; +export { TemplateModel } from './template-model'; +export { TemplateModelData } from './template-model-data'; + +// 全局类型声明 +declare global { + interface IModel { + [key: string]: any; + } +} diff --git a/packages/model/src/model/app/app-entity-model.ts b/packages/model/src/model/app/app-entity-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..4bd065f0a0219e92bc29f4011eb3a254613d3e3a --- /dev/null +++ b/packages/model/src/model/app/app-entity-model.ts @@ -0,0 +1,119 @@ +import { PSAppDataEntityImpl } from '@ibizlab/model'; +import * as pluralize from 'pluralize'; +import { CtrlModel } from './ctrl-model'; +import { PageModel } from './page-model'; + +/** + * 应用实体 + * + * @author chitanda + * @date 2022-01-03 10:01:45 + * @export + * @class AppEntityModel + * @extends {PSAppDataEntityImpl} + */ +export class AppEntityModel extends PSAppDataEntityImpl { + /** + * 实体资源路径 + * + * @author chitanda + * @date 2022-01-03 10:01:22 + * @protected + * @type {IModel[]} + */ + protected _appEntityResources: IModel[] = []; + get appEntityResources(): IModel[] { + if (this._appEntityResources.length === 0) { + const deRss = this.getMinorPSAppDERSs(); + if (deRss) { + deRss.forEach(rs => { + const major = rs.getMajorPSAppDataEntityMust(); + const minor = rs.getMinorPSAppDataEntityMust(); + const majorCodeName = major.codeName; + const minorCoeName = minor.codeName; + const pluralizeMajorCodeName = pluralize(majorCodeName).toLowerCase(); + const pluralizeMinorCoeName = pluralize(minorCoeName).toLowerCase(); + // 资源 + const resource: Record = {}; + resource.majorCodeName = majorCodeName.toLowerCase(); + resource.curCodeName = minorCoeName.toLowerCase(); + resource.path = `${pluralizeMajorCodeName}/:${majorCodeName}/${pluralizeMinorCoeName}/:${minorCoeName}`.toLowerCase(); + // 路径 + const deRsPaths: Record[] = []; + deRsPaths.push({ + pathName: pluralizeMajorCodeName, + parameterName: majorCodeName.toLowerCase(), + }); + deRsPaths.push({ + pathName: pluralizeMinorCoeName, + parameterName: minorCoeName.toLowerCase(), + }); + resource.deResPaths = deRsPaths; + this._appEntityResources.push(resource); + }); + } else { + const pluralizeCodeName = pluralize(this.codeName).toLowerCase(); + const deResPaths = [ + { + pathName: pluralizeCodeName, + parameterName: this.codeName.toLowerCase(), + }, + ]; + this._appEntityResources.push({ + curCodeName: this.codeName.toLowerCase(), + path: `${pluralizeCodeName}/:${this.codeName}`.toLowerCase(), + deResPaths, + }); + } + } + return this._appEntityResources; + } + + /** + * 实体下所有视图 + * + * @author chitanda + * @date 2021-12-30 11:12:19 + * @protected + * @type {PageModel[]} + */ + protected _pages: PageModel[] = []; + get pages(): PageModel[] { + if (this._pages.length === 0) { + const views = this.getAllPSAppViews(); + if (views) { + views + .filter(view => view.refFlag === true) + .forEach(view => { + this._pages.push(new PageModel(view)); + }); + } + } + return this._pages; + } + + /** + * 应用实体所有部件 + * + * @author chitanda + * @date 2021-12-28 19:12:09 + * @protected + * @type {CtrlModel[]} + */ + protected _ctrls: CtrlModel[] = []; + get ctrls(): CtrlModel[] { + if (this._ctrls.length === 0) { + const map: Map = new Map(); + this.pages.forEach(page => { + const ctrls = page.ctrls; + if (ctrls) { + ctrls.forEach(ctrl => { + map.set(ctrl.mosFilePath, ctrl); + }); + } + }); + this._ctrls = Array.from(map.values()); + } + return this._ctrls; + } +} diff --git a/packages/model/src/model/app/app-model.ts b/packages/model/src/model/app/app-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..f81136167d6d86f01600862db3cedcf7741e5b62 --- /dev/null +++ b/packages/model/src/model/app/app-model.ts @@ -0,0 +1,124 @@ +import { IPSAppDERS, PSApplicationImpl } from '@ibizlab/model'; +import * as pluralize from 'pluralize'; +import { AppEntityModel } from './app-entity-model'; +import { AppModuleModel } from './app-module-model'; +import { PageModel } from './page-model'; + +/** + * 应用模型 + * + * @author chitanda + * @date 2021-12-27 17:12:55 + * @export + * @class AppModel + * @extends {PSApplicationImpl} + */ +export class AppModel extends PSApplicationImpl { + /** + * 应用模块 + * + * @author chitanda + * @date 2021-12-27 17:12:52 + * @readonly + * @type {AppModuleModel[]} + */ + protected _appModules: AppModuleModel[] = []; + get appModules(): AppModuleModel[] { + if (this._appModules.length === 0) { + const modules = this.getAllPSAppModules(); + if (modules) { + modules.forEach(module => { + const moduleImpl = new AppModuleModel(); + moduleImpl.init(module.getPSModelService(), module.modelPath!, module.M, module.parent); + this._appModules.push(moduleImpl); + }); + } + } + return this._appModules; + } + + /** + * 应用实体 + * + * @author chitanda + * @date 2021-12-27 17:12:52 + * @readonly + * @type {AppEntityModel[]} + */ + protected _appEntities: AppEntityModel[] = []; + get appEntities(): AppEntityModel[] { + if (this._appEntities.length === 0) { + const entities = this.getAllPSAppDataEntities(); + if (entities) { + entities.forEach(entity => { + const entityImpl = new AppEntityModel(); + entityImpl.init(entity.getPSModelService(), entity.modelPath!, entity.M, entity.parent); + this._appEntities.push(entityImpl); + }); + } + } + return this._appEntities; + } + + /** + * 应用所有视图 + * + * @author chitanda + * @date 2021-12-27 18:12:43 + * @readonly + * @type {PageModel[]} + */ + protected _pages: PageModel[] = []; + get pages(): PageModel[] { + if (this._pages.length === 0) { + const views = this.getAllPSAppViews(); + if (views && views.length > 0) { + views + .filter(view => view.refFlag === true) + .forEach(view => { + this._pages.push(new PageModel(view)); + }); + } + } + return this._pages || []; + } + + /** + * 应用实体资源数据 + * + * @protected + * @type {Map} + * @memberof AppModel + */ + protected _appEntityResources: Map = new Map(); + get appEntityResources(): any[] { + const values: any[] = []; + if (this.appEntities.length > 0) { + this.appEntities.forEach((entity: AppEntityModel) => { + if (entity.minorPSAppDERSs && entity.minorPSAppDERSs.length > 0) { + entity.minorPSAppDERSs.forEach((appDERS: IPSAppDERS) => { + const majorCodeName: string = appDERS.majorPSAppDataEntity?.codeName as string; + const minorCodeName: string = appDERS.minorPSAppDataEntity?.codeName as string; + const temp: any = { + path: `${pluralize(majorCodeName).toLowerCase()}/:${majorCodeName.toLowerCase()}?/${pluralize(minorCodeName).toLowerCase()}/:${minorCodeName.toLowerCase()}?`, + majorCodeName: majorCodeName.toLowerCase(), + curCodeName: minorCodeName.toLowerCase(), + appDataEntity: entity, + }; + values.push(temp); + this._appEntityResources.set(`${majorCodeName}:${minorCodeName}`, temp); + }); + } else { + const temp = { + curCodeName: entity.codeName.toLowerCase(), + path: `${pluralize(entity.codeName).toLowerCase()}/:${entity.codeName.toLowerCase()}`, + appDataEntity: entity, + }; + values.push(temp); + this._appEntityResources.set(entity.codeName, temp); + } + }); + } + return values; + } +} diff --git a/packages/model/src/model/app/app-module-model.ts b/packages/model/src/model/app/app-module-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f2190efecca18c08b057b17b4d1bc060f4d48a1 --- /dev/null +++ b/packages/model/src/model/app/app-module-model.ts @@ -0,0 +1,43 @@ +import { PSAppModuleImpl } from '@ibizlab/model'; +import { AppModel } from './app-model'; +import { PageModel } from './page-model'; + +/** + * 应用模块 + * + * @author chitanda + * @date 2021-12-27 18:12:10 + * @export + * @class AppModuleModel + * @extends {PSAppModuleImpl} + */ +export class AppModuleModel extends PSAppModuleImpl { + /** + * 当前模块下的所有视图 + * + * @author chitanda + * @date 2021-12-30 11:12:19 + * @protected + * @type {PageModel[]} + */ + protected _pages: PageModel[] = []; + get pages(): PageModel[] { + if (this._pages.length === 0) { + const app = this.parent as AppModel; + const entities = app.appEntities; + if (entities) { + entities.forEach(appEntity => { + const pages = appEntity.pages.filter(page => { + const module = page.getPSAppModuleMust(); + if (module.mosFilePath === this.mosFilePath) { + return true; + } + return false; + }); + this._pages.push(...pages); + }); + } + } + return this._pages; + } +} diff --git a/packages/model/src/model/app/ctrl-model.ts b/packages/model/src/model/app/ctrl-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..d45791bdc5205597fc355a6a00419795bfb5374e --- /dev/null +++ b/packages/model/src/model/app/ctrl-model.ts @@ -0,0 +1,46 @@ +import { IPSControl, PSControlImpl } from '@ibizlab/model'; + +/** + * 部件发布对象 + * + * @author chitanda + * @date 2022-01-06 11:01:28 + * @export + * @class CtrlModel + */ +export class CtrlModel extends PSControlImpl { + get cls(): string { + return this.model.cls; + } + /** + * 部件类型 + * + * @author chitanda + * @date 2022-01-06 15:01:05 + * @readonly + * @type {string} + */ + get type(): string { + return this.controlType; + } + /** + * Creates an instance of CtrlModel. + * + * @author chitanda + * @date 2022-01-06 11:01:05 + * @param {IPSControl} model 已经实例化的部件 + */ + constructor(protected model: IPSControl) { + super(); + Object.assign(this, model); + const handle: ProxyHandler = { + get(target: any, prop: string) { + if (target[prop]) { + return target[prop]; + } + return target.model[prop]; + }, + }; + return new Proxy(this, handle); + } +} diff --git a/packages/model/src/model/app/page-model.ts b/packages/model/src/model/app/page-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a3c0804470fd08d580671c6bd34a35ee39d0052 --- /dev/null +++ b/packages/model/src/model/app/page-model.ts @@ -0,0 +1,107 @@ +import { IPSAppDataEntity, IPSAppView, PSAppViewImpl } from '@ibizlab/model'; +import { isNilOrEmpty } from 'qx-util'; +import { AppEntityModel } from './app-entity-model'; +import { AppModuleModel } from './app-module-model'; +import { CtrlModel } from './ctrl-model'; + +/** + * 视图发布对象 + * + * @author chitanda + * @date 2022-01-06 11:01:21 + * @export + * @class PageModel + */ +export class PageModel extends PSAppViewImpl { + /** + * 视图类型 + * + * @author chitanda + * @date 2022-01-06 14:01:44 + * @readonly + * @type {string} + */ + get type(): string { + return this.viewType; + } + /** + * 当前视图所属应用实体 + * + * @author chitanda + * @date 2022-02-10 13:02:08 + * @protected + * @type {(AppModuleModel | null)} + */ + protected _appModule: AppModuleModel | null = null; + get appModule(): AppModuleModel | null { + if (!this._appModule) { + const module = this.psAppModule; + if (module != null) { + const moduleImpl = new AppModuleModel(); + moduleImpl.init(module.getPSModelService(), module.modelPath!, module.M, module.parent); + this._appModule = moduleImpl; + } + } + return this._appModule; + } + /** + * 应用实体 + * + * @author chitanda + * @date 2022-02-10 14:02:32 + * @protected + * @type {(AppEntityModel | null)} + */ + protected _appEntity: AppEntityModel | null = null; + get appEntity(): AppEntityModel | null { + if (!this._appEntity) { + const module = this.psAppDataEntity; + if (module != null) { + const appEntityImpl = new AppEntityModel(); + appEntityImpl.init(module.getPSModelService(), module.modelPath!, module.M, module.parent); + this._appEntity = appEntityImpl; + } + } + return this._appEntity; + } + /** + * 视图部件 + * + * @author chitanda + * @date 2022-01-06 15:01:15 + * @protected + * @type {CtrlModel[]} + */ + protected _ctrls: CtrlModel[] = []; + get ctrls(): CtrlModel[] { + if (isNilOrEmpty(this._ctrls)) { + const ctrls = this.getPSControls(); + if (ctrls) { + ctrls.forEach(ctrl => { + this._ctrls.push(new CtrlModel(ctrl)); + }); + } + } + return this._ctrls; + } + /** + * Creates an instance of PageModel. + * + * @author chitanda + * @date 2022-01-06 11:01:19 + * @param {IPSAppView} model 已经实例化的视图 + */ + constructor(protected model: IPSAppView) { + super(); + Object.assign(this, model); + const handle: ProxyHandler = { + get(target: any, prop: string) { + if (target[prop]) { + return target[prop]; + } + return target.model[prop]; + }, + }; + return new Proxy(this, handle); + } +} diff --git a/packages/model/src/model/global-model.ts b/packages/model/src/model/global-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..ddd0ff53238c92af725ef0ca501a2d44c58af8f7 --- /dev/null +++ b/packages/model/src/model/global-model.ts @@ -0,0 +1,83 @@ +import { IPSSysSFPub } from '@ibizlab/model'; +import { AppModel } from '.'; +import { SystemModel } from './system/system-model'; + +/** + * 全局模型,默认附加 + * + * @author chitanda + * @date 2022-01-03 10:01:57 + * @export + * @class GlobalModel + */ +export class GlobalModel { + /** + * 发布对象 + * + * @author chitanda + * @date 2021-12-27 17:12:43 + * @type {IPSSysSFPub} + */ + pub?: IPSSysSFPub; + /** + * 项目名称 + * + * @author chitanda + * @date 2022-01-03 10:01:37 + * @type {string} + */ + projectName: string; + /** + * 项目描述 + * + * @author chitanda + * @date 2022-01-03 10:01:52 + * @type {string} + */ + projectDesc: string; + /** + * 包名称 + * + * @author chitanda + * @date 2022-01-03 10:01:35 + * @type {string} + */ + packageName: string; + /** + * 包路径 + * + * @author chitanda + * @date 2022-01-05 18:01:46 + * @type {string} + */ + packagePath: string; + + /** + * Creates an instance of GlobalModel. + * + * @author chitanda + * @date 2022-01-03 10:01:06 + * @param {SystemModel} system 系统发布模型 + * @param {AppModel} [app] 应用发布模型 + */ + constructor(public system: SystemModel, public app?: AppModel) { + this.projectName = system.codeName.toLowerCase(); + this.projectDesc = system.name; + this.packageName = this.projectName; + // 计算发布对象 + const pubs = system.getAllPSSysSFPubs(); + if (pubs && pubs.length > 0) { + const pub = pubs.find(pub => pub.mainPSSysSFPub === true); + if (pub) { + this.pub = pub; + } else { + this.pub = pubs[0]; + } + this.projectName = this.pub.codeName.toLowerCase(); + this.projectDesc = this.pub.name; + this.packageName = this.pub.pKGCodeName; + } + // 包路径 + this.packagePath = this.packageName.replace(/\./g, '/'); + } +} diff --git a/packages/model/src/model/index.ts b/packages/model/src/model/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..19cc7cd016d14399237cb1ecb18ac4812cd9cf84 --- /dev/null +++ b/packages/model/src/model/index.ts @@ -0,0 +1,13 @@ +// 应用 +export { AppEntityModel } from './app/app-entity-model'; +export { AppModel } from './app/app-model'; +export { AppModuleModel } from './app/app-module-model'; +// 系统 +export { ApiDtoModel } from './system/api-dto-model'; +export { ApiEntityModel } from './system/api-entity-model'; +export { ApiModel } from './system/api-model'; +export { MethodDtoFieldModel } from './system/method-dto-field-model'; +export { EntityModel } from './system/entity-model'; +export { FieldModel } from './system/field-model'; +export { SystemModel } from './system/system-model'; +export { ModuleModel } from './system/module-model'; diff --git a/packages/model/src/model/system/api-dto-model.ts b/packages/model/src/model/system/api-dto-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf95743c594b99490ae069f71b9978e3fea92ec5 --- /dev/null +++ b/packages/model/src/model/system/api-dto-model.ts @@ -0,0 +1,36 @@ +import { PSDEMethodDTOImpl } from '@ibizlab/model'; +import { MethodDtoFieldModel } from './method-dto-field-model'; + +/** + * 服务接口 DTO + * + * @author chitanda + * @date 2022-01-07 17:01:27 + * @export + * @class ApiDtoModel + * @extends {PSDEMethodDTOImpl} + */ +export class ApiDtoModel extends PSDEMethodDTOImpl { + get codeName(): string { + return this.name; + } + + get apiEntity() { + return this.parent; + } + + protected _apiDtoFields: MethodDtoFieldModel[] = []; + get apiDtoFields() { + if (this._apiDtoFields.length === 0) { + const fields = this.getPSDEMethodDTOFields(); + if (fields) { + fields.forEach(item => { + const field = new MethodDtoFieldModel(); + field.init(item.getPSModelService(), item.modelPath, item.M, item.parent); + this._apiDtoFields.push(field); + }); + } + } + return this._apiDtoFields; + } +} diff --git a/packages/model/src/model/system/api-entity-model.ts b/packages/model/src/model/system/api-entity-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5843a2a5ecf1d02cf712747a521ec0ad9950d62 --- /dev/null +++ b/packages/model/src/model/system/api-entity-model.ts @@ -0,0 +1,36 @@ +import { ApiDtoModel } from './api-dto-model'; +import { EntityModel } from './entity-model'; + +/** + * 接口实体 + * + * @author chitanda + * @date 2022-01-05 18:01:37 + * @export + * @class ApiEntityModel + * @extends {PSAppDataEntityImpl} + */ +export class ApiEntityModel extends EntityModel { + get api() { + return this.parent; + } + + // get entity() { + // return this.getPSModelService().getPSDataEntity(this.entityName); + // } + + protected _apiDtos: ApiDtoModel[] = []; + get apiDtos() { + if (this._apiDtos.length === 0) { + const dtos = this.getAllPSDEMethodDTOs(); + if (dtos) { + dtos.forEach(item => { + const dto = new ApiDtoModel(); + dto.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._apiDtos.push(dto); + }); + } + } + return this._apiDtos; + } +} diff --git a/packages/model/src/model/system/api-model.ts b/packages/model/src/model/system/api-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..3363154bdc2c367c07ec1fe1c49b4e4e2dfdd5fe --- /dev/null +++ b/packages/model/src/model/system/api-model.ts @@ -0,0 +1,37 @@ +import { PSSysServiceAPIImpl } from '@ibizlab/model'; +import { ApiEntityModel } from './api-entity-model'; + +/** + * 服务接口 + * + * @author chitanda + * @date 2021-12-30 11:12:16 + * @export + * @class ApiModel + * @extends {PSSysServiceAPIImpl} + */ +export class ApiModel extends PSSysServiceAPIImpl { + /** + * 所有 api 实体 + * + * @author chitanda + * @date 2021-12-30 11:12:37 + * @protected + * @type {ApiEntityModel[]} + */ + protected _apiEntities: ApiEntityModel[] = []; + get apiEntities(): ApiEntityModel[] { + if (this._apiEntities.length === 0) { + const apis = this.getPSDEServiceAPIs(); + if (apis) { + apis.forEach(api => { + const entity = api.getPSDataEntityMust(); + const apiEntity = new ApiEntityModel(); + apiEntity.init(entity.getPSModelService(), entity.modelPath!, entity.M, entity.parent); + this._apiEntities.push(apiEntity); + }); + } + } + return this._apiEntities; + } +} diff --git a/packages/model/src/model/system/entity-model.ts b/packages/model/src/model/system/entity-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..734c386835b67220ca315cfe8cb75b61f157f997 --- /dev/null +++ b/packages/model/src/model/system/entity-model.ts @@ -0,0 +1,59 @@ +import { PSDataEntityImpl } from '@ibizlab/model'; +import { FieldModel } from './field-model'; + +/** + * 实体模型 + * + * @author chitanda + * @date 2021-12-27 19:12:54 + * @export + * @class EntityModel + * @extends {PSDataEntityImpl} + */ +export class EntityModel extends PSDataEntityImpl { + get entityName(): string { + return this.name; + } + + get module(): string { + return this.getPSSystemModuleMust().codeName.toLowerCase(); + } + + protected _fields: FieldModel[] = []; + get fields(): FieldModel[] { + if (this._fields.length === 0) { + const fields = this.getAllPSDEFields(); + if (fields) { + fields.forEach(item => { + const field = new FieldModel(); + field.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._fields.push(field); + }); + } + } + return this._fields; + } + + /** + * 模型子类型 + * + * @author chitanda + * @date 2021-12-27 19:12:52 + * @readonly + * @type {string} + */ + get type(): string { + switch (this.storageMode) { + case 0: + return 'NONE'; + case 1: + return 'SQL'; + case 2: + return 'NoSQL'; + case 4: + return 'ServiceAPI'; + default: + return 'SQL'; + } + } +} diff --git a/packages/model/src/model/system/field-model.ts b/packages/model/src/model/system/field-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0daaac2b7e544c48224745b963b5764b7f7f953 --- /dev/null +++ b/packages/model/src/model/system/field-model.ts @@ -0,0 +1,41 @@ +import { PSDEFieldImpl } from '@ibizlab/model'; +import { camelCase, eq } from 'lodash'; + +/** + * 属性模型 + * + * @author chitanda + * @date 2022-01-05 14:01:53 + * @export + * @class FieldModel + * @extends {PSDEFieldImpl} + */ +export class FieldModel extends PSDEFieldImpl { + get fieldName(): string { + return this.name; + } + + get columnName(): string { + return this.fieldName.toLowerCase(); + } + + get alias(): string | null { + const alias: string = camelCase(this.codeName); + if (eq(this.columnName, alias) && this.dataType === 'PICKUP') { + return null; + } + return alias; + } + + get jsonName(): string { + return this.codeName.toLowerCase(); + } + + protected _timeType: string = 'timeType 暂未支持'; + get timeType(): string { + this.getFormat(); + return this._timeType; + } + + protected getFormat() {} +} diff --git a/packages/model/src/model/system/method-dto-field-model.ts b/packages/model/src/model/system/method-dto-field-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..08cabe7df34d312b3cd8b8111d9a7c07a9ea7611 --- /dev/null +++ b/packages/model/src/model/system/method-dto-field-model.ts @@ -0,0 +1,53 @@ +import { PSDEMethodDTOFieldImpl } from '@ibizlab/model'; +import { isNilOrEmpty, notNilEmpty } from 'qx-util'; + +/** + * DTO 属性 + * + * @author chitanda + * @date 2022-01-09 10:01:45 + * @export + * @class MethodDtoFieldModel + * @extends {PSDEMethodDTOFieldImpl} + */ +export class MethodDtoFieldModel extends PSDEMethodDTOFieldImpl { + get jsonName(): string { + return this.name.toLowerCase(); + } + + get logicName(): string { + if (isNilOrEmpty(this.M.logicName)) { + return this.getRefPSDataEntityMust().logicName; + } + return this.M.logicName; + } + + get javaType(): string { + if (this.type === 'DTO') { + // return this.getRefPSDEMethodDTOMust().name; + } else if (this.type === 'DTOS') { + // return `List<${this.getRefPSDEMethodDTOMust().name}>`; + } else if (this.type === 'SIMPLE') { + // return `simple 类型暂未实现`; + // return ``;PropType.findType(getPSDEMethodDTOField().getStdDataType()).java; + } else if (this.type === 'SIMPLES') { + // return `simples 类型暂未实现`; + // return `List<%s>`;String.format('List<%s>', PropType.findType(getPSDEMethodDTOField().getStdDataType()).java); + } + return 'javaType 暂未实现'; + } + + get predefinedType(): boolean { + if (this.getPSDEField()) { + return notNilEmpty(this.getPSDEFieldMust().predefinedType); + } + return false; + } + + get keyDEField(): boolean { + if (this.getPSDEField()) { + return this.getPSDEFieldMust().keyDEField; + } + return false; + } +} diff --git a/packages/model/src/model/system/module-model.ts b/packages/model/src/model/system/module-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..272e5aa1ee0a1c4205aff15925a38f257c168f4d --- /dev/null +++ b/packages/model/src/model/system/module-model.ts @@ -0,0 +1,36 @@ +import { IPSDataEntity, PSSystemModuleImpl } from '@ibizlab/model'; +import { EntityModel } from './entity-model'; + +/** + * 系统模块 + * + * @author chitanda + * @date 2021-12-27 18:12:23 + * @export + * @class ModuleModel + * @extends {PSSystemModuleImpl} + */ +export class ModuleModel extends PSSystemModuleImpl { + /** + * 模块实体 + * + * @author chitanda + * @date 2022-01-06 14:01:47 + * @readonly + * @type {EntityModel[]} + */ + protected _entities: EntityModel[] = []; + get entities(): EntityModel[] { + if (this._entities.length === 0) { + const entities = this.getAllPSDataEntities(); + if (entities) { + entities.forEach(item => { + const entity = new EntityModel(); + entity.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._entities.push(entity); + }); + } + } + return this._entities; + } +} diff --git a/packages/model/src/model/system/system-model.ts b/packages/model/src/model/system/system-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..adcf5f609096f121619a84cbaabcad60ea870d61 --- /dev/null +++ b/packages/model/src/model/system/system-model.ts @@ -0,0 +1,168 @@ +import { IPSSysSFPub, PSSystemImpl } from '@ibizlab/model'; +import { isNilOrEmpty } from 'qx-util'; +import { AppModel } from '../app/app-model'; +import { ApiModel } from './api-model'; +import { ModuleModel } from './module-model'; + +/** + * 系统模型 + * + * @author chitanda + * @date 2021-12-27 14:12:41 + * @export + * @class SystemModel + */ +export class SystemModel extends PSSystemImpl { + /** + * 发布对象 + * + * @author chitanda + * @date 2021-12-27 17:12:43 + * @type {IPSSysSFPub} + */ + pub?: IPSSysSFPub; + + get codeName(): string { + if (this.pub?.codeName) { + return this.pub.codeName; + } + return this.M.codeName; + } + + get name(): string { + if (this.pub?.name) { + return this.pub.name; + } + return this.M.name; + } + + enableDS: boolean = false; + enableES: boolean = false; + enableMongo: boolean = false; + enableMQ: boolean = false; + enableOAuth2: boolean = false; + enableGlobalTransaction: boolean = false; + enableMysql: boolean = false; + enableOracle: boolean = false; + enableDameng: boolean = false; + enablePostgreSQL: boolean = false; + enableDyna: boolean = false; + enableWorkflow: boolean = false; + + mqSubscribes: string[] = []; + + /** + * 系统模块 + * + * @author chitanda + * @date 2022-01-05 18:01:19 + * @type {ModuleModel[]} + */ + protected _modules: ModuleModel[] = []; + get modules(): ModuleModel[] { + if (isNilOrEmpty(this._modules)) { + const modules = this.getAllPSSystemModules() || []; + modules.forEach(item => { + const module = new ModuleModel(); + module.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._modules.push(module); + }); + } + return this._modules; + } + /** + * 系统服务接口 + * + * @author chitanda + * @date 2022-01-05 18:01:05 + * @type {ServiceApiModel[]} + */ + protected _apis: ApiModel[] = []; + get apis(): ApiModel[] { + if (isNilOrEmpty(this._apis)) { + const apis = this.getAllPSSysServiceAPIs() || []; + apis.forEach(item => { + const api = new ApiModel(); + api.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._apis.push(api); + }); + } + return this._apis; + } + /** + * 系统应用 + * + * @author chitanda + * @date 2022-01-05 17:01:36 + * @type {AppModel[]} + */ + protected _apps: AppModel[] = []; + get apps(): AppModel[] { + if (isNilOrEmpty(this._apps)) { + const apps = this.getAllPSApps() || []; + apps.forEach(item => { + const app = new AppModel(); + app.init(item.getPSModelService(), item.modelPath!, item.M, item.parent); + this._apps.push(app); + }); + } + return this._apps; + } + + protected onInit(): void { + // 计算发布对象 + const pubs = this.getAllPSSysSFPubs(); + if (pubs && pubs.length > 0) { + const pub = pubs.find(pub => pub.mainPSSysSFPub === true); + if (pub) { + this.pub = pub; + } else { + this.pub = pubs[0]; + } + } + // 计算启用的数据源 + this.getAllPSDataEntities()?.forEach(entity => { + const { storageMode, dSLink } = entity; + if ((storageMode === 1 || storageMode === 2) && dSLink === 'DEFAULT') { + this.enableDS = true; + } + if (storageMode === 2) { + this.enableMongo = true; + } + const wfs = entity.getAllPSDEWFs(); + if (wfs && wfs.length > 0) { + this.enableWorkflow = true; + } + if (entity.userTag === 'elasticsearch') { + this.enableES = true; + } + // 实体数据同步集合 + const dataSyncs = entity.getAllPSDEDataSyncs(); + if (dataSyncs && dataSyncs.length > 0) { + this.enableMQ = true; + dataSyncs.forEach(dataSync => { + if (dataSync.getInPSSysDataSyncAgent()) { + this.mqSubscribes.push(dataSync.codeName); + } + }); + } + // 实体数据库配置 + const dbConfigs = entity.getAllPSDEDBConfigs(); + if (dbConfigs && dbConfigs.length > 0) { + dbConfigs.forEach(dbConfig => { + const dbType = dbConfig.dBType.toLowerCase().replace('mysql5', 'mysql'); + switch (dbType) { + case 'mysql': + return (this.enableMysql = true); + case 'oracle': + return (this.enableOracle = true); + case 'postgresql': + return (this.enablePostgreSQL = true); + case 'dameng': + return (this.enableDameng = true); + } + }); + } + }); + } +} diff --git a/packages/model/src/template-model-data.ts b/packages/model/src/template-model-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ecd108214c0ec3b8f540575e413979f9c84671c --- /dev/null +++ b/packages/model/src/template-model-data.ts @@ -0,0 +1,238 @@ +import { kebabCase } from 'lodash'; +import { ApiEntityModel, ApiModel, AppEntityModel, AppModel, AppModuleModel, EntityModel, ModuleModel } from './model'; +import { CtrlModel } from './model/app/ctrl-model'; +import { PageModel } from './model/app/page-model'; +import { GlobalModel } from './model/global-model'; +import { ApiDtoModel } from './model/system/api-dto-model'; + +/** + * 模板单个渲染对象 + * + * @author chitanda + * @date 2022-01-05 10:01:57 + * @export + * @class TemplateModelData + */ +export class TemplateModelData { + /** + * 模型数据 + * + * @author chitanda + * @date 2022-01-05 10:01:11 + * @protected + * @type {Record} + */ + protected readonly data: Record = {}; + /** + * Creates an instance of TemplateModelData. + * + * @author chitanda + * @date 2022-01-05 10:01:55 + * @param {GlobalModel} global + */ + constructor(global: GlobalModel) { + if (global) { + Object.assign(this.data, global); + } + } + + /** + * 新增模型项 + * + * @author chitanda + * @date 2022-01-05 10:01:14 + * @param {string} key + * @param {unknown} val + */ + set(key: string, val: unknown): void { + this.data[key] = val; + } + + /** + * 合并模型 + * + * @author chitanda + * @date 2022-01-05 10:01:10 + * @param {unknown} obj + */ + assign(obj: unknown): void { + if (obj) { + Object.assign(this.data, obj); + } + } + + /** + * 判断属性是否存在 + * + * @author chitanda + * @date 2022-01-05 10:01:02 + * @param {string} key + * @return {*} {boolean} + */ + exist(key: string): boolean { + return !!this.data[key]; + } + + /** + * 获取计算的模型 + * + * @author chitanda + * @date 2022-01-05 10:01:30 + * @return {*} {Record} + */ + getModel(): Record { + return this.data; + } + + /** + * 设置当前发布类型 + * + * @author chitanda + * @date 2022-01-17 19:01:51 + * @param {string} type + */ + setType(type: string): void { + this.set('pubType', type); + } + + /** + * 设置模块数据 + * + * @author chitanda + * @date 2022-01-06 14:01:17 + * @param {ModuleModel} module + */ + setModule(module: ModuleModel): void { + this.set('module', module); + this.set('modules', module.codeName.toLowerCase()); + } + + /** + * 设置实体数据 + * + * @author chitanda + * @date 2022-01-06 14:01:33 + * @param {EntityModel} entity + */ + setEntity(entity: EntityModel): void { + this.set('entity', entity); + const text = entity.codeName; + this.set('entities', text); + if (entity.type) { + this.set(`entities:${entity.type}`, text); + } + } + + /** + * 设置服务接口 + * + * @author chitanda + * @date 2022-01-06 14:01:45 + * @param {ApiModel} api + */ + setApi(api: ApiModel): void { + this.set('api', api); + this.set('apis', api.codeName.toLowerCase()); + } + + /** + * 设置接口实体 + * + * @author chitanda + * @date 2022-01-06 14:01:38 + * @param {ApiEntityModel} apiEntity + */ + setApiEntity(apiEntity: ApiEntityModel): void { + this.set('apiEntity', apiEntity); + const text = apiEntity.codeName; + this.set('apiEntities', text); + if (apiEntity.type) { + this.set(`apiEntities:${apiEntity.type}`, text); + } + } + + /** + * 设置接口实体 DTO + * + * @author chitanda + * @date 2022-01-07 16:01:15 + * @param {ApiDtoModel} apiDto + */ + setApiDto(apiDto: ApiDtoModel): void { + this.set('apiDto', apiDto); + const text = apiDto.codeName; + this.set('apiDtos', text); + this.set(`apiDtos:${apiDto.type}`, text); + } + + /** + * 设置应用 + * + * @author chitanda + * @date 2022-01-06 14:01:42 + * @param {AppModel} app + */ + setApp(app: AppModel): void { + this.set('app', app); + const text = app.codeName.toLowerCase(); + this.set('apps', text); + } + + /** + * 设置应用模块 + * + * @author chitanda + * @date 2022-01-06 14:01:13 + * @param {AppModuleModel} appModule + */ + setAppModule(appModule: AppModuleModel): void { + this.set('appModule', appModule); + const text = kebabCase(appModule.codeName).toLowerCase(); + this.set('appModules', text); + } + + /** + * 设置应用模块 + * + * @author chitanda + * @date 2022-01-06 14:01:57 + * @param {AppEntityModel} appEntity + */ + setAppEntity(appEntity: AppEntityModel): void { + this.set('appEntity', appEntity); + const text = kebabCase(appEntity.codeName).toLowerCase(); + this.set('appEntities', text); + } + + /** + * 设置界面 + * + * @author chitanda + * @date 2022-01-06 14:01:42 + * @param {PageModel} page + */ + setPage(page: PageModel): void { + this.set('page', page); + const text = kebabCase(page.codeName).toLowerCase(); + this.set('pages', text); + if (page.type) { + this.set(`pages:${page.type}`, text); + } + } + + /** + * 设置部件 + * + * @author chitanda + * @date 2022-01-06 15:01:41 + * @param {CtrlModel} ctrl + */ + setCtrl(ctrl: CtrlModel): void { + this.set('ctrl', ctrl); + const text = kebabCase(ctrl.codeName).toLowerCase(); + this.set('ctrls', text); + if (ctrl.type) { + this.set(`ctrls:${ctrl.type}`, text); + } + } +} diff --git a/packages/model/src/template-model.ts b/packages/model/src/template-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..766d192f22de21673b2fc9107f9ea24195f6811a --- /dev/null +++ b/packages/model/src/template-model.ts @@ -0,0 +1,293 @@ +import { IPSModelService, PSModelServiceImpl } from '@ibizlab/model'; +import { TemplateContextItem, TemplateFile } from '@ibizlab/template-generator'; +import { readFileSync } from 'fs-extra'; +import { join } from 'path'; +import { ContextModelTypeConst } from './constants'; +import { GlobalModel } from './model/global-model'; +import { AppModel, SystemModel } from './model'; +import { TemplateModelData } from './template-model-data'; + +/** + * 模板模型 + * + * @author chitanda + * @date 2021-12-27 14:12:44 + * @export + * @class TemplateModel + */ +export class TemplateModel { + /** + * 模型服务 + * + * @author chitanda + * @date 2021-12-27 14:12:53 + * @type {IPSModelService} + */ + service: IPSModelService; + + /** + * 根发布模型 + * + * @author chitanda + * @date 2022-01-05 16:01:45 + * @type {(SystemModel | AppModel)} + */ + root!: SystemModel | AppModel; + + /** + * 当前发布系统 + * + * @author chitanda + * @date 2022-01-06 14:01:58 + * @readonly + * @type {SystemModel} + */ + get system(): SystemModel { + return this.root as SystemModel; + } + + /** + * 发布模式为应用时, 当前发布的应用 + * + * @author chitanda + * @date 2022-01-06 14:01:07 + * @readonly + * @type {AppModel} + */ + get app(): AppModel { + return this.root as AppModel; + } + + /** + * 全局模型 + * + * @author chitanda + * @date 2021-12-28 14:12:22 + * @protected + * @type {GlobalModel} + */ + protected globalModel!: GlobalModel; + + /** + * Creates an instance of TemplateModel. + * + * @author chitanda + * @date 2022-01-05 16:01:18 + * @param {string} modelFolder 模型文件夹 + * @param {('sys' | 'app')} [mode='sys'] 发布模式: sys 系统、app 应用 + */ + constructor(protected modelFolder: string, protected mode: 'sys' | 'app' = 'sys') { + this.service = new PSModelServiceImpl(this.readModelJson.bind(this)); + this.onInit(); + } + + /** + * 读取模型 json 文件 + * + * @author chitanda + * @date 2022-01-05 16:01:21 + * @protected + * @param {string} modelPath + * @return {*} {IModel} + */ + protected readModelJson(modelPath: string): IModel { + const path = join(this.modelFolder, modelPath); + const content = readFileSync(path, 'utf-8'); + return JSON.parse(content); + } + + /** + * 初始化 + * + * @author chitanda + * @date 2022-01-05 17:01:34 + * @protected + */ + protected onInit(): void { + // 初始化跟模型 + { + let path: string = ''; + if (this.mode === 'app') { + path = 'PSSYSAPP.json'; + this.root = new AppModel(); + } else { + path = 'PSSYSTEM.json'; + const data = this.readModelJson(path); + this.root = new SystemModel(); + this.root.init(this.service, path, data); + this.globalModel = new GlobalModel(this.system); + } + const model = this.readModelJson(path); + this.root.init(this.service, model.dynaModelFilePath, model); + } + } + + /** + * 根据模型文件计算模型 + * + * @author chitanda + * @date 2021-12-27 18:12:41 + * @param {TemplateFile} file + * @return {*} {TemplateModelData[]} + */ + getModelData(file: TemplateFile): TemplateModelData[] { + const contexts = file.contexts; + let ctx!: TemplateContextItem; + for (let i = contexts.length - 1; i >= 0; i--) { + if (ContextModelTypeConst.test(contexts[i].name)) { + ctx = contexts[i]; + break; + } + } + if (ctx) { + return this.getModelDataByType(ctx.name, ctx.subType); + } + return this.getModelDataByType(''); + } + + /** + * 获取指定类型的上下文模型数据 + * + * @description type 具体类型: {@link ContextModelTypeConst} + * @author chitanda + * @date 2022-01-18 10:01:26 + * @param {string} type + * @param {(string | null)} [subType=null] + * @return {*} {TemplateModelData[]} + */ + getModelDataByType(type: string, subType: string | null = null): TemplateModelData[] { + const models: TemplateModelData[] = []; + switch (type) { + case ContextModelTypeConst.MODULES: + this.system.modules.forEach(module => { + const model = new TemplateModelData(this.globalModel); + model.setModule(module); + model.setType('module'); + models.push(model); + }); + break; + case ContextModelTypeConst.ENTITIES: + this.system.modules.forEach(module => { + module.entities.forEach(entity => { + if (subType && subType !== entity.type) { + return; + } + const model = new TemplateModelData(this.globalModel); + model.setModule(module); + model.setEntity(entity); + model.setType('entity'); + models.push(model); + }); + }); + break; + case ContextModelTypeConst.APIS: + this.system.apis.forEach(api => { + const model = new TemplateModelData(this.globalModel); + model.setApi(api); + model.setType('api'); + models.push(model); + }); + break; + case ContextModelTypeConst.API_ENTITIES: + this.system.apis.forEach(api => { + api.apiEntities.forEach(apiEntity => { + const model = new TemplateModelData(this.globalModel); + model.setApi(api); + model.setApiEntity(apiEntity); + model.setType('apiEntity'); + models.push(model); + }); + }); + break; + case ContextModelTypeConst.API_DTOS: + this.system.apis.forEach(api => { + api.apiEntities.forEach(apiEntity => { + apiEntity.apiDtos.forEach(apiDto => { + if (subType && subType !== apiDto.type) { + return; + } + const model = new TemplateModelData(this.globalModel); + model.setApi(api); + model.setApiEntity(apiEntity); + model.setApiDto(apiDto); + model.setType('apiDto'); + models.push(model); + }); + }); + }); + break; + case ContextModelTypeConst.APPS: + this.system.apps.forEach(app => { + const model = new TemplateModelData(this.globalModel); + model.setApp(app); + model.setType('app'); + models.push(model); + }); + break; + case ContextModelTypeConst.APP_MODULES: + this.system.apps.forEach(app => { + app.appModules.forEach(appModule => { + const model = new TemplateModelData(this.globalModel); + model.setApp(app); + model.setAppModule(appModule); + model.setType('appModule'); + models.push(model); + }); + }); + break; + case ContextModelTypeConst.APP_ENTITIES: + this.system.apps.forEach(app => { + app.appEntities.forEach(appEntity => { + const model = new TemplateModelData(this.globalModel); + model.setApp(app); + model.setAppEntity(appEntity); + model.setType('appEntity'); + models.push(model); + }); + }); + break; + case ContextModelTypeConst.PAGES: + this.system.apps.forEach(app => { + app.pages.forEach(page => { + if (subType && subType !== page.type) { + return; + } + console.log(page.type); + const model = new TemplateModelData(this.globalModel); + model.setApp(app); + if (page.appModule) { + model.setAppModule(page.appModule); + } + model.setPage(page); + model.setType('page'); + models.push(model); + }); + }); + break; + case ContextModelTypeConst.CTRLS: + this.system.apps.forEach(app => { + app.pages.forEach(page => { + page.ctrls.forEach(ctrl => { + if (subType && subType !== ctrl.type) { + return; + } + console.log(ctrl.type); + const model = new TemplateModelData(this.globalModel); + model.setApp(app); + if (page.appEntity) { + model.setAppEntity(page.appEntity); + } + model.setCtrl(ctrl); + model.setType('ctrl'); + models.push(model); + }); + }); + }); + break; + default: + const model = new TemplateModelData(this.globalModel); + models.push(model); + } + return models; + } +} diff --git a/packages/model/tsconfig.json b/packages/model/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/model/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/packages/template/.npmignore b/packages/template/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c44c4e1a747d986bbc70549416ba53e2ea6777 --- /dev/null +++ b/packages/template/.npmignore @@ -0,0 +1,10 @@ +**/.vscode +.gitignore +.prettierrc +node_modules/ +.DS_Store + +# configuration +pnpm-lock.yaml +tsconfig.json + diff --git a/packages/template/.npmrc b/packages/template/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..214c29d1395919ce175f26d140526368127981ba --- /dev/null +++ b/packages/template/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/packages/template/package.json b/packages/template/package.json new file mode 100644 index 0000000000000000000000000000000000000000..1c4100f32c2c6fdbd38cfbdbf1593fce3aeb7f6b --- /dev/null +++ b/packages/template/package.json @@ -0,0 +1,25 @@ +{ + "name": "@ibizlab/template", + "version": "0.1.10", + "description": "核心代码", + "main": "out/index.js", + "types": "out/types/index.d.ts", + "scripts": { + "dev": "tsc --watch", + "build": "npm run lint && npm run clean && tsc --build", + "lint": "eslint src/**/*.ts", + "clean": "rimraf out", + "prepublish:next": "npm run build", + "publish:next": "npm publish --access public --tag next", + "prepublish:npm": "npm run build", + "publish:npm": "npm publish --access public" + }, + "author": "chitanda", + "license": "MIT", + "dependencies": { + "@ibizlab/template-core": "^0.1.9", + "@ibizlab/template-generator": "^0.1.10", + "@ibizlab/template-handlebars": "^0.1.10", + "@ibizlab/template-model": "^0.1.10" + } +} diff --git a/packages/template/pnpm-lock.yaml b/packages/template/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10bd3b0de10f614124e15abb99b8e5871705c10f --- /dev/null +++ b/packages/template/pnpm-lock.yaml @@ -0,0 +1,50 @@ +lockfileVersion: 5.3 + +specifiers: + '@types/mustache': ^4.1.2 + fs-extra: ^10.0.0 + mustache: ^4.2.0 + +dependencies: + fs-extra: 10.0.0 + mustache: 4.2.0 + +devDependencies: + '@types/mustache': 4.1.2 + +packages: + + /@types/mustache/4.1.2: + resolution: {integrity: sha512-c4OVMMcyodKQ9dpwBwh3ofK9P6U9ZktKU9S+p33UqwMNN1vlv2P0zJZUScTshnx7OEoIIRcCFNQ904sYxZz8kg==} + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /graceful-fs/4.2.8: + resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + + /mustache/4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false diff --git a/packages/template/src/index.ts b/packages/template/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..24632e53c9fbdf2127a365ab7aa561adf16ef901 --- /dev/null +++ b/packages/template/src/index.ts @@ -0,0 +1,2 @@ +export { template, IBizLabTemplate } from './template'; +export { TemplatePreview } from './template-preview'; diff --git a/packages/template/src/interface/index.ts b/packages/template/src/interface/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..748718e49f23bb56f16c4bf9c5917531ba867c16 --- /dev/null +++ b/packages/template/src/interface/index.ts @@ -0,0 +1 @@ +export { TemplateOptions } from './template-options/template-options'; diff --git a/packages/template/src/interface/template-options/template-options.ts b/packages/template/src/interface/template-options/template-options.ts new file mode 100644 index 0000000000000000000000000000000000000000..502fd7f8561b2839d64070d2cba53c09ce40414e --- /dev/null +++ b/packages/template/src/interface/template-options/template-options.ts @@ -0,0 +1,13 @@ +import { Options } from '@ibizlab/template-core'; + +/** + * 模板参数 + * + * @author chitanda + * @date 2021-12-23 14:12:29 + * @export + * @interface TemplateOptions + * @extends {Options} + */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface TemplateOptions extends Options {} diff --git a/packages/template/src/template-preview.ts b/packages/template/src/template-preview.ts new file mode 100644 index 0000000000000000000000000000000000000000..3d427bf6b5995c0592951b5dd6b6a33cdbe57d82 --- /dev/null +++ b/packages/template/src/template-preview.ts @@ -0,0 +1,181 @@ +import { winToUnixPath } from '@ibizlab/template-core'; +import { macro, TemplateContextItem, TemplateFile } from '@ibizlab/template-generator'; +import { HandlebarsEngine } from '@ibizlab/template-handlebars'; +import { TemplateModel } from '@ibizlab/template-model'; +import { readFileSync } from 'fs-extra'; +import { basename, join, normalize } from 'path'; +import { notNilEmpty } from 'qx-util'; + +/** + * 模板预览 + * + * @author chitanda + * @date 2022-01-17 17:01:33 + * @export + * @class TemplatePreview + */ +export class TemplatePreview { + protected engine = new HandlebarsEngine(); + + protected model: TemplateModel; + + /** + * 模板后缀 + * + * @author chitanda + * @date 2022-01-18 18:01:08 + * @protected + */ + protected extension = 'hbs'; + + /** + * Creates an instance of TemplatePreview. + * + * @author chitanda + * @date 2022-01-17 17:01:48 + * @param {string} modelFolder 模型目录 + * @param {string} templateFolder 模板目录 + */ + constructor(public modelFolder: string, public templateFolder: string) { + this.model = new TemplateModel(modelFolder); + macro.setOptions({ + tempFolder: templateFolder, + macroFolderName: '@macro', + extension: this.extension, + }); + const tag = 'TemplatePreview'; + macro.hooks.complete.tap(tag, this.registerPartials.bind(this)); + } + + /** + * 安装宏 + * + * @author chitanda + * @date 2021-12-21 14:12:27 + * @protected + */ + protected registerPartials(macros: TemplateFile[]): void { + macros.forEach(file => { + this.engine.registerMacro(file.path, file.content as string); + }); + } + + /** + * 计算单个模板所需的上下文 + * + * @author chitanda + * @date 2021-12-24 13:12:59 + * @protected + * @param {TemplateContextItem[]} ctxs + * @param {TemplateFile} temp + * @return {*} {TemplateContextItem[]} + */ + protected calcTemplateContext(ctxs: TemplateContextItem[], temp: TemplateFile): TemplateContextItem[] { + try { + const path = join(temp.folder, temp.name); + const arr = this.engine.parseContextTags(winToUnixPath(path)); + const ctxMap = new Map(); + arr.forEach(tag => { + const ctx = new TemplateContextItem(tag); + ctxMap.set(ctx.name, ctx); + }); + ctxMap.forEach(ctx => { + ctxs.push(ctx); + }); + } catch (err: any) { + throw new Error(`模板: ${temp.path}, 异常: ${err.message}`); + } + return ctxs; + } + + protected createTemplateFile(path: string): TemplateFile { + const fullPath = join(this.templateFolder, path); + const fileName = basename(path); + const fileContent = readFileSync(fullPath, 'utf-8'); + const tempFile = new TemplateFile(this.extension, path, fullPath, fileName, fileContent); + const ctxs: TemplateContextItem[] = this.calcTemplateContext([], tempFile); + tempFile.contexts = ctxs; + return tempFile; + } + + /** + * 编译指定模板 + * + * @author chitanda + * @date 2022-01-18 11:01:53 + * @param {string} templateFile 模板文件相对于模板文件夹的路径 + * @param {string} [modelId] 需要预览的模板,主模型对象标识。预览视图指定视图模型标识,预览实体指定实体模型标识。未指定默认取第一个该类型模型 + * @return {*} {({ path: string; content: string } | null)} + */ + execute(templateFile: string, modelId?: string): { path: string; content: string } | null { + macro.syncScan(); + const file = this.createTemplateFile(templateFile); + const models = this.model.getModelData(file); + const model = models.find(m => { + if (!modelId) { + return true; + } + const data = m.getModel(); + const rootData = data[data.pubType as string] as IModel; + if (rootData) { + return rootData.id === modelId; + } + }); + if (model) { + const data = model.getModel(); + // 编译模板文件内容 + try { + const content = this.engine.parse(file.content as string, data); + if (notNilEmpty(content)) { + // 编译模板输出路径并替换 . 为系统路径分隔符 + const outFolder = normalize(this.engine.render(winToUnixPath(file.folder), data)); + // 编译文件名称 + const outFileName = this.engine.render(file.name, data); + if (process.send) { + process.send(`${outFolder}、${outFileName}`); + } + return { path: join(outFolder, outFileName), content: content }; + } + } catch (err: any) { + throw new Error(`模板: ${file.path}, 异常: ${err.message}`); + } + } else { + if (modelId) { + throw new Error(`未找到对应模板: ${file.path} 的指定模型: ${modelId}`); + } else { + throw new Error(`未找到对应模板: ${file.path} 的模型`); + } + } + return null; + } + + /** + * 根据发布类型编译模板 + * + * @description {type} 具体类型查看 {@link ContextModelTypeConst} + * @author chitanda + * @date 2022-01-18 10:01:51 + * @param {string} type 发布对象类型 + * @param {(string | null)} subType 发布对象子类型 + * @param {string} content 模板内容 + * @param {string} [modelId] 需要预览的模板,主模型对象标识。预览视图指定视图模型标识,预览实体指定实体模型标识。未指定默认取第一个该类型模型 + * @return {*} {(string | null)} + */ + parse(type: string, subType: string | null, content: string, modelId?: string): string { + const models = this.model.getModelDataByType(type, subType); + const model = models.find(m => { + if (!modelId) { + return true; + } + const data = m.getModel(); + const rootData = data[data.pubType as string] as IModel; + if (rootData) { + return rootData.id === modelId; + } + }); + if (model) { + return this.engine.render(content, model.getModel()); + } + throw new Error('未找到指定模型'); + } +} diff --git a/packages/template/src/template.ts b/packages/template/src/template.ts new file mode 100644 index 0000000000000000000000000000000000000000..8275be5a99c8527cd370a98e39b9537bd59bf2e1 --- /dev/null +++ b/packages/template/src/template.ts @@ -0,0 +1,153 @@ +import { TemplateModel } from '@ibizlab/template-model'; +import { TemplateFile, generator as g, macro, compiler, TemplateOutFile, manager, TemplateContextItem } from '@ibizlab/template-generator'; +import { HandlebarsEngine } from '@ibizlab/template-handlebars'; +import { join, normalize } from 'path'; +import { TemplateOptions } from './interface'; +import { notNilEmpty } from 'qx-util'; +import { winToUnixPath } from '@ibizlab/template-core'; + +/** + * iBizLab 模板引擎 + * + * @author chitanda + * @date 2021-12-23 13:12:59 + * @export + * @class IBizLabTemplate + */ +export class IBizLabTemplate { + protected engine = new HandlebarsEngine(); + protected model!: TemplateModel; + protected modelEngine: any; + + setOptions(opts: TemplateOptions): void { + this.model = new TemplateModel(opts.modelFolder); + g.setOptions({ + extension: this.engine.extension, + macroFolderName: this.engine.macroFolderName, + ...opts, + }); + this.taps(); + } + + /** + * 订阅 + * + * @author chitanda + * @date 2021-12-22 19:12:07 + * @protected + */ + protected taps() { + const tag = 'HandlebarsEngine'; + macro.hooks.complete.tap(tag, this.registerPartials.bind(this)); + compiler.hooks.compile.tap(tag, this.parseTemplate.bind(this)); + manager.hooks.calcTempContext.tap(tag, this.calcTemplateContext.bind(this)); + manager.hooks.afterRead.tap(tag, this.handleTemplateFile.bind(this)); + } + + /** + * 安装宏 + * + * @author chitanda + * @date 2021-12-21 14:12:27 + * @protected + */ + protected registerPartials(macros: TemplateFile[]): void { + macros.forEach(file => { + this.engine.registerMacro(file.path, file.content as string); + }); + } + + /** + * 计算单个模板所需的上下文 + * + * @author chitanda + * @date 2021-12-24 13:12:59 + * @protected + * @param {TemplateContextItem[]} ctxs + * @param {TemplateFile} temp + * @return {*} {TemplateContextItem[]} + */ + protected calcTemplateContext(ctxs: TemplateContextItem[], temp: TemplateFile): TemplateContextItem[] { + try { + const path = join(temp.folder, temp.name); + const arr = this.engine.parseContextTags(winToUnixPath(path)); + const ctxMap = new Map(); + arr.forEach(tag => { + const ctx = new TemplateContextItem(tag); + ctxMap.set(ctx.name, ctx); + }); + ctxMap.forEach(ctx => { + ctxs.push(ctx); + }); + } catch (err: any) { + throw new Error(`模板: ${temp.path}, 异常: ${err.message}`); + } + return ctxs; + } + + /** + * 处理模板文件 + * + * @author chitanda + * @date 2021-12-24 14:12:39 + * @protected + * @param {TemplateFile} file + * @return {*} {TemplateFile} + */ + protected handleTemplateFile(file: TemplateFile): TemplateFile { + if (file.isTemplate) { + file.content = this.engine.preparse(file.content as string); + } + return file; + } + + /** + * 执行模板编译 + * + * @author chitanda + * @date 2021-12-19 14:12:37 + * @return {*} {Promise} + */ + run(): Promise { + return g.execute(); + } + + /** + * 编译模板文件 + * + * @author chitanda + * @date 2021-12-21 09:12:07 + * @protected + * @param {TemplateFile} file + * @return {*} {void} + */ + protected parseTemplate(file: TemplateFile): void { + try { + const models = this.model.getModelData(file); + for (let i = 0; i < models.length; i++) { + const item = models[i]; + const model = item.getModel(); + // 编译模板输出路径并替换 . 为系统路径分隔符 + const outFolder = normalize(this.engine.render(winToUnixPath(file.folder), model)); + // 编译文件名称 + const outFileName = this.engine.render(file.name, model); + if (file.isTemplate) { + // 编译模板文件内容 + const content = this.engine.parse(file.content as HandlebarsTemplateDelegate, model); + if (notNilEmpty(content.trim())) { + const out = new TemplateOutFile(outFolder, outFileName, content); + compiler.pub(out); + } + } else { + // 编译模板文件夹 + const out = new TemplateOutFile(outFolder, `${outFileName}${notNilEmpty(file.extension) ? `.${file.extension}` : ''}`, file.content as string); + compiler.pub(out); + } + } + } catch (err: any) { + throw new Error(`模板: ${file.path}, 异常: ${err.message}`); + } + } +} +// 唯一实例 +export const template = new IBizLabTemplate(); diff --git a/packages/template/tsconfig.json b/packages/template/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..21c459f5081dffdf0540767ebb16a3c948a08c20 --- /dev/null +++ b/packages/template/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "out", + "declarationDir": "out/types", + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..34947e43725c4484cfa6afc8a4bd80dbc25c684f --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8824 @@ +lockfileVersion: 5.3 + +importers: + + .: + specifiers: + '@types/debug': ^4.1.7 + '@types/fs-extra': ^9.0.13 + '@types/glob': ^7.2.0 + '@types/jest': ^27.4.0 + '@types/lodash': ^4.14.178 + '@types/node': ^17.0.16 + '@types/npmlog': ^4.1.4 + '@types/pluralize': ^0.0.29 + '@types/ramda': ^0.27.64 + '@typescript-eslint/eslint-plugin': ^5.11.0 + '@typescript-eslint/parser': ^5.11.0 + chalk: 4.1.2 + debug: ^4.3.3 + delete-empty: ^3.0.0 + eslint: ^8.8.0 + eslint-config-prettier: ^8.3.0 + eslint-plugin-prettier: ^4.0.0 + fs-extra: ^10.0.0 + glob: ^7.2.0 + gulp: ^4.0.2 + gulp-clean: ^0.4.0 + jest: ^27.5.1 + lerna: ^4.0.0 + lodash: ^4.17.21 + npmlog: ^6.0.1 + pluralize: ^8.0.0 + prettier: ^2.5.1 + qx-util: ^0.1.0 + ramda: ^0.28.0 + rimraf: ^3.0.2 + tapable: ^2.2.1 + ts-jest: ^27.1.3 + ts-node: ^10.5.0 + typescript: ^4.5.5 + dependencies: + chalk: 4.1.2 + debug: 4.3.3 + fs-extra: 10.0.0 + glob: 7.2.0 + lodash: 4.17.21 + npmlog: 6.0.1 + pluralize: 8.0.0 + qx-util: 0.1.0 + ramda: 0.28.0 + tapable: 2.2.1 + devDependencies: + '@types/debug': 4.1.7 + '@types/fs-extra': 9.0.13 + '@types/glob': 7.2.0 + '@types/jest': 27.4.0 + '@types/lodash': 4.14.178 + '@types/node': 17.0.16 + '@types/npmlog': 4.1.4 + '@types/pluralize': 0.0.29 + '@types/ramda': 0.27.64 + '@typescript-eslint/eslint-plugin': 5.11.0_de5a1ddccd75ca1e499b8b8491d3dcba + '@typescript-eslint/parser': 5.11.0_eslint@8.8.0+typescript@4.5.5 + delete-empty: 3.0.0 + eslint: 8.8.0 + eslint-config-prettier: 8.3.0_eslint@8.8.0 + eslint-plugin-prettier: 4.0.0_43197c8d12d1d439034cfcf65e1c48c2 + gulp: 4.0.2 + gulp-clean: 0.4.0 + jest: 27.5.1_ts-node@10.5.0 + lerna: 4.0.0 + prettier: 2.5.1 + rimraf: 3.0.2 + ts-jest: 27.1.3_1e2406a8ca2ae3dc934d01f9ee2aebbb + ts-node: 10.5.0_99ae9436e134a034c8d45fdd98ebbf22 + typescript: 4.5.5 + + packages/cli: + specifiers: + '@ibizlab/template': ^0.1.10 + commander: ^8.3.0 + dependencies: + '@ibizlab/template': link:../template + commander: 8.3.0 + + packages/core: + specifiers: + tapable: ^2.2.1 + dependencies: + tapable: 2.2.1 + + packages/generator: + specifiers: + '@ibizlab/template-core': ^0.1.9 + tapable: ^2.2.1 + dependencies: + '@ibizlab/template-core': link:../core + tapable: 2.2.1 + + packages/handlebars: + specifiers: + '@ibizlab/template-core': ^0.1.9 + handlebars: ^4.7.7 + lodash: ^4.17.21 + tapable: ^2.2.1 + dependencies: + '@ibizlab/template-core': link:../core + handlebars: 4.7.7 + lodash: 4.17.21 + tapable: 2.2.1 + + packages/model: + specifiers: + '@ibizlab/model': ^0.0.20 + '@ibizlab/template-generator': ^0.1.10 + lodash: ^4.17.21 + pluralize: ^8.0.0 + dependencies: + '@ibizlab/model': 0.0.20 + '@ibizlab/template-generator': link:../generator + lodash: 4.17.21 + pluralize: 8.0.0 + + packages/template: + specifiers: + '@ibizlab/template-core': ^0.1.9 + '@ibizlab/template-generator': ^0.1.10 + '@ibizlab/template-handlebars': ^0.1.10 + '@ibizlab/template-model': ^0.1.10 + dependencies: + '@ibizlab/template-core': link:../core + '@ibizlab/template-generator': link:../generator + '@ibizlab/template-handlebars': link:../handlebars + '@ibizlab/template-model': link:../model + +packages: + + /@babel/code-frame/7.16.7: + resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.16.7 + dev: true + + /@babel/compat-data/7.16.4: + resolution: {integrity: sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.16.7: + resolution: {integrity: sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.16.7 + '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.16.7 + '@babel/helper-module-transforms': 7.16.7 + '@babel/helpers': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 + convert-source-map: 1.8.0 + debug: 4.3.3 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + semver: 6.3.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.16.7: + resolution: {integrity: sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + jsesc: 2.5.2 + source-map: 0.5.7 + dev: true + + /@babel/helper-compilation-targets/7.16.7_@babel+core@7.16.7: + resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.16.4 + '@babel/core': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + browserslist: 4.19.1 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.16.7: + resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-function-name/7.16.7: + resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-get-function-arity': 7.16.7 + '@babel/template': 7.16.7 + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-get-function-arity/7.16.7: + resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-hoist-variables/7.16.7: + resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-module-imports/7.16.7: + resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-module-transforms/7.16.7: + resolution: {integrity: sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-simple-access': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/helper-validator-identifier': 7.16.7 + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.16.7: + resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.16.7: + resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-split-export-declaration/7.16.7: + resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-validator-identifier/7.16.7: + resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.16.7: + resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.16.7: + resolution: {integrity: sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.16.7: + resolution: {integrity: sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.16.7: + resolution: {integrity: sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==} + engines: {node: '>=6.0.0'} + hasBin: true + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.16.7: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.16.7: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.16.7: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.16.7: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.16.7: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.16.7: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.16.7: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.16.7: + resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/template/7.16.7: + resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 + dev: true + + /@babel/traverse/7.16.7: + resolution: {integrity: sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.16.7 + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-function-name': 7.16.7 + '@babel/helper-hoist-variables': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 + debug: 4.3.3 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.16.7: + resolution: {integrity: sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cspotcode/source-map-consumer/0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support/0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@eslint/eslintrc/1.0.5: + resolution: {integrity: sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.3 + espree: 9.3.0 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify/1.1.2: + resolution: {integrity: sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==} + dev: true + + /@humanwhocodes/config-array/0.9.2: + resolution: {integrity: sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.3 + minimatch: 3.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url/3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@ibizlab/model/0.0.20: + resolution: {integrity: sha512-SrqDZ6neJo7X5io3lbT3sL3ACLPIJLXQOy4MUvWn/PyqUxvNX4q6xMGM7Yr6OiGhn4DbAYt/XOlmAPjZHy3ddQ==} + dependencies: + fs-extra: 10.0.0 + qx-util: 0.1.0 + rimraf: 3.0.2 + dev: false + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core/27.5.1_ts-node@10.5.0: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.9 + jest-changed-files: 27.5.1 + jest-config: 27.5.1_ts-node@10.5.0 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.4 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 17.0.16 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.0 + graceful-fs: 4.2.9 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.1.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.3 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.9 + source-map: 0.6.1 + dev: true + + /@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.9 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.16.7 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.9 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.4 + pirates: 4.0.4 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/27.4.2: + resolution: {integrity: sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.16 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + dev: true + + /@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.16 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + dev: true + + /@lerna/add/4.0.0: + resolution: {integrity: sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/bootstrap': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/npm-conf': 4.0.0 + '@lerna/validation-error': 4.0.0 + dedent: 0.7.0 + npm-package-arg: 8.1.5 + p-map: 4.0.0 + pacote: 11.3.5 + semver: 7.3.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@lerna/bootstrap/4.0.0: + resolution: {integrity: sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/has-npm-version': 4.0.0 + '@lerna/npm-install': 4.0.0 + '@lerna/package-graph': 4.0.0 + '@lerna/pulse-till-done': 4.0.0 + '@lerna/rimraf-dir': 4.0.0 + '@lerna/run-lifecycle': 4.0.0 + '@lerna/run-topologically': 4.0.0 + '@lerna/symlink-binary': 4.0.0 + '@lerna/symlink-dependencies': 4.0.0 + '@lerna/validation-error': 4.0.0 + dedent: 0.7.0 + get-port: 5.1.1 + multimatch: 5.0.0 + npm-package-arg: 8.1.5 + npmlog: 4.1.2 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-waterfall: 2.1.1 + read-package-tree: 5.3.1 + semver: 7.3.5 + dev: true + + /@lerna/changed/4.0.0: + resolution: {integrity: sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/collect-updates': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/listable': 4.0.0 + '@lerna/output': 4.0.0 + dev: true + + /@lerna/check-working-tree/4.0.0: + resolution: {integrity: sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/collect-uncommitted': 4.0.0 + '@lerna/describe-ref': 4.0.0 + '@lerna/validation-error': 4.0.0 + dev: true + + /@lerna/child-process/4.0.0: + resolution: {integrity: sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q==} + engines: {node: '>= 10.18.0'} + dependencies: + chalk: 4.1.2 + execa: 5.1.1 + strong-log-transformer: 2.1.0 + dev: true + + /@lerna/clean/4.0.0: + resolution: {integrity: sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/prompt': 4.0.0 + '@lerna/pulse-till-done': 4.0.0 + '@lerna/rimraf-dir': 4.0.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + p-waterfall: 2.1.1 + dev: true + + /@lerna/cli/4.0.0: + resolution: {integrity: sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/global-options': 4.0.0 + dedent: 0.7.0 + npmlog: 4.1.2 + yargs: 16.2.0 + dev: true + + /@lerna/collect-uncommitted/4.0.0: + resolution: {integrity: sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + chalk: 4.1.2 + npmlog: 4.1.2 + dev: true + + /@lerna/collect-updates/4.0.0: + resolution: {integrity: sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/describe-ref': 4.0.0 + minimatch: 3.0.4 + npmlog: 4.1.2 + slash: 3.0.0 + dev: true + + /@lerna/command/4.0.0: + resolution: {integrity: sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/package-graph': 4.0.0 + '@lerna/project': 4.0.0 + '@lerna/validation-error': 4.0.0 + '@lerna/write-log-file': 4.0.0 + clone-deep: 4.0.1 + dedent: 0.7.0 + execa: 5.1.1 + is-ci: 2.0.0 + npmlog: 4.1.2 + dev: true + + /@lerna/conventional-commits/4.0.0: + resolution: {integrity: sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/validation-error': 4.0.0 + conventional-changelog-angular: 5.0.13 + conventional-changelog-core: 4.2.4 + conventional-recommended-bump: 6.1.0 + fs-extra: 9.1.0 + get-stream: 6.0.1 + lodash.template: 4.5.0 + npm-package-arg: 8.1.5 + npmlog: 4.1.2 + pify: 5.0.0 + semver: 7.3.5 + dev: true + + /@lerna/create-symlink/4.0.0: + resolution: {integrity: sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig==} + engines: {node: '>= 10.18.0'} + dependencies: + cmd-shim: 4.1.0 + fs-extra: 9.1.0 + npmlog: 4.1.2 + dev: true + + /@lerna/create/4.0.0: + resolution: {integrity: sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/npm-conf': 4.0.0 + '@lerna/validation-error': 4.0.0 + dedent: 0.7.0 + fs-extra: 9.1.0 + globby: 11.0.4 + init-package-json: 2.0.5 + npm-package-arg: 8.1.5 + p-reduce: 2.1.0 + pacote: 11.3.5 + pify: 5.0.0 + semver: 7.3.5 + slash: 3.0.0 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 3.0.0 + whatwg-url: 8.7.0 + yargs-parser: 20.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@lerna/describe-ref/4.0.0: + resolution: {integrity: sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + npmlog: 4.1.2 + dev: true + + /@lerna/diff/4.0.0: + resolution: {integrity: sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/validation-error': 4.0.0 + npmlog: 4.1.2 + dev: true + + /@lerna/exec/4.0.0: + resolution: {integrity: sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/profiler': 4.0.0 + '@lerna/run-topologically': 4.0.0 + '@lerna/validation-error': 4.0.0 + p-map: 4.0.0 + dev: true + + /@lerna/filter-options/4.0.0: + resolution: {integrity: sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/collect-updates': 4.0.0 + '@lerna/filter-packages': 4.0.0 + dedent: 0.7.0 + npmlog: 4.1.2 + dev: true + + /@lerna/filter-packages/4.0.0: + resolution: {integrity: sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/validation-error': 4.0.0 + multimatch: 5.0.0 + npmlog: 4.1.2 + dev: true + + /@lerna/get-npm-exec-opts/4.0.0: + resolution: {integrity: sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ==} + engines: {node: '>= 10.18.0'} + dependencies: + npmlog: 4.1.2 + dev: true + + /@lerna/get-packed/4.0.0: + resolution: {integrity: sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w==} + engines: {node: '>= 10.18.0'} + dependencies: + fs-extra: 9.1.0 + ssri: 8.0.1 + tar: 6.1.11 + dev: true + + /@lerna/github-client/4.0.0: + resolution: {integrity: sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@octokit/plugin-enterprise-rest': 6.0.1 + '@octokit/rest': 18.12.0 + git-url-parse: 11.6.0 + npmlog: 4.1.2 + dev: true + + /@lerna/gitlab-client/4.0.0: + resolution: {integrity: sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA==} + engines: {node: '>= 10.18.0'} + dependencies: + node-fetch: 2.6.6 + npmlog: 4.1.2 + whatwg-url: 8.7.0 + dev: true + + /@lerna/global-options/4.0.0: + resolution: {integrity: sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ==} + engines: {node: '>= 10.18.0'} + dev: true + + /@lerna/has-npm-version/4.0.0: + resolution: {integrity: sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + semver: 7.3.5 + dev: true + + /@lerna/import/4.0.0: + resolution: {integrity: sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/prompt': 4.0.0 + '@lerna/pulse-till-done': 4.0.0 + '@lerna/validation-error': 4.0.0 + dedent: 0.7.0 + fs-extra: 9.1.0 + p-map-series: 2.1.0 + dev: true + + /@lerna/info/4.0.0: + resolution: {integrity: sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/output': 4.0.0 + envinfo: 7.8.1 + dev: true + + /@lerna/init/4.0.0: + resolution: {integrity: sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/command': 4.0.0 + fs-extra: 9.1.0 + p-map: 4.0.0 + write-json-file: 4.3.0 + dev: true + + /@lerna/link/4.0.0: + resolution: {integrity: sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/package-graph': 4.0.0 + '@lerna/symlink-dependencies': 4.0.0 + p-map: 4.0.0 + slash: 3.0.0 + dev: true + + /@lerna/list/4.0.0: + resolution: {integrity: sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/listable': 4.0.0 + '@lerna/output': 4.0.0 + dev: true + + /@lerna/listable/4.0.0: + resolution: {integrity: sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/query-graph': 4.0.0 + chalk: 4.1.2 + columnify: 1.5.4 + dev: true + + /@lerna/log-packed/4.0.0: + resolution: {integrity: sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ==} + engines: {node: '>= 10.18.0'} + dependencies: + byte-size: 7.0.1 + columnify: 1.5.4 + has-unicode: 2.0.1 + npmlog: 4.1.2 + dev: true + + /@lerna/npm-conf/4.0.0: + resolution: {integrity: sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw==} + engines: {node: '>= 10.18.0'} + dependencies: + config-chain: 1.1.13 + pify: 5.0.0 + dev: true + + /@lerna/npm-dist-tag/4.0.0: + resolution: {integrity: sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/otplease': 4.0.0 + npm-package-arg: 8.1.5 + npm-registry-fetch: 9.0.0 + npmlog: 4.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@lerna/npm-install/4.0.0: + resolution: {integrity: sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/get-npm-exec-opts': 4.0.0 + fs-extra: 9.1.0 + npm-package-arg: 8.1.5 + npmlog: 4.1.2 + signal-exit: 3.0.6 + write-pkg: 4.0.0 + dev: true + + /@lerna/npm-publish/4.0.0: + resolution: {integrity: sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/otplease': 4.0.0 + '@lerna/run-lifecycle': 4.0.0 + fs-extra: 9.1.0 + libnpmpublish: 4.0.2 + npm-package-arg: 8.1.5 + npmlog: 4.1.2 + pify: 5.0.0 + read-package-json: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@lerna/npm-run-script/4.0.0: + resolution: {integrity: sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + '@lerna/get-npm-exec-opts': 4.0.0 + npmlog: 4.1.2 + dev: true + + /@lerna/otplease/4.0.0: + resolution: {integrity: sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/prompt': 4.0.0 + dev: true + + /@lerna/output/4.0.0: + resolution: {integrity: sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w==} + engines: {node: '>= 10.18.0'} + dependencies: + npmlog: 4.1.2 + dev: true + + /@lerna/pack-directory/4.0.0: + resolution: {integrity: sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/get-packed': 4.0.0 + '@lerna/package': 4.0.0 + '@lerna/run-lifecycle': 4.0.0 + npm-packlist: 2.2.2 + npmlog: 4.1.2 + tar: 6.1.11 + temp-write: 4.0.0 + dev: true + + /@lerna/package-graph/4.0.0: + resolution: {integrity: sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/prerelease-id-from-version': 4.0.0 + '@lerna/validation-error': 4.0.0 + npm-package-arg: 8.1.5 + npmlog: 4.1.2 + semver: 7.3.5 + dev: true + + /@lerna/package/4.0.0: + resolution: {integrity: sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q==} + engines: {node: '>= 10.18.0'} + dependencies: + load-json-file: 6.2.0 + npm-package-arg: 8.1.5 + write-pkg: 4.0.0 + dev: true + + /@lerna/prerelease-id-from-version/4.0.0: + resolution: {integrity: sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg==} + engines: {node: '>= 10.18.0'} + dependencies: + semver: 7.3.5 + dev: true + + /@lerna/profiler/4.0.0: + resolution: {integrity: sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q==} + engines: {node: '>= 10.18.0'} + dependencies: + fs-extra: 9.1.0 + npmlog: 4.1.2 + upath: 2.0.1 + dev: true + + /@lerna/project/4.0.0: + resolution: {integrity: sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/package': 4.0.0 + '@lerna/validation-error': 4.0.0 + cosmiconfig: 7.0.1 + dedent: 0.7.0 + dot-prop: 6.0.1 + glob-parent: 5.1.2 + globby: 11.0.4 + load-json-file: 6.2.0 + npmlog: 4.1.2 + p-map: 4.0.0 + resolve-from: 5.0.0 + write-json-file: 4.3.0 + dev: true + + /@lerna/prompt/4.0.0: + resolution: {integrity: sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ==} + engines: {node: '>= 10.18.0'} + dependencies: + inquirer: 7.3.3 + npmlog: 4.1.2 + dev: true + + /@lerna/publish/4.0.0: + resolution: {integrity: sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/check-working-tree': 4.0.0 + '@lerna/child-process': 4.0.0 + '@lerna/collect-updates': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/describe-ref': 4.0.0 + '@lerna/log-packed': 4.0.0 + '@lerna/npm-conf': 4.0.0 + '@lerna/npm-dist-tag': 4.0.0 + '@lerna/npm-publish': 4.0.0 + '@lerna/otplease': 4.0.0 + '@lerna/output': 4.0.0 + '@lerna/pack-directory': 4.0.0 + '@lerna/prerelease-id-from-version': 4.0.0 + '@lerna/prompt': 4.0.0 + '@lerna/pulse-till-done': 4.0.0 + '@lerna/run-lifecycle': 4.0.0 + '@lerna/run-topologically': 4.0.0 + '@lerna/validation-error': 4.0.0 + '@lerna/version': 4.0.0 + fs-extra: 9.1.0 + libnpmaccess: 4.0.3 + npm-package-arg: 8.1.5 + npm-registry-fetch: 9.0.0 + npmlog: 4.1.2 + p-map: 4.0.0 + p-pipe: 3.1.0 + pacote: 11.3.5 + semver: 7.3.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@lerna/pulse-till-done/4.0.0: + resolution: {integrity: sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg==} + engines: {node: '>= 10.18.0'} + dependencies: + npmlog: 4.1.2 + dev: true + + /@lerna/query-graph/4.0.0: + resolution: {integrity: sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/package-graph': 4.0.0 + dev: true + + /@lerna/resolve-symlink/4.0.0: + resolution: {integrity: sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA==} + engines: {node: '>= 10.18.0'} + dependencies: + fs-extra: 9.1.0 + npmlog: 4.1.2 + read-cmd-shim: 2.0.0 + dev: true + + /@lerna/rimraf-dir/4.0.0: + resolution: {integrity: sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/child-process': 4.0.0 + npmlog: 4.1.2 + path-exists: 4.0.0 + rimraf: 3.0.2 + dev: true + + /@lerna/run-lifecycle/4.0.0: + resolution: {integrity: sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/npm-conf': 4.0.0 + npm-lifecycle: 3.1.5 + npmlog: 4.1.2 + dev: true + + /@lerna/run-topologically/4.0.0: + resolution: {integrity: sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/query-graph': 4.0.0 + p-queue: 6.6.2 + dev: true + + /@lerna/run/4.0.0: + resolution: {integrity: sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/command': 4.0.0 + '@lerna/filter-options': 4.0.0 + '@lerna/npm-run-script': 4.0.0 + '@lerna/output': 4.0.0 + '@lerna/profiler': 4.0.0 + '@lerna/run-topologically': 4.0.0 + '@lerna/timer': 4.0.0 + '@lerna/validation-error': 4.0.0 + p-map: 4.0.0 + dev: true + + /@lerna/symlink-binary/4.0.0: + resolution: {integrity: sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/create-symlink': 4.0.0 + '@lerna/package': 4.0.0 + fs-extra: 9.1.0 + p-map: 4.0.0 + dev: true + + /@lerna/symlink-dependencies/4.0.0: + resolution: {integrity: sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/create-symlink': 4.0.0 + '@lerna/resolve-symlink': 4.0.0 + '@lerna/symlink-binary': 4.0.0 + fs-extra: 9.1.0 + p-map: 4.0.0 + p-map-series: 2.1.0 + dev: true + + /@lerna/timer/4.0.0: + resolution: {integrity: sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg==} + engines: {node: '>= 10.18.0'} + dev: true + + /@lerna/validation-error/4.0.0: + resolution: {integrity: sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw==} + engines: {node: '>= 10.18.0'} + dependencies: + npmlog: 4.1.2 + dev: true + + /@lerna/version/4.0.0: + resolution: {integrity: sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA==} + engines: {node: '>= 10.18.0'} + dependencies: + '@lerna/check-working-tree': 4.0.0 + '@lerna/child-process': 4.0.0 + '@lerna/collect-updates': 4.0.0 + '@lerna/command': 4.0.0 + '@lerna/conventional-commits': 4.0.0 + '@lerna/github-client': 4.0.0 + '@lerna/gitlab-client': 4.0.0 + '@lerna/output': 4.0.0 + '@lerna/prerelease-id-from-version': 4.0.0 + '@lerna/prompt': 4.0.0 + '@lerna/run-lifecycle': 4.0.0 + '@lerna/run-topologically': 4.0.0 + '@lerna/validation-error': 4.0.0 + chalk: 4.1.2 + dedent: 0.7.0 + load-json-file: 6.2.0 + minimatch: 3.0.4 + npmlog: 4.1.2 + p-map: 4.0.0 + p-pipe: 3.1.0 + p-reduce: 2.1.0 + p-waterfall: 2.1.1 + semver: 7.3.5 + slash: 3.0.0 + temp-write: 4.0.0 + write-json-file: 4.3.0 + dev: true + + /@lerna/write-log-file/4.0.0: + resolution: {integrity: sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg==} + engines: {node: '>= 10.18.0'} + dependencies: + npmlog: 4.1.2 + write-file-atomic: 3.0.3 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@npmcli/ci-detect/1.4.0: + resolution: {integrity: sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==} + dev: true + + /@npmcli/fs/1.1.0: + resolution: {integrity: sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + '@gar/promisify': 1.1.2 + semver: 7.3.5 + dev: true + + /@npmcli/git/2.1.0: + resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + dependencies: + '@npmcli/promise-spawn': 1.3.2 + lru-cache: 6.0.0 + mkdirp: 1.0.4 + npm-pick-manifest: 6.1.1 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.3.5 + which: 2.0.2 + dev: true + + /@npmcli/installed-package-contents/1.0.7: + resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /@npmcli/move-file/1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@npmcli/node-gyp/1.0.3: + resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + dev: true + + /@npmcli/promise-spawn/1.3.2: + resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + dependencies: + infer-owner: 1.0.4 + dev: true + + /@npmcli/run-script/1.8.6: + resolution: {integrity: sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==} + dependencies: + '@npmcli/node-gyp': 1.0.3 + '@npmcli/promise-spawn': 1.3.2 + node-gyp: 7.1.2 + read-package-json-fast: 2.0.3 + dev: true + + /@octokit/auth-token/2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + dependencies: + '@octokit/types': 6.34.0 + dev: true + + /@octokit/core/3.5.1: + resolution: {integrity: sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==} + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.2 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.34.0 + before-after-hook: 2.2.2 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/endpoint/6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.34.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql/4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.2 + '@octokit/types': 6.34.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/openapi-types/11.2.0: + resolution: {integrity: sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==} + dev: true + + /@octokit/plugin-enterprise-rest/6.0.1: + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + dev: true + + /@octokit/plugin-paginate-rest/2.17.0_@octokit+core@3.5.1: + resolution: {integrity: sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==} + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.5.1 + '@octokit/types': 6.34.0 + dev: true + + /@octokit/plugin-request-log/1.0.4_@octokit+core@3.5.1: + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.5.1 + dev: true + + /@octokit/plugin-rest-endpoint-methods/5.13.0_@octokit+core@3.5.1: + resolution: {integrity: sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.5.1 + '@octokit/types': 6.34.0 + deprecation: 2.3.1 + dev: true + + /@octokit/request-error/2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + dependencies: + '@octokit/types': 6.34.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request/5.6.2: + resolution: {integrity: sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==} + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.34.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.6 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/rest/18.12.0: + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + dependencies: + '@octokit/core': 3.5.1 + '@octokit/plugin-paginate-rest': 2.17.0_@octokit+core@3.5.1 + '@octokit/plugin-request-log': 1.0.4_@octokit+core@3.5.1 + '@octokit/plugin-rest-endpoint-methods': 5.13.0_@octokit+core@3.5.1 + dev: true + + /@octokit/types/6.34.0: + resolution: {integrity: sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==} + dependencies: + '@octokit/openapi-types': 11.2.0 + dev: true + + /@sinonjs/commons/1.8.3: + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tsconfig/node10/1.0.8: + resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: true + + /@tsconfig/node12/1.0.9: + resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: true + + /@tsconfig/node14/1.0.1: + resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: true + + /@tsconfig/node16/1.0.2: + resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: true + + /@types/babel__core/7.1.18: + resolution: {integrity: sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==} + dependencies: + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.14.2 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 + dev: true + + /@types/babel__traverse/7.14.2: + resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@types/debug/4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: true + + /@types/fs-extra/9.0.13: + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + dependencies: + '@types/node': 17.0.16 + dev: true + + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 17.0.16 + dev: true + + /@types/graceful-fs/4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 17.0.16 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest/27.4.0: + resolution: {integrity: sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==} + dependencies: + jest-diff: 27.4.6 + pretty-format: 27.4.6 + dev: true + + /@types/json-schema/7.0.9: + resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + dev: true + + /@types/lodash/4.14.178: + resolution: {integrity: sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==} + dev: true + + /@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/ms/0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true + + /@types/node/17.0.16: + resolution: {integrity: sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/npmlog/4.1.4: + resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} + dev: true + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/pluralize/0.0.29: + resolution: {integrity: sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==} + dev: true + + /@types/prettier/2.4.2: + resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==} + dev: true + + /@types/ramda/0.27.64: + resolution: {integrity: sha512-EDf++ss/JoMiDpvT1MuA8oi88OwpvmqVE+o8Ojm5v/5bdJEPZ6eIQd/XYAeQ0imlwG6Tf0Npfq4Z9w3hAKBk9Q==} + dependencies: + ts-toolbelt: 6.15.5 + dev: true + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/yargs-parser/20.2.1: + resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} + dev: true + + /@types/yargs/16.0.4: + resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} + dependencies: + '@types/yargs-parser': 20.2.1 + dev: true + + /@typescript-eslint/eslint-plugin/5.11.0_de5a1ddccd75ca1e499b8b8491d3dcba: + resolution: {integrity: sha512-HJh33bgzXe6jGRocOj4FmefD7hRY4itgjzOrSs3JPrTNXsX7j5+nQPciAUj/1nZtwo2kAc3C75jZO+T23gzSGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.11.0_eslint@8.8.0+typescript@4.5.5 + '@typescript-eslint/scope-manager': 5.11.0 + '@typescript-eslint/type-utils': 5.11.0_eslint@8.8.0+typescript@4.5.5 + '@typescript-eslint/utils': 5.11.0_eslint@8.8.0+typescript@4.5.5 + debug: 4.3.3 + eslint: 8.8.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.5.5 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.11.0_eslint@8.8.0+typescript@4.5.5: + resolution: {integrity: sha512-x0DCjetHZYBRovJdr3U0zG9OOdNXUaFLJ82ehr1AlkArljJuwEsgnud+Q7umlGDFLFrs8tU8ybQDFocp/eX8mQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.11.0 + '@typescript-eslint/types': 5.11.0 + '@typescript-eslint/typescript-estree': 5.11.0_typescript@4.5.5 + debug: 4.3.3 + eslint: 8.8.0 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.11.0: + resolution: {integrity: sha512-z+K4LlahDFVMww20t/0zcA7gq/NgOawaLuxgqGRVKS0PiZlCTIUtX0EJbC0BK1JtR4CelmkPK67zuCgpdlF4EA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.11.0 + '@typescript-eslint/visitor-keys': 5.11.0 + dev: true + + /@typescript-eslint/type-utils/5.11.0_eslint@8.8.0+typescript@4.5.5: + resolution: {integrity: sha512-wDqdsYO6ofLaD4DsGZ0jGwxp4HrzD2YKulpEZXmgN3xo4BHJwf7kq49JTRpV0Gx6bxkSUmc9s0EIK1xPbFFpIA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.11.0_eslint@8.8.0+typescript@4.5.5 + debug: 4.3.3 + eslint: 8.8.0 + tsutils: 3.21.0_typescript@4.5.5 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.11.0: + resolution: {integrity: sha512-cxgBFGSRCoBEhvSVLkKw39+kMzUKHlJGVwwMbPcTZX3qEhuXhrjwaZXWMxVfxDgyMm+b5Q5b29Llo2yow8Y7xQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.11.0_typescript@4.5.5: + resolution: {integrity: sha512-yVH9hKIv3ZN3lw8m/Jy5I4oXO4ZBMqijcXCdA4mY8ull6TPTAoQnKKrcZ0HDXg7Bsl0Unwwx7jcXMuNZc0m4lg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.11.0 + '@typescript-eslint/visitor-keys': 5.11.0 + debug: 4.3.3 + globby: 11.0.4 + is-glob: 4.0.3 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.5.5 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.11.0_eslint@8.8.0+typescript@4.5.5: + resolution: {integrity: sha512-g2I480tFE1iYRDyMhxPAtLQ9HAn0jjBtipgTCZmd9I9s11OV8CTsG+YfFciuNDcHqm4csbAgC2aVZCHzLxMSUw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.11.0 + '@typescript-eslint/types': 5.11.0 + '@typescript-eslint/typescript-estree': 5.11.0_typescript@4.5.5 + eslint: 8.8.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.8.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.11.0: + resolution: {integrity: sha512-E8w/vJReMGuloGxJDkpPlGwhxocxOpSVgSvjiLO5IxZPmxZF30weOeJYyPSEACwM+X4NziYS9q+WkN/2DHYQwA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.11.0 + eslint-visitor-keys: 3.2.0 + dev: true + + /JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abab/2.0.5: + resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==} + dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-jsx/5.3.2_acorn@8.7.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.7.0 + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.7.0: + resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /add-stream/1.0.0: + resolution: {integrity: sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=} + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive/4.2.0: + resolution: {integrity: sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.3 + depd: 1.1.2 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-colors/1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-colors/4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + dev: true + + /ansi-cyan/0.1.1: + resolution: {integrity: sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-gray/0.1.1: + resolution: {integrity: sha1-KWLPVOyXksSFEKPetSRDaGHvclE=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-red/0.1.1: + resolution: {integrity: sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-regex/2.1.1: + resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-wrap/0.1.0: + resolution: {integrity: sha1-qCJQ3bABXponyoLoLqYDu/pF768=} + engines: {node: '>=0.10.0'} + dev: true + + /anymatch/2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /append-buffer/1.0.2: + resolution: {integrity: sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=} + engines: {node: '>=0.10.0'} + dependencies: + buffer-equal: 1.0.0 + dev: true + + /aproba/1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + dev: true + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + /archy/1.0.0: + resolution: {integrity: sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=} + dev: true + + /are-we-there-yet/1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.7 + dev: true + + /are-we-there-yet/3.0.0: + resolution: {integrity: sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: false + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff/1.1.0: + resolution: {integrity: sha1-aHwydYFjWI/vfeezb6vklesaOZo=} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-slice: 0.2.3 + dev: true + + /arr-diff/4.0.0: + resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} + engines: {node: '>=0.10.0'} + dev: true + + /arr-filter/1.1.2: + resolution: {integrity: sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-map/2.0.2: + resolution: {integrity: sha1-Onc0X/wc814qkYJWAfnljy4kysQ=} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-union/2.1.0: + resolution: {integrity: sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union/3.1.0: + resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} + engines: {node: '>=0.10.0'} + dev: true + + /array-differ/3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + + /array-each/1.0.1: + resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} + engines: {node: '>=0.10.0'} + dev: true + + /array-ify/1.0.0: + resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + dev: true + + /array-initial/1.1.0: + resolution: {integrity: sha1-L6dLJnOTccOUe9enrcc74zSz15U=} + engines: {node: '>=0.10.0'} + dependencies: + array-slice: 1.1.0 + is-number: 4.0.0 + dev: true + + /array-last/1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 4.0.0 + dev: true + + /array-slice/0.2.3: + resolution: {integrity: sha1-3Tz7gO15c6dRF82sabC5nshhhvU=} + engines: {node: '>=0.10.0'} + dev: true + + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: true + + /array-sort/1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + dependencies: + default-compare: 1.0.0 + get-value: 2.0.6 + kind-of: 5.1.0 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique/0.3.2: + resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} + engines: {node: '>=0.10.0'} + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=} + engines: {node: '>=0.10.0'} + dev: true + + /arrify/2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asap/2.0.6: + resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} + dev: true + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus/1.0.0: + resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} + engines: {node: '>=0.8'} + dev: true + + /assign-symbols/1.0.0: + resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} + engines: {node: '>=0.10.0'} + dev: true + + /async-done/1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + dev: true + + /async-each/1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + dev: true + + /async-settle/1.0.0: + resolution: {integrity: sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=} + engines: {node: '>= 0.10'} + dependencies: + async-done: 1.3.2 + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + dev: true + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /aws-sign2/0.7.0: + resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + dev: true + + /aws4/1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: true + + /babel-jest/27.5.1_@babel+core@7.16.7: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.16.7 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.1.18 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1_@babel+core@7.16.7 + chalk: 4.1.2 + graceful-fs: 4.2.9 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.16.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.1.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.16.7 + '@babel/types': 7.16.7 + '@types/babel__core': 7.1.18 + '@types/babel__traverse': 7.14.2 + dev: true + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.16.7: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.7 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.7 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.16.7 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.7 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.7 + dev: true + + /babel-preset-jest/27.5.1_@babel+core@7.16.7: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.7 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.7 + dev: true + + /bach/1.2.0: + resolution: {integrity: sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=} + engines: {node: '>= 0.10'} + dependencies: + arr-filter: 1.1.2 + arr-flatten: 1.1.0 + arr-map: 2.0.2 + array-each: 1.0.1 + array-initial: 1.1.0 + array-last: 1.3.0 + async-done: 1.3.2 + async-settle: 1.0.0 + now-and-later: 2.0.1 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /before-after-hook/2.2.2: + resolution: {integrity: sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==} + dev: true + + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: true + + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist/4.19.1: + resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001296 + electron-to-chromium: 1.4.35 + escalade: 3.1.1 + node-releases: 2.0.1 + picocolors: 1.0.0 + dev: true + + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal/1.0.0: + resolution: {integrity: sha1-WWFrSYME1Var1GaWayLu2j7KX74=} + engines: {node: '>=0.4.0'} + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /builtins/1.0.3: + resolution: {integrity: sha1-y5T662HIaWRR2zZTThQi+U8K7og=} + dev: true + + /byline/5.0.0: + resolution: {integrity: sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=} + engines: {node: '>=0.10.0'} + dev: true + + /byte-size/7.0.1: + resolution: {integrity: sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==} + engines: {node: '>=10'} + dev: true + + /cacache/15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.0 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.0 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.11 + unique-filename: 1.1.1 + dev: true + + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/3.0.0: + resolution: {integrity: sha1-MvxLn82vhF/N9+c7uXysImHwqwo=} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite/1.0.30001296: + resolution: {integrity: sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==} + dev: true + + /caseless/0.12.0: + resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /chokidar/2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. + dependencies: + anymatch: 2.0.0 + async-each: 1.0.3 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + dev: true + + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /ci-info/2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /ci-info/3.3.0: + resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} + dev: true + + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-width/3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /cliui/3.2.0: + resolution: {integrity: sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer/1.0.0: + resolution: {integrity: sha1-4+JbIHrE5wGvch4staFnksrD3Fg=} + engines: {node: '>= 0.10'} + dev: true + + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-stats/1.0.0: + resolution: {integrity: sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=} + dev: true + + /clone/1.0.4: + resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} + engines: {node: '>=0.8'} + dev: true + + /clone/2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} + dev: true + + /cloneable-readable/1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.7 + dev: true + + /cmd-shim/4.1.0: + resolution: {integrity: sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==} + engines: {node: '>=10'} + dependencies: + mkdirp-infer-owner: 2.0.0 + dev: true + + /co/4.6.0: + resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /code-point-at/1.1.0: + resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} + engines: {node: '>=0.10.0'} + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /collection-map/1.0.0: + resolution: {integrity: sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=} + engines: {node: '>=0.10.0'} + dependencies: + arr-map: 2.0.2 + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /collection-visit/1.0.0: + resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name/1.1.3: + resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + /columnify/1.5.4: + resolution: {integrity: sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=} + dependencies: + strip-ansi: 3.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: true + + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + typedarray: 0.0.6 + dev: true + + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /console-control-strings/1.1.0: + resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} + + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-core/4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-preset-loader/2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer/5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-commits-filter/2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + is-text-path: 1.0.1 + JSONStream: 1.3.5 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-recommended-bump/6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /copy-descriptor/0.1.1: + resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} + engines: {node: '>=0.10.0'} + dev: true + + /copy-props/2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + dependencies: + each-props: 1.3.2 + is-plain-object: 5.0.0 + dev: true + + /core-util-is/1.0.2: + resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cosmiconfig/7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /d/1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.53 + type: 1.2.0 + dev: true + + /dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dashdash/1.14.1: + resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /dateformat/3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + dependencies: + ms: 2.0.0 + dev: true + + /debug/4.3.3: + resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /debuglog/1.0.1: + resolution: {integrity: sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=} + dev: true + + /decamelize-keys/1.1.0: + resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js/10.3.1: + resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} + dev: true + + /decode-uri-component/0.2.0: + resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} + engines: {node: '>=0.10'} + dev: true + + /dedent/0.7.0: + resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /default-compare/1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 5.1.0 + dev: true + + /default-resolution/2.0.0: + resolution: {integrity: sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=} + engines: {node: '>= 0.10'} + dev: true + + /defaults/1.0.3: + resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} + dependencies: + clone: 1.0.4 + dev: true + + /define-properties/1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + dependencies: + object-keys: 1.1.1 + dev: true + + /define-property/0.2.5: + resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property/1.0.0: + resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + + /delete-empty/3.0.0: + resolution: {integrity: sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + ansi-colors: 4.1.1 + minimist: 1.2.5 + path-starts-with: 2.0.0 + rimraf: 2.7.1 + dev: true + + /depd/1.1.2: + resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} + engines: {node: '>= 0.6'} + dev: true + + /deprecation/2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + + /detect-file/1.0.0: + resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent/5.0.0: + resolution: {integrity: sha1-OHHMCmoALow+Wzz38zYmRnXwa50=} + engines: {node: '>=4'} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dezalgo/1.0.3: + resolution: {integrity: sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /diff-sequences/27.4.0: + resolution: {integrity: sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dot-prop/6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: true + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /duplexify/3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.7 + stream-shift: 1.0.1 + dev: true + + /each-props/1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + dependencies: + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + dev: true + + /ecc-jsbn/0.1.2: + resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /electron-to-chromium/1.4.35: + resolution: {integrity: sha512-wzTOMh6HGFWeALMI3bif0mzgRrVGyP1BdFRx7IvWukFrSC5QVQELENuy+Fm2dCrAdQH9T3nuqr07n94nPDFBWA==} + dev: true + + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /encoding/0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /envinfo/7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /err-code/2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.19.1: + resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.1 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext/0.10.53: + resolution: {integrity: sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.0.0 + dev: true + + /es6-iterator/2.0.3: + resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} + dependencies: + d: 1.0.1 + es5-ext: 0.10.53 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol/3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.6.0 + dev: true + + /es6-weak-map/2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.53 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier/8.3.0_eslint@8.8.0: + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.8.0 + dev: true + + /eslint-plugin-prettier/4.0.0_43197c8d12d1d439034cfcf65e1c48c2: + resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.8.0 + eslint-config-prettier: 8.3.0_eslint@8.8.0 + prettier: 2.5.1 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.0: + resolution: {integrity: sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.8.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.8.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.2.0: + resolution: {integrity: sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.8.0: + resolution: {integrity: sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.0.5 + '@humanwhocodes/config-array': 0.9.2 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.0 + eslint-utils: 3.0.0_eslint@8.8.0 + eslint-visitor-keys: 3.2.0 + espree: 9.3.0 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.12.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.3.0: + resolution: {integrity: sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.7.0 + acorn-jsx: 5.3.2_acorn@8.7.0 + eslint-visitor-keys: 3.2.0 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.6 + strip-final-newline: 2.0.0 + dev: true + + /exit/0.1.2: + resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets/2.1.4: + resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /expand-tilde/2.0.2: + resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /ext/1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} + dependencies: + type: 2.5.0 + dev: true + + /extend-shallow/1.1.4: + resolution: {integrity: sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 1.1.0 + dev: true + + /extend-shallow/2.0.1: + resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow/3.0.2: + resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /extsprintf/1.3.0: + resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} + engines: {'0': node >=0.6.0} + dev: true + + /fancy-log/1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + dependencies: + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fast-glob/3.2.7: + resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} + engines: {node: '>=8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.4 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/1.1.4: + resolution: {integrity: sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman/2.0.1: + resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} + dependencies: + bser: 2.1.1 + dev: true + + /figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: true + optional: true + + /fill-range/4.0.0: + resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /filter-obj/1.1.0: + resolution: {integrity: sha1-mzERErxsYSehbgFsbF1/GeCAXFs=} + engines: {node: '>=0.10.0'} + dev: true + + /find-up/1.1.2: + resolution: {integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up/2.1.0: + resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /findup-sync/2.0.0: + resolution: {integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + dev: true + + /findup-sync/3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + dev: true + + /fined/1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: true + + /flagged-respawn/1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.4 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.4: + resolution: {integrity: sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==} + dev: true + + /flush-write-stream/1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /for-in/1.0.2: + resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} + engines: {node: '>=0.10.0'} + dev: true + + /for-own/1.0.0: + resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /forever-agent/0.6.1: + resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + dev: true + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.34 + dev: true + + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.34 + dev: true + + /fragment-cache/0.2.1: + resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fs-extra/10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.9 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.9 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass/1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /fs-mkdirp-stream/1.0.0: + resolution: {integrity: sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=} + engines: {node: '>= 0.10'} + dependencies: + graceful-fs: 4.2.9 + through2: 2.0.5 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.15.0 + dev: true + optional: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} + dev: true + + /gauge/2.7.4: + resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=} + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.6 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.5 + dev: true + + /gauge/4.0.0: + resolution: {integrity: sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + ansi-regex: 5.0.1 + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.6 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic/1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: true + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-pkg-repo/4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.0.2 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-port/5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + dev: true + + /get-value/2.0.6: + resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} + engines: {node: '>=0.10.0'} + dev: true + + /getpass/0.1.7: + resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} + dependencies: + assert-plus: 1.0.0 + dev: true + + /git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-remote-origin-url/2.0.0: + resolution: {integrity: sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags/4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.0 + dev: true + + /git-up/4.0.5: + resolution: {integrity: sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==} + dependencies: + is-ssh: 1.3.3 + parse-url: 6.0.0 + dev: true + + /git-url-parse/11.6.0: + resolution: {integrity: sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==} + dependencies: + git-up: 4.0.5 + dev: true + + /gitconfiglocal/1.0.0: + resolution: {integrity: sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=} + dependencies: + ini: 1.3.8 + dev: true + + /glob-parent/3.1.0: + resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-stream/6.1.0: + resolution: {integrity: sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=} + engines: {node: '>= 0.10'} + dependencies: + extend: 3.0.2 + glob: 7.2.0 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.7 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + dev: true + + /glob-watcher/5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + dependencies: + anymatch: 2.0.0 + async-done: 1.3.2 + chokidar: 2.1.8 + is-negated-glob: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 + object.defaults: 1.1.0 + dev: true + + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-prefix/1.0.2: + resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals/13.12.0: + resolution: {integrity: sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby/11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.7 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /glogg/1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + dependencies: + sparkles: 1.0.1 + dev: true + + /graceful-fs/4.2.9: + resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + + /gulp-clean/0.4.0: + resolution: {integrity: sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==} + engines: {node: '>=0.9'} + dependencies: + fancy-log: 1.3.3 + plugin-error: 0.1.2 + rimraf: 2.7.1 + through2: 2.0.5 + vinyl: 2.2.1 + dev: true + + /gulp-cli/2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + ansi-colors: 1.1.0 + archy: 1.0.0 + array-sort: 1.0.0 + color-support: 1.1.3 + concat-stream: 1.6.2 + copy-props: 2.0.5 + fancy-log: 1.3.3 + gulplog: 1.0.0 + interpret: 1.4.0 + isobject: 3.0.1 + liftoff: 3.1.0 + matchdep: 2.0.0 + mute-stdout: 1.0.1 + pretty-hrtime: 1.0.3 + replace-homedir: 1.0.0 + semver-greatest-satisfied-range: 1.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 + dev: true + + /gulp/4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 + vinyl-fs: 3.0.3 + dev: true + + /gulplog/1.0.0: + resolution: {integrity: sha1-4oxNRdBey77YGDY86PnFkmIp/+U=} + engines: {node: '>= 0.10'} + dependencies: + glogg: 1.0.2 + dev: true + + /handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.5 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.14.5 + + /har-schema/2.0.0: + resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} + engines: {node: '>=4'} + dev: true + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints/1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-symbols/1.0.2: + resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: true + + /has-unicode/2.0.1: + resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} + + /has-value/0.3.1: + resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value/1.0.0: + resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values/0.1.4: + resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} + engines: {node: '>=0.10.0'} + dev: true + + /has-values/1.0.0: + resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.0.2: + resolution: {integrity: sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics/4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} + dev: true + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /http-signature/1.2.0: + resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.16.1 + dev: true + + /https-proxy-agent/5.0.0: + resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /humanize-ms/1.2.1: + resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + dependencies: + ms: 2.1.3 + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ignore-walk/3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + dependencies: + minimatch: 3.0.4 + dev: true + + /ignore/4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local/3.0.3: + resolution: {integrity: sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner/1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /init-package-json/2.0.5: + resolution: {integrity: sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==} + engines: {node: '>=10'} + dependencies: + npm-package-arg: 8.1.5 + promzard: 0.3.0 + read: 1.0.7 + read-package-json: 4.1.1 + semver: 7.3.5 + validate-npm-package-license: 3.0.4 + validate-npm-package-name: 3.0.0 + dev: true + + /inquirer/7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /interpret/1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /invert-kv/1.0.0: + resolution: {integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY=} + engines: {node: '>=0.10.0'} + dev: true + + /ip/1.1.5: + resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} + dev: true + + /is-absolute/1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + + /is-accessor-descriptor/0.1.6: + resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.1 + dev: true + + /is-binary-path/1.0.1: + resolution: {integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci/2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-core-module/2.8.0: + resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} + dependencies: + has: 1.0.3 + dev: true + + /is-data-descriptor/0.1.4: + resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-extendable/0.1.1: + resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/1.0.0: + resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob/3.1.0: + resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-lambda/1.0.1: + resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} + dev: true + + /is-negated-glob/1.0.0: + resolution: {integrity: sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.6: + resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/3.0.0: + resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number/4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj/1.1.0: + resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj/2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-relative/1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.1: + resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} + dev: true + + /is-ssh/1.3.3: + resolution: {integrity: sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==} + dependencies: + protocols: 1.4.8 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: true + + /is-text-path/1.0.1: + resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typedarray/1.0.0: + resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + dev: true + + /is-unc-path/1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: true + + /is-utf8/0.2.1: + resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=} + dev: true + + /is-valid-glob/1.0.0: + resolution: {integrity: sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=} + engines: {node: '>=0.10.0'} + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + dev: true + + /isobject/2.1.0: + resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject/3.0.1: + resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} + engines: {node: '>=0.10.0'} + dev: true + + /isstream/0.1.2: + resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.1.0: + resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.16.7 + '@babel/parser': 7.16.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.3 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.3: + resolution: {integrity: sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.1 + dev: true + + /jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.5 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/27.5.1_ts-node@10.5.0: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@10.5.0 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.9 + import-local: 3.0.3 + jest-config: 27.5.1_ts-node@10.5.0 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config/27.5.1_ts-node@10.5.0: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.7 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.16.7 + chalk: 4.1.2 + ci-info: 3.3.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.9 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.4 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.5.0_99ae9436e134a034c8d45fdd98ebbf22 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff/27.4.6: + resolution: {integrity: sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.4.0 + jest-get-type: 27.4.0 + pretty-format: 27.4.6 + dev: true + + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-get-type/27.4.0: + resolution: {integrity: sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.16 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.9 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.4 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.16.7 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.9 + micromatch: 4.0.4 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + + /jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + dev: true + + /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.9 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.21.0 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + + /jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.9 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.0 + graceful-fs: 4.2.9 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 17.0.16 + graceful-fs: 4.2.9 + dev: true + + /jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.16.7 + '@babel/generator': 7.16.7 + '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.14.2 + '@types/prettier': 2.4.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.7 + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.9 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.3.5 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/27.4.2: + resolution: {integrity: sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.4.2 + '@types/node': 17.0.16 + chalk: 4.1.2 + ci-info: 3.3.0 + graceful-fs: 4.2.9 + picomatch: 2.3.1 + dev: true + + /jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + chalk: 4.1.2 + ci-info: 3.3.0 + graceful-fs: 4.2.9 + picomatch: 2.3.1 + dev: true + + /jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.16 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.16 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/27.5.1_ts-node@10.5.0: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@10.5.0 + import-local: 3.0.3 + jest-cli: 27.5.1_ts-node@10.5.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn/0.1.1: + resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} + dev: true + + /jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.5 + acorn: 8.7.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.3.1 + domexception: 2.0.1 + escodegen: 2.0.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.0 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.0.0 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.6 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + dev: true + + /json-stringify-safe/5.0.1: + resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} + dev: true + + /json5/2.2.0: + resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + minimist: 1.2.5 + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.9 + + /jsonparse/1.3.1: + resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} + engines: {'0': node >= 0.2.0} + dev: true + + /jsprim/1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /just-debounce/1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + dev: true + + /kind-of/1.1.0: + resolution: {integrity: sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of/3.2.2: + resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of/4.0.0: + resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /last-run/1.1.1: + resolution: {integrity: sha1-RblpQsF7HHnHchmCWbqUO+v4yls=} + engines: {node: '>= 0.10'} + dependencies: + default-resolution: 2.0.0 + es6-weak-map: 2.0.3 + dev: true + + /lazystream/1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.7 + dev: true + + /lcid/1.0.0: + resolution: {integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: true + + /lead/1.0.0: + resolution: {integrity: sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=} + engines: {node: '>= 0.10'} + dependencies: + flush-write-stream: 1.1.1 + dev: true + + /lerna/4.0.0: + resolution: {integrity: sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg==} + engines: {node: '>= 10.18.0'} + hasBin: true + dependencies: + '@lerna/add': 4.0.0 + '@lerna/bootstrap': 4.0.0 + '@lerna/changed': 4.0.0 + '@lerna/clean': 4.0.0 + '@lerna/cli': 4.0.0 + '@lerna/create': 4.0.0 + '@lerna/diff': 4.0.0 + '@lerna/exec': 4.0.0 + '@lerna/import': 4.0.0 + '@lerna/info': 4.0.0 + '@lerna/init': 4.0.0 + '@lerna/link': 4.0.0 + '@lerna/list': 4.0.0 + '@lerna/publish': 4.0.0 + '@lerna/run': 4.0.0 + '@lerna/version': 4.0.0 + import-local: 3.0.3 + npmlog: 4.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn/0.3.0: + resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libnpmaccess/4.0.3: + resolution: {integrity: sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + minipass: 3.1.6 + npm-package-arg: 8.1.5 + npm-registry-fetch: 11.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /libnpmpublish/4.0.2: + resolution: {integrity: sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw==} + engines: {node: '>=10'} + dependencies: + normalize-package-data: 3.0.3 + npm-package-arg: 8.1.5 + npm-registry-fetch: 11.0.0 + semver: 7.3.5 + ssri: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /liftoff/3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + dependencies: + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.21.0 + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-json-file/1.1.0: + resolution: {integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.9 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs=} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.9 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file/6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.9 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: true + + /locate-path/2.0.0: + resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash._reinterpolate/3.0.0: + resolution: {integrity: sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=} + dev: true + + /lodash.ismatch/4.4.0: + resolution: {integrity: sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=} + dev: true + + /lodash.memoize/4.1.2: + resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.template/4.5.0: + resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.templatesettings: 4.2.0 + dev: true + + /lodash.templatesettings/4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + dependencies: + lodash._reinterpolate: 3.0.0 + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-fetch-happen/8.0.14: + resolution: {integrity: sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.2.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + promise-retry: 2.0.1 + socks-proxy-agent: 5.0.1 + ssri: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen/9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.2.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.2 + promise-retry: 2.0.1 + socks-proxy-agent: 6.1.1 + ssri: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /make-iterator/1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache/0.2.2: + resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/1.0.1: + resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit/1.0.0: + resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /matchdep/2.0.0: + resolution: {integrity: sha1-xvNINKDY28OzfCfui7yyfHd1WC4=} + engines: {node: '>= 0.10.0'} + dependencies: + findup-sync: 2.0.0 + micromatch: 3.1.10 + resolve: 1.21.0 + stack-trace: 0.0.10 + dev: true + + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /micromatch/4.0.4: + resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.51.0: + resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.34: + resolution: {integrity: sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.51.0 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + + /minipass-collect/1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-fetch/1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush/1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-json-stream/1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.1.6 + dev: true + + /minipass-pipeline/1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-sized/1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass/2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /minipass/3.1.6: + resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + yallist: 4.0.0 + dev: true + + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp-infer-owner/2.0.0: + resolution: {integrity: sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + infer-owner: 1.0.4 + mkdirp: 1.0.4 + dev: true + + /mkdirp/0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + dependencies: + minimist: 1.2.5 + dev: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /modify-values/1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multimatch/5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.0.4 + dev: true + + /mute-stdout/1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + dev: true + + /mute-stream/0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /nan/2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + requiresBuild: true + dev: true + optional: true + + /nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + dev: true + + /negotiator/0.6.2: + resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /next-tick/1.0.0: + resolution: {integrity: sha1-yobR/ogoFpsBICCOPchCS524NCw=} + dev: true + + /node-fetch/2.6.6: + resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp/5.1.1: + resolution: {integrity: sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==} + engines: {node: '>= 6.0.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.0 + graceful-fs: 4.2.9 + mkdirp: 0.5.5 + nopt: 4.0.3 + npmlog: 4.1.2 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.7.1 + tar: 4.4.19 + which: 1.3.1 + dev: true + + /node-gyp/7.1.2: + resolution: {integrity: sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==} + engines: {node: '>= 10.12.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.0 + graceful-fs: 4.2.9 + nopt: 5.0.0 + npmlog: 4.1.2 + request: 2.88.2 + rimraf: 3.0.2 + semver: 7.3.5 + tar: 6.1.11 + which: 2.0.2 + dev: true + + /node-int64/0.4.0: + resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} + dev: true + + /node-releases/2.0.1: + resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} + dev: true + + /nopt/4.0.3: + resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + osenv: 0.1.5 + dev: true + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.21.0 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.0.2 + is-core-module: 2.8.0 + semver: 7.3.5 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/2.1.1: + resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url/6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /now-and-later/2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + dependencies: + once: 1.4.0 + dev: true + + /npm-bundled/1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-install-checks/4.0.0: + resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.5 + dev: true + + /npm-lifecycle/3.1.5: + resolution: {integrity: sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==} + dependencies: + byline: 5.0.0 + graceful-fs: 4.2.9 + node-gyp: 5.1.1 + resolve-from: 4.0.0 + slide: 1.1.6 + uid-number: 0.0.6 + umask: 1.1.0 + which: 1.3.1 + dev: true + + /npm-normalize-package-bin/1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: true + + /npm-package-arg/8.1.5: + resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.0.2 + semver: 7.3.5 + validate-npm-package-name: 3.0.0 + dev: true + + /npm-packlist/2.2.2: + resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + glob: 7.2.0 + ignore-walk: 3.0.4 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: true + + /npm-pick-manifest/6.1.1: + resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} + dependencies: + npm-install-checks: 4.0.0 + npm-normalize-package-bin: 1.0.1 + npm-package-arg: 8.1.5 + semver: 7.3.5 + dev: true + + /npm-registry-fetch/11.0.0: + resolution: {integrity: sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==} + engines: {node: '>=10'} + dependencies: + make-fetch-happen: 9.1.0 + minipass: 3.1.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-registry-fetch/9.0.0: + resolution: {integrity: sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==} + engines: {node: '>=10'} + dependencies: + '@npmcli/ci-detect': 1.4.0 + lru-cache: 6.0.0 + make-fetch-happen: 8.0.14 + minipass: 3.1.6 + minipass-fetch: 1.4.1 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 8.1.5 + transitivePeerDependencies: + - supports-color + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npmlog/4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + dependencies: + are-we-there-yet: 1.1.7 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: true + + /npmlog/6.0.1: + resolution: {integrity: sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + are-we-there-yet: 3.0.0 + console-control-strings: 1.1.0 + gauge: 4.0.0 + set-blocking: 2.0.0 + dev: false + + /number-is-nan/1.0.1: + resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} + engines: {node: '>=0.10.0'} + dev: true + + /nwsapi/2.2.0: + resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} + dev: true + + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy/0.1.0: + resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect/1.12.0: + resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit/1.0.1: + resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: true + + /object.defaults/1.1.0: + resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: true + + /object.getownpropertydescriptors/2.1.3: + resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} + engines: {node: '>= 0.8'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /object.map/1.0.1: + resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /object.pick/1.3.0: + resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.reduce/1.0.1: + resolution: {integrity: sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + dependencies: + wrappy: 1.0.2 + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /ordered-read-streams/1.0.1: + resolution: {integrity: sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=} + dependencies: + readable-stream: 2.3.7 + dev: true + + /os-homedir/1.0.2: + resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} + engines: {node: '>=0.10.0'} + dev: true + + /os-locale/1.4.0: + resolution: {integrity: sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} + engines: {node: '>=0.10.0'} + dev: true + + /osenv/0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + + /p-finally/1.0.0: + resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + engines: {node: '>=4'} + dev: true + + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate/2.0.0: + resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-map-series/2.1.0: + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-pipe/3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + dev: true + + /p-queue/6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-reduce/2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + dev: true + + /p-timeout/3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try/1.0.0: + resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} + engines: {node: '>=4'} + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /p-waterfall/2.1.1: + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} + dependencies: + p-reduce: 2.1.0 + dev: true + + /pacote/11.3.5: + resolution: {integrity: sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@npmcli/git': 2.1.0 + '@npmcli/installed-package-contents': 1.0.7 + '@npmcli/promise-spawn': 1.3.2 + '@npmcli/run-script': 1.8.6 + cacache: 15.3.0 + chownr: 2.0.0 + fs-minipass: 2.1.0 + infer-owner: 1.0.4 + minipass: 3.1.6 + mkdirp: 1.0.4 + npm-package-arg: 8.1.5 + npm-packlist: 2.2.2 + npm-pick-manifest: 6.1.1 + npm-registry-fetch: 11.0.0 + promise-retry: 2.0.1 + read-package-json-fast: 2.0.3 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.11 + transitivePeerDependencies: + - supports-color + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-filepath/1.0.2: + resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + + /parse-json/2.2.0: + resolution: {integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json/4.0.0: + resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.16.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse-passwd/1.0.0: + resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} + engines: {node: '>=0.10.0'} + dev: true + + /parse-path/4.0.3: + resolution: {integrity: sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==} + dependencies: + is-ssh: 1.3.3 + protocols: 1.4.8 + qs: 6.10.2 + query-string: 6.14.1 + dev: true + + /parse-url/6.0.0: + resolution: {integrity: sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==} + dependencies: + is-ssh: 1.3.3 + normalize-url: 6.1.0 + parse-path: 4.0.3 + protocols: 1.4.8 + dev: true + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /pascalcase/0.1.1: + resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} + engines: {node: '>=0.10.0'} + dev: true + + /path-dirname/1.0.2: + resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} + dev: true + + /path-exists/2.1.0: + resolution: {integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists/3.0.0: + resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-root-regex/0.1.2: + resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} + engines: {node: '>=0.10.0'} + dev: true + + /path-root/0.1.1: + resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: true + + /path-starts-with/2.0.0: + resolution: {integrity: sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==} + engines: {node: '>=8'} + dev: true + + /path-type/1.1.0: + resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.9 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /performance-now/2.1.0: + resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} + engines: {node: '>=0.10.0'} + dev: true + + /pify/3.0.0: + resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + engines: {node: '>=4'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pify/5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + + /pinkie-promise/2.0.1: + resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie/2.0.4: + resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + engines: {node: '>=0.10.0'} + dev: true + + /pirates/4.0.4: + resolution: {integrity: sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plugin-error/0.1.2: + resolution: {integrity: sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-cyan: 0.1.1 + ansi-red: 0.1.1 + arr-diff: 1.1.0 + arr-union: 2.1.0 + extend-shallow: 1.1.4 + dev: true + + /pluralize/8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: false + + /posix-character-classes/0.1.1: + resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} + engines: {node: '>=0.10.0'} + dev: true + + /prelude-ls/1.1.2: + resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers/1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier/2.5.1: + resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format/27.4.6: + resolution: {integrity: sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-hrtime/1.0.3: + resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} + engines: {node: '>= 0.8'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + dev: true + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /promzard/0.3.0: + resolution: {integrity: sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=} + dependencies: + read: 1.0.7 + dev: true + + /proto-list/1.2.4: + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} + dev: true + + /protocols/1.4.8: + resolution: {integrity: sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==} + dev: true + + /psl/1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: true + + /pump/2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pumpify/1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /q/1.5.1: + resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qs/6.10.2: + resolution: {integrity: sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs/6.5.2: + resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} + engines: {node: '>=0.6'} + dev: true + + /query-string/6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.0 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /qx-util/0.1.0: + resolution: {integrity: sha512-TiSe53Y6HGrIC0T2Ist4AcApvo5rQkRg8E3Vb/Tregmh5Uhc9Cr8QN2PYIN3bBtebsxmhWyqA56TguuFzhW8sg==} + dependencies: + fs-extra: 10.0.0 + ramda: 0.28.0 + rimraf: 3.0.2 + dev: false + + /ramda/0.28.0: + resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} + dev: false + + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /read-cmd-shim/2.0.0: + resolution: {integrity: sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==} + dev: true + + /read-package-json-fast/2.0.3: + resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} + engines: {node: '>=10'} + dependencies: + json-parse-even-better-errors: 2.3.1 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json/2.1.2: + resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==} + dependencies: + glob: 7.2.0 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 2.5.0 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json/3.0.1: + resolution: {integrity: sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng==} + engines: {node: '>=10'} + dependencies: + glob: 7.2.0 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 3.0.3 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json/4.1.1: + resolution: {integrity: sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==} + engines: {node: '>=10'} + dependencies: + glob: 7.2.0 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 3.0.3 + npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-tree/5.3.1: + resolution: {integrity: sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==} + dependencies: + read-package-json: 2.1.2 + readdir-scoped-modules: 1.1.0 + util-promisify: 2.1.0 + dev: true + + /read-pkg-up/1.0.1: + resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up/3.0.0: + resolution: {integrity: sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/1.1.0: + resolution: {integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read/1.0.7: + resolution: {integrity: sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=} + engines: {node: '>=0.8'} + dependencies: + mute-stream: 0.0.8 + dev: true + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdir-scoped-modules/1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.3 + graceful-fs: 4.2.9 + once: 1.4.0 + dev: true + + /readdirp/2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.9 + micromatch: 3.1.10 + readable-stream: 2.3.7 + dev: true + + /rechoir/0.6.2: + resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.21.0 + dev: true + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /remove-bom-buffer/3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + dev: true + + /remove-bom-stream/1.2.0: + resolution: {integrity: sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=} + engines: {node: '>= 0.10'} + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + dev: true + + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} + dev: true + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string/1.6.1: + resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} + engines: {node: '>=0.10'} + dev: true + + /replace-ext/1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /replace-homedir/1.0.0: + resolution: {integrity: sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + is-absolute: 1.0.0 + remove-trailing-separator: 1.1.0 + dev: true + + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.34 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename/1.0.1: + resolution: {integrity: sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-dir/1.0.1: + resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-options/1.1.0: + resolution: {integrity: sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=} + engines: {node: '>= 0.10'} + dependencies: + value-or-function: 3.0.0 + dev: true + + /resolve-url/0.2.1: + resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + + /resolve/1.21.0: + resolution: {integrity: sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==} + hasBin: true + dependencies: + is-core-module: 2.8.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.6 + dev: true + + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /retry/0.12.0: + resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} + engines: {node: '>= 4'} + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + + /run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs/6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex/1.1.0: + resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /semver-greatest-satisfied-range/1.1.0: + resolution: {integrity: sha1-E+jCZYq5aRywzXEJMkAoDTb3els=} + engines: {node: '>= 0.10'} + dependencies: + sver-compat: 1.5.0 + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.12.0 + dev: true + + /signal-exit/3.0.6: + resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slide/1.1.6: + resolution: {integrity: sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=} + dev: true + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + dev: true + + /socks-proxy-agent/5.0.1: + resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.3 + socks: 2.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks-proxy-agent/6.1.1: + resolution: {integrity: sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.3 + socks: 2.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks/2.6.1: + resolution: {integrity: sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 1.1.5 + smart-buffer: 4.2.0 + dev: true + + /sort-keys/2.0.0: + resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sort-keys/4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + dev: true + + /source-map/0.5.7: + resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map/0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: true + + /sparkles/1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + dev: true + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: true + + /split-on-first/1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: true + + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split/1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /sprintf-js/1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + dev: true + + /sshpk/1.16.1: + resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /ssri/8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /stack-trace/0.0.10: + resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} + dev: true + + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /static-extend/0.1.2: + resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /stream-exhaust/1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + dev: true + + /stream-shift/1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /strict-uri-encode/2.0.0: + resolution: {integrity: sha1-ucczDHBChi9rFC3CdLvMWGbONUY=} + engines: {node: '>=4'} + dev: true + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width/1.0.2: + resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string.prototype.trimend/1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /string.prototype.trimstart/1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi/3.0.1: + resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom/2.0.0: + resolution: {integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} + engines: {node: '>=4'} + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strong-log-transformer/2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + dependencies: + duplexer: 0.1.2 + minimist: 1.2.5 + through: 2.3.8 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.2.0: + resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /sver-compat/1.5.0: + resolution: {integrity: sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + + /tar/4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.5 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /temp-dir/1.0.0: + resolution: {integrity: sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=} + engines: {node: '>=4'} + dev: true + + /temp-write/4.0.0: + resolution: {integrity: sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.9 + is-stream: 2.0.1 + make-dir: 3.1.0 + temp-dir: 1.0.0 + uuid: 3.4.0 + dev: true + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.2.0 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.0 + minimatch: 3.0.4 + dev: true + + /text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} + dev: true + + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} + dev: true + + /through2-filter/3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + dev: true + + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /time-stamp/1.1.0: + resolution: {integrity: sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=} + engines: {node: '>=0.10.0'} + dev: true + + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-absolute-glob/2.0.2: + resolution: {integrity: sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=} + engines: {node: '>=0.10.0'} + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + engines: {node: '>=4'} + dev: true + + /to-object-path/0.3.0: + resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range/2.1.1: + resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /to-through/2.0.0: + resolution: {integrity: sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=} + engines: {node: '>= 0.10'} + dependencies: + through2: 2.0.5 + dev: true + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: true + + /tough-cookie/4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + engines: {node: '>=6'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + universalify: 0.1.2 + dev: true + + /tr46/0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + dev: true + + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.1.1 + dev: true + + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-jest/27.1.3_1e2406a8ca2ae3dc934d01f9ee2aebbb: + resolution: {integrity: sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: ~0.14.0 + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@types/jest': 27.4.0 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1_ts-node@10.5.0 + jest-util: 27.4.2 + json5: 2.2.0 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.5 + typescript: 4.5.5 + yargs-parser: 20.2.9 + dev: true + + /ts-node/10.5.0_99ae9436e134a034c8d45fdd98ebbf22: + resolution: {integrity: sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.8 + '@tsconfig/node12': 1.0.9 + '@tsconfig/node14': 1.0.1 + '@tsconfig/node16': 1.0.2 + '@types/node': 17.0.16 + acorn: 8.7.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.5.5 + v8-compile-cache-lib: 3.0.0 + yn: 3.1.1 + dev: true + + /ts-toolbelt/6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tsutils/3.21.0_typescript@4.5.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + 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 || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.5.5 + dev: true + + /tunnel-agent/0.6.0: + resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl/0.14.5: + resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + dev: true + + /type-check/0.3.2: + resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.4.1: + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type/1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type/2.5.0: + resolution: {integrity: sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==} + dev: true + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray/0.0.6: + resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} + dev: true + + /typescript/4.5.5: + resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /uglify-js/3.14.5: + resolution: {integrity: sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + optional: true + + /uid-number/0.0.6: + resolution: {integrity: sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=} + dev: true + + /umask/1.1.0: + resolution: {integrity: sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=} + dev: true + + /unbox-primitive/1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: true + + /unc-path-regex/0.1.2: + resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} + engines: {node: '>=0.10.0'} + dev: true + + /undertaker-registry/1.0.1: + resolution: {integrity: sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=} + engines: {node: '>= 0.10'} + dev: true + + /undertaker/1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + dependencies: + arr-flatten: 1.1.0 + arr-map: 2.0.2 + bach: 1.2.0 + collection-map: 1.0.0 + es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 + last-run: 1.1.1 + object.defaults: 1.1.0 + object.reduce: 1.0.1 + undertaker-registry: 1.0.1 + dev: true + + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-filename/1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-slug/2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-stream/2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + dev: true + + /universal-user-agent/6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: true + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unset-value/1.0.0: + resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /upath/2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /urix/0.1.0: + resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + + /util-promisify/2.1.0: + resolution: {integrity: sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=} + dependencies: + object.getownpropertydescriptors: 2.1.3 + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + 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. + hasBin: true + dev: true + + /v8-compile-cache-lib/3.0.0: + resolution: {integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==} + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul/8.1.0: + resolution: {integrity: sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 + source-map: 0.7.3 + dev: true + + /v8flags/3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name/3.0.0: + resolution: {integrity: sha1-X6kS2B630MdK/BQN5zF/DKffQ34=} + dependencies: + builtins: 1.0.3 + dev: true + + /value-or-function/3.0.0: + resolution: {integrity: sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=} + engines: {node: '>= 0.10'} + dev: true + + /verror/1.10.0: + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vinyl-fs/3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.9 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.2 + pumpify: 1.5.1 + readable-stream: 2.3.7 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + dev: true + + /vinyl-sourcemap/1.1.0: + resolution: {integrity: sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=} + engines: {node: '>= 0.10'} + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.8.0 + graceful-fs: 4.2.9 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl/2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /wcwidth/1.0.1: + resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} + dependencies: + defaults: 1.0.3 + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + dev: true + + /webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.6 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module/1.0.0: + resolution: {integrity: sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=} + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap/1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} + + /wrap-ansi/2.1.0: + resolution: {integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + + /write-file-atomic/2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.9 + imurmurhash: 0.1.4 + signal-exit: 3.0.6 + dev: true + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.6 + typedarray-to-buffer: 3.1.5 + dev: true + + /write-json-file/3.2.0: + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.2.9 + make-dir: 2.1.0 + pify: 4.0.1 + sort-keys: 2.0.0 + write-file-atomic: 2.4.3 + dev: true + + /write-json-file/4.3.0: + resolution: {integrity: sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==} + engines: {node: '>=8.3'} + dependencies: + detect-indent: 6.1.0 + graceful-fs: 4.2.9 + is-plain-obj: 2.1.0 + make-dir: 3.1.0 + sort-keys: 4.2.0 + write-file-atomic: 3.0.3 + dev: true + + /write-pkg/4.0.0: + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} + dependencies: + sort-keys: 2.0.0 + type-fest: 0.4.1 + write-json-file: 3.2.0 + dev: true + + /ws/7.5.6: + resolution: {integrity: sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n/3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser/20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + dependencies: + camelcase: 3.0.0 + object.assign: 4.1.2 + dev: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs/7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.2 + yargs-parser: 5.0.1 + dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000000000000000000000000000000000..18ec407efca710b5d0d1e19dd3e34a27ac6716a1 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*' diff --git a/tools/gulp/config.ts b/tools/gulp/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8c6595b27ee8e0c500581c5a6372b4a189ea34c --- /dev/null +++ b/tools/gulp/config.ts @@ -0,0 +1,4 @@ +// 需要清理的文件根目录 +export const sources = ['packages/*']; +// 需要清理 node_modules 的目录 +export const nodeModulesSources = ['packages/*']; diff --git a/tools/gulp/gulpfile.ts b/tools/gulp/gulpfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..8affe48a9d62a2af82424d4477e480f436d1cc83 --- /dev/null +++ b/tools/gulp/gulpfile.ts @@ -0,0 +1 @@ +import './tasks/clean'; diff --git a/tools/gulp/tasks/clean.ts b/tools/gulp/tasks/clean.ts new file mode 100644 index 0000000000000000000000000000000000000000..c149257c197406a19b0e063405a126f79d661b74 --- /dev/null +++ b/tools/gulp/tasks/clean.ts @@ -0,0 +1,44 @@ +import * as deleteEmpty from 'delete-empty'; +import { series, src, task } from 'gulp'; +import * as clean from 'gulp-clean'; +import { sources, nodeModulesSources } from '../config'; + +/** + * Cleans the build output assets from the packages folders + */ +function cleanOutput() { + const files = sources.map(source => [ + `${source}/out`, + ]); + return src( + files.reduce((a, b) => a.concat(b), []), + { + read: false, + }, + ).pipe(clean()); +} + +function cleanNodeModules() { + const files = nodeModulesSources.map(source => [ + `${source}/node_modules`, + ]); + return src( + files.reduce((a, b) => a.concat(b), []), + { + read: false, + }, + ).pipe(clean()); +} + +/** + * Cleans empty dirs + */ +function cleanDirs(done: () => void) { + sources.forEach(source => deleteEmpty.sync(`${source}/`)); + done(); +} + +task('clean:node-modules', cleanNodeModules); +task('clean:output', cleanOutput); +task('clean:dirs', cleanDirs); +task('clean:bundle', series('clean:output', 'clean:dirs')); diff --git a/tools/gulp/tsconfig.json b/tools/gulp/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..5286c1c80cf08c2c46a27e1561f009543983d380 --- /dev/null +++ b/tools/gulp/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "noUnusedParameters": false, + "noUnusedLocals": false, + "lib": [ + "es2015", + "dom", + "es2016.array.include" + ], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "../../dist/tools/gulp", + "strictNullChecks": true, + "strictFunctionTypes": true, + "noImplicitThis": true, + "noEmitOnError": true, + "noImplicitAny": false, + "target": "es5", + "types": [ + "node" + ], + "typeRoots": [ + "./typings", + "../../node_modules/@types/" + ], + "baseUrl": ".", + }, + "files": [ + "gulpfile.ts" + ] +} diff --git a/tools/gulp/util/task-helpers.ts b/tools/gulp/util/task-helpers.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b154256fcbedb9bcebddabd046d18a8c5eeb1b5 --- /dev/null +++ b/tools/gulp/util/task-helpers.ts @@ -0,0 +1,14 @@ +import { readdirSync, statSync } from 'fs-extra'; +import { join } from 'path'; + +function isDirectory(path: string) { + return statSync(path).isDirectory(); +} + +export function getFolders(dir: string) { + return readdirSync(dir).filter(file => isDirectory(join(dir, file))); +} + +export function getDirs(base: string) { + return getFolders(base).map(path => `${base}/${path}`); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..c98c61685677b2c8db91f5a66ee09f3155df8dc0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "lib": [ + "ES2020" + ], + "rootDir": "src", + "moduleResolution": "node", + "sourceMap": true, + "declaration": true, + "declarationMap": true, + "strict": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "experimentalDecorators": true + } +}