From 80aabbcaf912f555a8b8a1e109872304e45951f6 Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Fri, 2 Apr 2021 17:29:56 +0100 Subject: [PATCH 1/4] Add .vscode to .gitignore Brings this repo in line with other core repos --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index aaa3fd861..f1529e4ec 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ docs/it/extend/update-b14.md docs/it/extend/update-b13.md docs/it/extend/update-b12.md docs/it/extend/update-b10.md +.vscode From 71cc64760e15c097605d54228b7cf8223760ab84 Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Fri, 2 Apr 2021 17:30:14 +0100 Subject: [PATCH 2/4] Set up Prettier --- .prettierrc.json | 6 + package-lock.json | 17002 ++++++++++++++++++++++++++++++++++++++++---- package.json | 8 +- 3 files changed, 15491 insertions(+), 1525 deletions(-) create mode 100644 .prettierrc.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 000000000..944d65352 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "printWidth": 150, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5" +} diff --git a/package-lock.json b/package-lock.json index 0a8102bc4..a452d677a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,467 +1,14021 @@ { + "name": "flarum-docs", + "lockfileVersion": 2, "requires": true, - "lockfileVersion": 1, + "packages": { + "": { + "devDependencies": { + "prettier": "^2.2.1", + "vuepress": "^1.8.2", + "vuepress-plugin-container": "^2.1.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", + "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.13.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz", + "integrity": "sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz", + "integrity": "sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", + "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.12", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/types": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.4.tgz", + "integrity": "sha512-Vu5gsabUdsiWc4vQarg46xWJGs8pMEJyyMQAKA1vO+F4+aR4/jaxWxPCOvZ7XvVyy+ecSbwQp/qIyDVje360UQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.12.tgz", + "integrity": "sha512-8q67ORQ9O0Ms0nlqsXTVhaBefRBaLrzPxOewAZhdcO7onHwcO5/wRdWtHhZgfpCZlhY7NogkU16z3WnorSSkEA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.0.0-0" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/@vuepress/core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.8.2.tgz", + "integrity": "sha512-lh9BLC06k9s0wxTuWtCkiNj49fkbW87enp0XSrFZHEoyDGSGndQjZmMMErcHc5Hx7nrW1nzc33sPH1NNtJl0hw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.8.2", + "@vuepress/markdown-loader": "1.8.2", + "@vuepress/plugin-last-updated": "1.8.2", + "@vuepress/plugin-register-components": "1.8.2", + "@vuepress/shared-utils": "1.8.2", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", + "webpackbar": "3.2.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@vuepress/markdown": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.8.2.tgz", + "integrity": "sha512-zznBHVqW+iBkznF/BO/GY9RFu53khyl0Ey0PnGqvwCJpRLNan6y5EXgYumtjw2GSYn5nDTTALYxtyNBdz64PKg==", + "dev": true, + "dependencies": { + "@vuepress/shared-utils": "1.8.2", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "node_modules/@vuepress/markdown-loader": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.8.2.tgz", + "integrity": "sha512-mWzFXikCUcAN/chpKkqZpRYKdo0312hMv8cBea2hvrJYV6y4ODB066XKvXN8JwOcxuCjxWYJkhWGr+pXq1oTtw==", + "dev": true, + "dependencies": { + "@vuepress/markdown": "1.8.2", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "node_modules/@vuepress/plugin-active-header-links": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.8.2.tgz", + "integrity": "sha512-JmXAQg8D7J8mcKe2Ue3BZ9dOCzJMJXP4Cnkkc/IrqfDg0ET0l96gYWZohCqlvRIWt4f0VPiFAO4FLYrW+hko+g==", + "dev": true, + "dependencies": { + "lodash.debounce": "^4.0.8" + } + }, + "node_modules/@vuepress/plugin-last-updated": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.8.2.tgz", + "integrity": "sha512-pYIRZi52huO9b6HY3JQNPKNERCLzMHejjBRt9ekdnJ1xhLs4MmRvt37BoXjI/qzvXkYtr7nmGgnKThNBVRTZuA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.5" + } + }, + "node_modules/@vuepress/plugin-nprogress": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.8.2.tgz", + "integrity": "sha512-3TOBee2NM3WLr1tdjDTGfrAMggjN+OlEPyKyv8FqThsVkDYhw48O3HwqlThp9KX7UbL3ExxIFBwWRFLC+kYrdw==", + "dev": true, + "dependencies": { + "nprogress": "^0.2.0" + } + }, + "node_modules/@vuepress/plugin-register-components": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.8.2.tgz", + "integrity": "sha512-6SUq3nHFMEh9qKFnjA8QnrNxj0kLs7+Gspq1OBU8vtu0NQmSvLFZVaMV7pzT/9zN2nO5Pld5qhsUJv1g71MrEA==", + "dev": true, + "dependencies": { + "@vuepress/shared-utils": "1.8.2" + } + }, + "node_modules/@vuepress/plugin-search": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.8.2.tgz", + "integrity": "sha512-JrSJr9o0Kar14lVtZ4wfw39pplxvvMh8vDBD9oW09a+6Zi/4bySPGdcdaqdqGW+OHSiZNvG+6uyfKSBBBqF6PA==", + "dev": true + }, + "node_modules/@vuepress/shared-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.8.2.tgz", + "integrity": "sha512-6kGubc7iBDWruEBUU7yR+sQ++SOhMuvKWvWeTZJKRZedthycdzYz7QVpua0FaZSAJm5/dIt8ymU4WQvxTtZgTQ==", + "dev": true, + "dependencies": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + } + }, + "node_modules/@vuepress/theme-default": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.8.2.tgz", + "integrity": "sha512-rE7M1rs3n2xp4a/GrweO8EGwqFn3EA5gnFWdVmVIHyr7C1nix+EqjpPQF1SVWNnIrDdQuCw38PqS+oND1K2vYw==", + "dev": true, + "dependencies": { + "@vuepress/plugin-active-header-links": "1.8.2", + "@vuepress/plugin-nprogress": "1.8.2", + "@vuepress/plugin-search": "1.8.2", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "dev": true, + "dependencies": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/algoliasearch/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/algoliasearch/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/algoliasearch/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "dev": true, + "dependencies": { + "immediate": "^3.2.3" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.6.1.tgz", + "integrity": "sha512-uhki4T3Ax68hw7Dufi0bATVAF8ayBSwOKUEJHjObPrUN4tlQ8Lf7oljpTje/mArLxYN0D743c2zJt4C1bVTCqg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "dev": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cache-loader/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cache-loader/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001205", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz", + "integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==", + "dev": true + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz", + "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "dev": true, + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.0.tgz", + "integrity": "sha512-MQx/7TLgmmDVamSyfE+O+5BHvG1aUGj/gHhLn1wVtm2B5u1eVIPvh7vkfjwWKNCjrTJB8+He99IntSQ1qP+vYQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.0.tgz", + "integrity": "sha512-9yVewub2MXNYyGvuLnMHcN1k9RkvB7/ofktpeKTIaASyB88YYqGzUnu0ywMMhJrDHOMiTjSHWGzR+i7Wb9Z1kQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "dependencies": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "dev": true, + "dependencies": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.705", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.705.tgz", + "integrity": "sha512-agtrL5vLSOIK89sE/YSzAgqCw76eZ60gf3J7Tid5RfLbSp5H4nWL28/dIV+H+ZhNNi1JNiaF62jffwYsAyXc0g==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.0", + "through": "~2.3.4" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.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.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "dependencies": { + "ini": "^1.3.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/gray-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", + "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", + "dev": true, + "dependencies": { + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", + "dev": true, + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hogan.js/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "dependencies": { + "html-comment-regex": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=", + "dev": true + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "peerDependencies": { + "markdown-it": "*" + } + }, + "node_modules/markdown-it-chain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", + "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", + "dev": true, + "dependencies": { + "webpack-chain": "^4.9.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "markdown-it": ">=5.0.0" + } + }, + "node_modules/markdown-it-chain/node_modules/javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, + "node_modules/markdown-it-chain/node_modules/webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + }, + "node_modules/markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=", + "dev": true + }, + "node_modules/markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=", + "dev": true + }, + "node_modules/markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", + "dev": true, + "engines": { + "node": ">6.4.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=", + "dev": true + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dev": true, + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "dependencies": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "dev": true, + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "dependencies": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/smoothscroll-polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", + "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", + "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", + "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", + "dev": true, + "dependencies": { + "ci-info": "^3.0.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + }, + "peerDependencies": { + "stylus": ">=0.52.4" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vue": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==", + "dev": true + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "node_modules/vue-loader": { + "version": "15.9.6", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", + "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", + "dev": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==", + "dev": true + }, + "node_modules/vue-server-renderer": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz", + "integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "hash-sum": "^1.0.2", + "he": "^1.1.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.2.0", + "serialize-javascript": "^3.1.0", + "source-map": "0.5.6" + } + }, + "node_modules/vue-server-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/vue-server-renderer/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/vuepress": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.8.2.tgz", + "integrity": "sha512-BU1lUDwsA3ghf7a9ga4dsf0iTc++Z/l7BR1kUagHWVBHw7HNRgRDfAZBDDQXhllMILVToIxaTifpne9mSi94OA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@vuepress/core": "1.8.2", + "@vuepress/theme-default": "1.8.2", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "bin": { + "vuepress": "cli.js" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/vuepress-html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", + "dev": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/vuepress-plugin-container": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", + "dev": true, + "dependencies": { + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" + } + }, + "node_modules/vuepress-plugin-smooth-scroll": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", + "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", + "dev": true, + "dependencies": { + "smoothscroll-polyfill": "^0.4.3" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/watchpack/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/watchpack/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchpack/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/watchpack/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/compat-data": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.0.tgz", - "integrity": "sha512-jAbCtMANC9ptXxbSVXIqV/3H0bkh7iyyv6JS5lu10av45bcc2QmDNJXkASZCFwbBt75Q0AEq/BB+bNa3x1QgYQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", "dev": true }, "@babel/core": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.0.tgz", - "integrity": "sha512-iV7Gwg0DePKvdDZZWRTkj4MW+6/AbVWd4ZCg+zk8H1RVt5xBpUZS6vLQWwb3pyLg4BFTaGiQCPoJ4Ibmbne4fA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.0", - "@babel/helper-module-transforms": "^7.12.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.12.0", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.0", - "@babel/types": "^7.12.0", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz", + "integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" } }, "@babel/generator": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.0.tgz", - "integrity": "sha512-8lnf4QcyiQMf5XQp47BltuMTocsOh6P0z/vueEh8GzhmWWlDbdvOoI5Ziddg0XYhmnx35HyByUW51/9NprF8cA==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.0", + "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-compilation-targets": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.0.tgz", - "integrity": "sha512-NbDFJNjDgxE7IkrHp5gq2+Tr8bEdCLKYN90YDQEjMiTMUAFAcShNkaH8kydcmU0mEQTiQY0Ydy/+1xfS2OCEnw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.0", - "@babel/helper-validator-option": "^7.12.0", - "browserslist": "^4.12.0", - "semver": "^5.5.0" + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.0.tgz", - "integrity": "sha512-9tD1r9RK928vxvxcoNK8/7uwT7Q2DJZP1dnJmyMAJPwOF0yr8PPwqdpyw33lUpCfrJ765bOs5XNa4KSfUDWFSw==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.0", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.0", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.0.tgz", - "integrity": "sha512-YBqH+3wLcom+tko8/JLgRcG8DMqORgmjqNRNI751gTioJSZHWFybO1mRoLtJtWIlYSHY+zT9LqqnbbK1c3KIVQ==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.0.tgz", - "integrity": "sha512-I0d/bgzgzgLsJMk7UZ0TN2KV3OGjC/t/9Saz8PKb9jrcEAXhgjGysOgp4PDKydIKjUv/gj2St4ae+ov8l+T9Xg==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.0" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.0.tgz", - "integrity": "sha512-1ZTMoCiLSzTJLbq7mSaTHki4oIrBIf/dUbzdhwTrvtMU3ZNVKwQmGae3gSiqppo7G8HAgnXmc43rfEaD8yYLLQ==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.0", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.0", - "@babel/types": "^7.12.0", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.0.tgz", - "integrity": "sha512-9kycFdq2c9e7PXZOr2z/ZqTFF9OzFu287iFwYS+CiDVPuoTCfY8hoTsIqNQNetQjlqoRsRyJFrMG1uhGAR4EEw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.0", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.0", - "@babel/types": "^7.12.0" + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.12" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.0.tgz", - "integrity": "sha512-NRfKaAQw/JCMsTFUdJI6cp4MoJGGVBRQTRSiW1nwlGldNqzjB9jqWI0SZqQksC724dJoKqwG+QqfS9ib7SoVsw==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.0.tgz", - "integrity": "sha512-dYmySMYnlus2jwl7JnnajAj11obRStZoW9cG04wh4ZuhozDn11tDUrhHcUZ9iuNHqALAhh60XqNaYXpvuuE/Gg==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", "dev": true }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } + }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==", + "version": "7.13.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz", + "integrity": "sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.0.tgz", - "integrity": "sha512-ao43U2ptSe+mIZAQo2nBV5Wx2Ie3i2XbLt8jCXZpv+bvLY1Twv0lak4YZ1Ps5OwbeLMAl3iOVScgGMOImBae1g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.0.tgz", - "integrity": "sha512-dssjXHzdMQal4q6GCSwDTVPEbyBLdd9+7aSlzAkQbrGEKq5xG8pvhQ7u2ktUrCLRmzQphZnSzILBL5ta4xSRlA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.0.tgz", - "integrity": "sha512-JpNWix2VP2ue31r72fKytTE13nPX1fxl1mudfTaTwcDhl3iExz5NZjQBq012b/BQ6URWoc/onI73pZdYlAfihg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.0.tgz", - "integrity": "sha512-iON65YmIy/IpEgteYJ4HfO2q30SLdIxiyjNNlsSjSl0tUxLhSH9PljE5r6sczwdW64ZZzznYNcezdcROB+rDDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.0.tgz", - "integrity": "sha512-CXu9aw32FH/MksqdKvhpiH8pSvxnXJ33E7I7BGNE9VzNRpWgpNzvPpds/tW9E0pjmX9+D1zAHRyHbtyeTboo2g==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { @@ -474,21 +14028,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -519,12 +14073,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -582,415 +14136,415 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.0.tgz", - "integrity": "sha512-h2fDMnwRwBiNMmTGAWqUo404Z3oLbrPE6hyATecyIbsEsrbM5gjLbfKQLb6hjiouMlGHH+yliYBbc4NPgWKE/g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.0", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.0.tgz", - "integrity": "sha512-BC8wiTo+0kEG8M6wuEBeuG7AIazTan02/Bh4dgi+wdDBE+p2iv5AXO8OUjrwD100223S/2WbALSqj7c290XTKg==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz", + "integrity": "sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/preset-env": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.0.tgz", - "integrity": "sha512-jSIHvHSuF+hBUIrvA2/61yIzhH+ceLOXGLTH1nwPvQlso/lNxXsoE/nvrCzY5M77KRzhKegB1CvdhWPZmYDZ5A==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.0", - "@babel/helper-compilation-targets": "^7.12.0", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.0", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.12.0", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.0", - "@babel/plugin-proposal-numeric-separator": "^7.12.0", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.12.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", + "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.12.0", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.0", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.12", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" } }, "@babel/preset-modules": { @@ -1007,49 +14561,48 @@ } }, "@babel/runtime": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.0.tgz", - "integrity": "sha512-lS4QLXQ2Vbw2ubfQjeQcn+BZgZ5+ROHW9f+DWjEp5Y+NHYmkRGKqHSJ1tuhbUauKu2nhZNTBIvsIQ8dXfY5Gjw==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.0.tgz", - "integrity": "sha512-ZU9e79xpOukCNPkQ1UzR4gJKCruGckr6edd8v8lmKpSk8iakgUIvb+5ZtaKKV9f7O+x5r+xbMDDIbzVpUoiIuw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.0.tgz", - "integrity": "sha512-ggIyFmT2zMaYRheOfPDQ4gz7QqV3B+t2rjqjbttDJxMcb7/LukvWCmlIl1sWcOxrvwpTDd+z0OytzqsbGeb3/g==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1096,21 +14649,21 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", "dev": true }, "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==", "dev": true }, "@types/q": { @@ -1120,42 +14673,43 @@ "dev": true }, "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", "dev": true }, "@vue/babel-helper-vue-transform-on": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.0-rc.2.tgz", - "integrity": "sha512-1+7CwjQ0Kasml6rHoNQUmbISwqLNNfFVBUcZl6QBremUl296ZmLrVQPqJP5pyAAWjZke5bpI1hlj+LVVuT7Jcg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", "dev": true }, "@vue/babel-plugin-jsx": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.0-rc.3.tgz", - "integrity": "sha512-/Ibq0hoKsidnHWPhgRpjcjYhYcHpqEm2fiKVAPO88OXZNHGwaGgS4yXkC6TDEvlZep4mBDo+2S5T81wpbVh90Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.4.tgz", + "integrity": "sha512-Vu5gsabUdsiWc4vQarg46xWJGs8pMEJyyMQAKA1vO+F4+aR4/jaxWxPCOvZ7XvVyy+ecSbwQp/qIyDVje360UQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.0-rc.2", + "@vue/babel-helper-vue-transform-on": "^1.0.2", "camelcase": "^6.0.0", "html-tags": "^3.1.0", "svg-tags": "^1.0.0" } }, "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", "html-tags": "^2.0.0", "lodash.kebabcase": "^4.1.1", "svg-tags": "^1.0.0" @@ -1170,12 +14724,11 @@ } }, "@vue/babel-preset-app": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.7.tgz", - "integrity": "sha512-A9ujqmvR9wb8nWiMnEYZW/8QfGZbqxC/etzbKIDrUdsqJ27jx106leMHJc8nmAn58RqGd6iww6uZ3Sx7aYiG3A==", + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.12.tgz", + "integrity": "sha512-8q67ORQ9O0Ms0nlqsXTVhaBefRBaLrzPxOewAZhdcO7onHwcO5/wRdWtHhZgfpCZlhY7NogkU16z3WnorSSkEA==", "dev": true, "requires": { - "@babel/core": "^7.11.0", "@babel/helper-compilation-targets": "^7.9.6", "@babel/helper-module-imports": "^7.8.3", "@babel/plugin-proposal-class-properties": "^7.8.3", @@ -1185,63 +14738,74 @@ "@babel/plugin-transform-runtime": "^7.11.0", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.0", - "@vue/babel-plugin-jsx": "^1.0.0-0", - "@vue/babel-preset-jsx": "^1.1.2", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.6.5", "core-js-compat": "^3.6.5", "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, - "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==", + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", "dev": true, "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "@vue/babel-sugar-functional-vue": "^1.1.2", - "@vue/babel-sugar-inject-h": "^1.1.2", - "@vue/babel-sugar-v-model": "^1.1.2", - "@vue/babel-sugar-v-on": "^1.1.2" + "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", "camelcase": "^5.0.0", "html-tags": "^2.0.0", "svg-tags": "^1.0.0" @@ -1262,13 +14826,13 @@ } }, "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", "camelcase": "^5.0.0" }, "dependencies": { @@ -1307,6 +14871,13 @@ "yallist": "^2.1.2" } }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1322,18 +14893,18 @@ } }, "@vuepress/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.7.1.tgz", - "integrity": "sha512-M5sxZq30Ke1vXa4ZZjk6185fwtpiJOqzXNnzcIe0GxtvtaF8Yij6b+KqQKlUJnnUXm+CKxiLCr8PTzDY26N7yw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.8.2.tgz", + "integrity": "sha512-lh9BLC06k9s0wxTuWtCkiNj49fkbW87enp0XSrFZHEoyDGSGndQjZmMMErcHc5Hx7nrW1nzc33sPH1NNtJl0hw==", "dev": true, "requires": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.7.1", - "@vuepress/markdown-loader": "1.7.1", - "@vuepress/plugin-last-updated": "1.7.1", - "@vuepress/plugin-register-components": "1.7.1", - "@vuepress/shared-utils": "1.7.1", + "@vuepress/markdown": "1.8.2", + "@vuepress/markdown-loader": "1.8.2", + "@vuepress/plugin-last-updated": "1.8.2", + "@vuepress/plugin-register-components": "1.8.2", + "@vuepress/shared-utils": "1.8.2", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", "cache-loader": "^3.0.0", @@ -1368,12 +14939,12 @@ } }, "@vuepress/markdown": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.7.1.tgz", - "integrity": "sha512-Ava9vJECHG1+RC53ut1dXSze35IH5tc3qesC06Ny37WS93iDSQy09j8y+a0Lugy12j1369+QQeRFWa40tdHczA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.8.2.tgz", + "integrity": "sha512-zznBHVqW+iBkznF/BO/GY9RFu53khyl0Ey0PnGqvwCJpRLNan6y5EXgYumtjw2GSYn5nDTTALYxtyNBdz64PKg==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.7.1", + "@vuepress/shared-utils": "1.8.2", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0", @@ -1383,62 +14954,62 @@ } }, "@vuepress/markdown-loader": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.7.1.tgz", - "integrity": "sha512-GM1F/tRhP9qZydTC89FXJPlLH+BmZijMKom5BYLAMEXsU20A9kABTRoatPjOUbZuKT+gn03JgG97qVd8xa/ETw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.8.2.tgz", + "integrity": "sha512-mWzFXikCUcAN/chpKkqZpRYKdo0312hMv8cBea2hvrJYV6y4ODB066XKvXN8JwOcxuCjxWYJkhWGr+pXq1oTtw==", "dev": true, "requires": { - "@vuepress/markdown": "1.7.1", + "@vuepress/markdown": "1.8.2", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" } }, "@vuepress/plugin-active-header-links": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.7.1.tgz", - "integrity": "sha512-Wgf/oB9oPZLnYoLjQ/xbQc4Qa3RU5tXAo2dB4Xl/7bUL6SqBxO866kX3wPxKdSOIL58tq8iH9XbUe3Sxi8/ISQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.8.2.tgz", + "integrity": "sha512-JmXAQg8D7J8mcKe2Ue3BZ9dOCzJMJXP4Cnkkc/IrqfDg0ET0l96gYWZohCqlvRIWt4f0VPiFAO4FLYrW+hko+g==", "dev": true, "requires": { "lodash.debounce": "^4.0.8" } }, "@vuepress/plugin-last-updated": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.7.1.tgz", - "integrity": "sha512-VW5jhBuO0WRHDsBmFsKC6QtEyBLCgyhuH9nQ65aairCn3tdoJPz0uQ4g3lr/boVbgsPexO677Sn3dRPgYqnMug==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.8.2.tgz", + "integrity": "sha512-pYIRZi52huO9b6HY3JQNPKNERCLzMHejjBRt9ekdnJ1xhLs4MmRvt37BoXjI/qzvXkYtr7nmGgnKThNBVRTZuA==", "dev": true, "requires": { "cross-spawn": "^6.0.5" } }, "@vuepress/plugin-nprogress": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.7.1.tgz", - "integrity": "sha512-KtqfI3RitbsEbm22EhbooTvhjfMf6zttKlbND7LcyJwP3MEPVYyzQJuET03hk9z4SgCfNV2r/W3sYyejzzTMog==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.8.2.tgz", + "integrity": "sha512-3TOBee2NM3WLr1tdjDTGfrAMggjN+OlEPyKyv8FqThsVkDYhw48O3HwqlThp9KX7UbL3ExxIFBwWRFLC+kYrdw==", "dev": true, "requires": { "nprogress": "^0.2.0" } }, "@vuepress/plugin-register-components": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz", - "integrity": "sha512-MlFdH6l3rTCJlGMvyssXVG998cq5LSMzxCuQLYcRdtHQT4HbikIcV4HSPGarWInD1mP12+qX/PvKUawGwp1eVg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.8.2.tgz", + "integrity": "sha512-6SUq3nHFMEh9qKFnjA8QnrNxj0kLs7+Gspq1OBU8vtu0NQmSvLFZVaMV7pzT/9zN2nO5Pld5qhsUJv1g71MrEA==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.7.1" + "@vuepress/shared-utils": "1.8.2" } }, "@vuepress/plugin-search": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.7.1.tgz", - "integrity": "sha512-OmiGM5eYg9c+uC50b6/cSxAhqxfD7AIui6JEztFGeECrlP33RLHmteXK9YBBZjp5wTNmoYs+NXI/cWggYUPW8Q==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.8.2.tgz", + "integrity": "sha512-JrSJr9o0Kar14lVtZ4wfw39pplxvvMh8vDBD9oW09a+6Zi/4bySPGdcdaqdqGW+OHSiZNvG+6uyfKSBBBqF6PA==", "dev": true }, "@vuepress/shared-utils": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.7.1.tgz", - "integrity": "sha512-ydB2ZKsFZE6hFRb9FWqzZksxAPIMJjtBawk50RP6F+YX5HbID/HlyYYZM9aDSbk6RTkjgB5UzJjggA2xM8POlw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.8.2.tgz", + "integrity": "sha512-6kGubc7iBDWruEBUU7yR+sQ++SOhMuvKWvWeTZJKRZedthycdzYz7QVpua0FaZSAJm5/dIt8ymU4WQvxTtZgTQ==", "dev": true, "requires": { "chalk": "^2.3.2", @@ -1450,25 +15021,17 @@ "semver": "^6.0.0", "toml": "^3.0.0", "upath": "^1.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "@vuepress/theme-default": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.7.1.tgz", - "integrity": "sha512-a9HeTrlcWQj3ONHiABmlN2z9TyIxKfQtLsA8AL+WgjN3PikhFuZFIJGzfr+NLt67Y9oiI+S9ZfiaVyvWM+7bWQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.8.2.tgz", + "integrity": "sha512-rE7M1rs3n2xp4a/GrweO8EGwqFn3EA5gnFWdVmVIHyr7C1nix+EqjpPQF1SVWNnIrDdQuCw38PqS+oND1K2vYw==", "dev": true, "requires": { - "@vuepress/plugin-active-header-links": "1.7.1", - "@vuepress/plugin-nprogress": "1.7.1", - "@vuepress/plugin-search": "1.7.1", + "@vuepress/plugin-active-header-links": "1.8.2", + "@vuepress/plugin-nprogress": "1.8.2", + "@vuepress/plugin-search": "1.8.2", "docsearch.js": "^2.5.2", "lodash": "^4.17.15", "stylus": "^0.54.8", @@ -1688,7 +15251,7 @@ }, "agentkeepalive": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=", "dev": true }, @@ -1708,13 +15271,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "algoliasearch": { "version": "3.35.1", @@ -1748,23 +15313,17 @@ "ms": "2.0.0" } }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -1790,12 +15349,12 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "ansi-html": { @@ -1922,9 +15481,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -2032,21 +15591,20 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" } }, @@ -2059,6 +15617,36 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2088,42 +15676,13 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "batch": { @@ -2170,9 +15729,9 @@ "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body-parser": { @@ -2213,6 +15772,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true } } }, @@ -2379,17 +15944,6 @@ "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "brorand": { @@ -2400,7 +15954,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2436,21 +15990,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { @@ -2499,15 +16045,16 @@ } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" } }, "buffer": { @@ -2519,6 +16066,14 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "buffer-from": { @@ -2617,6 +16172,70 @@ "schema-utils": "^1.0.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -2627,6 +16246,12 @@ "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -2668,6 +16293,16 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2694,7 +16329,7 @@ }, "callsites": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, @@ -2709,9 +16344,9 @@ } }, "camelcase": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", - "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "caniuse-api": { @@ -2727,9 +16362,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001148", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz", - "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==", + "version": "1.0.30001205", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz", + "integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==", "dev": true }, "caseless": { @@ -2785,9 +16420,9 @@ } }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz", + "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==", "dev": true }, "cipher-base": { @@ -2820,6 +16455,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -2847,9 +16539,9 @@ "dev": true }, "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", "dev": true, "optional": true, "requires": { @@ -2942,9 +16634,9 @@ "dev": true }, "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -2952,9 +16644,9 @@ } }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "combined-stream": { @@ -3055,23 +16747,6 @@ "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "connect-history-api-fallback": { @@ -3081,9 +16756,9 @@ "dev": true }, "consola": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", - "integrity": "sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", "dev": true }, "console-browserify": { @@ -3183,6 +16858,26 @@ "webpack-log": "^2.0.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -3195,6 +16890,14 @@ "ignore": "^3.3.5", "pify": "^3.0.0", "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "ignore": { @@ -3203,12 +16906,50 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "pify": { + "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -3220,6 +16961,12 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -3229,18 +16976,18 @@ } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.0.tgz", + "integrity": "sha512-MQx/7TLgmmDVamSyfE+O+5BHvG1aUGj/gHhLn1wVtm2B5u1eVIPvh7vkfjwWKNCjrTJB8+He99IntSQ1qP+vYQ==", "dev": true }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.0.tgz", + "integrity": "sha512-9yVewub2MXNYyGvuLnMHcN1k9RkvB7/ofktpeKTIaASyB88YYqGzUnu0ywMMhJrDHOMiTjSHWGzR+i7Wb9Z1kQ==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.16.3", "semver": "7.0.0" }, "dependencies": { @@ -3281,16 +17028,16 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -3303,7 +17050,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -3326,6 +17073,14 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "crypto-browserify": { @@ -3375,7 +17130,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -3568,28 +17323,28 @@ "dev": true }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "source-map": { @@ -3622,9 +17377,9 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3710,37 +17465,6 @@ "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } } }, "del": { @@ -3817,14 +17541,14 @@ "dev": true }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", "dev": true }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -3834,9 +17558,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3910,15 +17634,15 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", - "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true } } @@ -4004,9 +17728,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.580", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.580.tgz", - "integrity": "sha512-5flHTbRpptO6h3lQUG4zdSAxryAS3PrZOkLpLS0DL5/y2LBf+l9HJ8X6UBorNs1QRBrMR7u/QvkdK+GlekW1kQ==", + "version": "1.3.705", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.705.tgz", + "integrity": "sha512-agtrL5vLSOIK89sE/YSzAgqCw76eZ60gf3J7Tid5RfLbSp5H4nWL28/dIV+H+ZhNNi1JNiaF62jffwYsAyXc0g==", "dev": true }, "elliptic": { @@ -4060,9 +17784,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4105,9 +17829,9 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -4123,23 +17847,27 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { @@ -4241,15 +17969,15 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "requires": { "original": "^1.0.0" @@ -4313,15 +18041,63 @@ "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4388,6 +18164,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true } } }, @@ -4398,24 +18180,12 @@ "dev": true }, "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-extendable": "^0.1.0" } }, "extglob": { @@ -4442,44 +18212,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -4516,9 +18248,9 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -4579,17 +18311,6 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "finalhandler": { @@ -4625,23 +18346,24 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flush-write-stream": { @@ -4655,9 +18377,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", "dev": true }, "for-in": { @@ -4767,9 +18489,9 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -4778,6 +18500,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4971,6 +18704,12 @@ "ansi-regex": "^2.0.0" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4978,9 +18717,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-value": { @@ -5102,7 +18841,7 @@ "dependencies": { "mkdirp": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", "dev": true } @@ -5139,9 +18878,9 @@ "dev": true }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "html-minifier": { @@ -5225,6 +18964,12 @@ } } }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -5290,9 +19035,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "iferr": { @@ -5355,6 +19100,51 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -5432,30 +19222,22 @@ "dev": true }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { "version": "0.2.1", @@ -5463,6 +19245,12 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -5472,6 +19260,15 @@ "binary-extensions": "^1.0.0" } }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5479,9 +19276,9 @@ "dev": true }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-ci": { @@ -5515,24 +19312,22 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-date-object": { @@ -5542,22 +19337,14 @@ "dev": true }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-directory": { @@ -5612,9 +19399,9 @@ } }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-npm": { @@ -5643,6 +19430,12 @@ } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -5689,11 +19482,12 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dev": true, "requires": { + "call-bind": "^1.0.2", "has-symbols": "^1.0.1" } }, @@ -5709,6 +19503,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -5752,9 +19552,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "isexe": { @@ -5776,9 +19576,9 @@ "dev": true }, "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", "dev": true }, "js-tokens": { @@ -5788,9 +19588,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5846,9 +19646,9 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5959,19 +19759,18 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash._reinterpolate": { @@ -6030,9 +19829,9 @@ "dev": true }, "loglevel": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", - "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, "lower-case": { @@ -6057,13 +19856,12 @@ } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, "map-cache": { @@ -6098,7 +19896,8 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", - "dev": true + "dev": true, + "requires": {} }, "markdown-it-chain": { "version": "1.3.0", @@ -6109,6 +19908,12 @@ "webpack-chain": "^4.9.0" }, "dependencies": { + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", + "dev": true + }, "webpack-chain": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", @@ -6164,7 +19969,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -6232,6 +20037,27 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "miller-rabin": { @@ -6245,32 +20071,32 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.47.0" } }, "mimic-response": { @@ -6448,6 +20274,27 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "negotiator": { @@ -6514,6 +20361,12 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -6523,9 +20376,9 @@ } }, "node-releases": { - "version": "1.1.63", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.63.tgz", - "integrity": "sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==", + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "nopt": { @@ -6571,7 +20424,7 @@ }, "nprogress": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=", "dev": true }, @@ -6622,6 +20475,43 @@ "is-descriptor": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6634,19 +20524,19 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-is": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", - "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "object-keys": { @@ -6665,46 +20555,26 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.2" } }, "object.pick": { @@ -6717,36 +20587,15 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "obuf": { @@ -6841,12 +20690,12 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -6880,14 +20729,6 @@ "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "pako": { @@ -6964,14 +20805,14 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -7064,12 +20905,12 @@ } }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } }, "portfinder": { @@ -7084,9 +20925,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -7714,20 +21555,19 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "pretty-time": { @@ -7806,9 +21646,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -7868,9 +21708,9 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "query-string": { @@ -7972,6 +21812,14 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "readdirp": { @@ -7995,9 +21843,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { @@ -8032,39 +21880,39 @@ "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" }, "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "is-plain-object": "^2.0.4" } } } }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", @@ -8104,9 +21952,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -8133,46 +21981,16 @@ "dev": true }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "dev": true, "requires": { - "css-select": "^1.1.0", + "css-select": "^2.0.2", "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" } }, "repeat-element": { @@ -8213,14 +22031,6 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } } }, "require-directory": { @@ -8242,11 +22052,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -8340,7 +22151,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -8378,17 +22189,6 @@ "requires": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "select": { @@ -8414,9 +22214,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "semver-diff": { @@ -8426,14 +22226,6 @@ "dev": true, "requires": { "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "send": { @@ -8581,17 +22373,6 @@ "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "setimmediate": { @@ -8608,7 +22389,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -8700,15 +22481,63 @@ "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -8736,35 +22565,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } } } }, @@ -8789,47 +22589,38 @@ } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", + "faye-websocket": "^0.11.3", "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "websocket-driver": "^0.7.4" } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "dev": true, "requires": { - "debug": "^3.2.5", + "debug": "^3.2.6", "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } } } }, @@ -8886,9 +22677,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "spdy": { @@ -8938,6 +22729,27 @@ "dev": true, "requires": { "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "sprintf-js": { @@ -8964,9 +22776,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -8979,10 +22791,21 @@ "dev": true }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", + "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, "static-extend": { "version": "0.1.2", @@ -9002,6 +22825,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -9012,12 +22892,12 @@ "dev": true }, "std-env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", - "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", + "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", "dev": true, "requires": { - "ci-info": "^1.6.0" + "ci-info": "^3.0.0" } }, "stream-browserify": { @@ -9065,6 +22945,15 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -9094,74 +22983,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "strip-ansi": { @@ -9181,7 +23019,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -9252,12 +23090,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -9367,6 +23199,70 @@ "worker-farm": "^1.7.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -9378,6 +23274,12 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9394,7 +23296,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -9415,9 +23317,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -9490,6 +23392,27 @@ "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "to-regex-range": { @@ -9558,9 +23481,9 @@ "dev": true }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "type-is": { @@ -9618,6 +23541,18 @@ } } }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -9752,6 +23687,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -9840,9 +23781,9 @@ "dev": true }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -9897,9 +23838,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -9954,27 +23895,6 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "utila": { @@ -10037,9 +23957,9 @@ "dev": true }, "vue-loader": { - "version": "15.9.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz", - "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==", + "version": "15.9.6", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", + "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.1.0", @@ -10050,9 +23970,9 @@ } }, "vue-router": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.6.tgz", - "integrity": "sha512-kaXnB3pfFxhAJl/Mp+XG1HJMyFqrL/xPqV7oXlpXn4AwMmm6VNgf0nllW8ksflmZANfI4kdo0bVn/FYSsAolPQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==", "dev": true }, "vue-server-renderer": { @@ -10114,9 +24034,9 @@ } }, "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", "dev": true, "requires": { "hash-sum": "^1.0.2", @@ -10140,13 +24060,13 @@ "dev": true }, "vuepress": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.7.1.tgz", - "integrity": "sha512-AdA3do1L4DNzeF8sMTE+cSUJ5hR/6f3YujU8DVowi/vFOg/SX2lJF8urvDkZUSXzaAT6aSgkI9L+B6D+i7SJjA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.8.2.tgz", + "integrity": "sha512-BU1lUDwsA3ghf7a9ga4dsf0iTc++Z/l7BR1kUagHWVBHw7HNRgRDfAZBDDQXhllMILVToIxaTifpne9mSi94OA==", "dev": true, "requires": { - "@vuepress/core": "1.7.1", - "@vuepress/theme-default": "1.7.1", + "@vuepress/core": "1.8.2", + "@vuepress/theme-default": "1.8.2", "cac": "^6.5.6", "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", @@ -10211,11 +24131,12 @@ } }, "vuepress-plugin-container": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.4.tgz", - "integrity": "sha512-l+EkeL+rC6DJch1wAZUFIkNDaz2TNOg4NQTHa3yMAsYkC+QaSRubGdN6YwOSmfjxVmM9s9D3gwBWw0O7OBhqRg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", "dev": true, "requires": { + "@vuepress/shared-utils": "^1.2.0", "markdown-it-container": "^2.0.0" } }, @@ -10229,15 +24150,15 @@ } }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "watchpack-chokidar2": "^2.0.1" }, "dependencies": { "anymatch": { @@ -10252,9 +24173,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "optional": true }, @@ -10269,15 +24190,15 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -10296,16 +24217,16 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "optional": true, "requires": { @@ -10352,9 +24273,9 @@ } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "dev": true, "optional": true, "requires": { @@ -10371,9 +24292,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -10384,7 +24305,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -10422,20 +24343,12 @@ "requires": { "deepmerge": "^1.5.2", "javascript-stringify": "^2.0.1" - }, - "dependencies": { - "javascript-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", - "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", - "dev": true - } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "dev": true, "requires": { "memory-fs": "^0.4.1", @@ -10446,9 +24359,9 @@ } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -10471,11 +24384,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -10503,12 +24416,6 @@ "ajv-keywords": "^3.1.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -10574,11 +24481,13 @@ } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -10603,6 +24512,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -10735,9 +24657,9 @@ "dev": true }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { @@ -10762,6 +24684,42 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, "yargs-parser": { diff --git a/package.json b/package.json index 3291e30d9..fa9f12ab5 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,12 @@ "private": true, "scripts": { "dev": "vuepress dev docs", - "build": "vuepress build docs" + "build": "vuepress build docs", + "format": "prettier --write \"**/*.{md,js,less,vue,yml}\"" }, "devDependencies": { - "vuepress": "^1.7.1", - "vuepress-plugin-container": "^2.1.4" + "prettier": "^2.2.1", + "vuepress": "^1.8.2", + "vuepress-plugin-container": "^2.1.5" } } From b980decc656f0c42570ccd1f3fbc5d4737865cb0 Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Fri, 2 Apr 2021 17:30:32 +0100 Subject: [PATCH 3/4] Add formatting workflow --- .github/workflows/formatting.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/formatting.yml diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml new file mode 100644 index 000000000..1492e48d9 --- /dev/null +++ b/.github/workflows/formatting.yml @@ -0,0 +1,28 @@ +name: Lint + +on: + workflow_dispatch: + push: + pull_request: + +jobs: + prettier: + name: Verify formatting + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v2 + + - name: Set up Node + uses: actions/setup-node@v2 + with: + node-version: '14.x' + + # We do it this way so that we can just use the existing package.json script + # to make future changes to the formatting script easier + - name: Set up Prettier + run: npm i -g prettier + + - name: Check formatting + run: npm run format -- --check From 4add07f1dbf450b21036a50f81f13882a4b4f081 Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Mon, 3 May 2021 21:42:09 +0100 Subject: [PATCH 4/4] Format docs repo --- docs/.vuepress/config.js | 18 +- docs/.vuepress/config/head.js | 15 +- docs/.vuepress/config/locales/en/index.js | 6 +- docs/.vuepress/config/locales/en/nav.js | 24 +- docs/.vuepress/config/locales/en/sidebar.js | 62 +--- docs/.vuepress/config/locales/en/theme.js | 18 +- docs/.vuepress/config/locales/es/index.js | 6 +- docs/.vuepress/config/locales/es/nav.js | 24 +- docs/.vuepress/config/locales/es/sidebar.js | 49 +-- docs/.vuepress/config/locales/es/theme.js | 18 +- docs/.vuepress/config/locales/index.js | 12 +- docs/.vuepress/config/locales/it/index.js | 6 +- docs/.vuepress/config/locales/it/nav.js | 24 +- docs/.vuepress/config/locales/it/sidebar.js | 49 +-- docs/.vuepress/config/locales/it/theme.js | 18 +- docs/.vuepress/config/locales/tr/index.js | 6 +- docs/.vuepress/config/locales/tr/nav.js | 24 +- docs/.vuepress/config/locales/tr/sidebar.js | 41 +-- docs/.vuepress/config/locales/tr/theme.js | 16 +- docs/.vuepress/config/locales/zh/index.js | 6 +- docs/.vuepress/config/locales/zh/nav.js | 24 +- docs/.vuepress/config/locales/zh/sidebar.js | 43 +-- docs/.vuepress/config/locales/zh/theme.js | 16 +- docs/.vuepress/config/plugins.js | 11 +- docs/.vuepress/public/js/i18n.js | 128 ++++---- docs/README.md | 8 +- docs/bugs.md | 6 +- docs/code-of-conduct.md | 18 +- docs/composer.md | 134 ++++---- docs/config.md | 14 +- docs/contributing.md | 61 ++-- docs/es/README.md | 8 +- docs/es/admin.md | 2 +- docs/es/bugs.md | 6 +- docs/es/code-of-conduct.md | 18 +- docs/es/config.md | 14 +- docs/es/console.md | 2 +- docs/es/contributing.md | 67 ++-- docs/es/extend/README.md | 4 +- docs/es/extend/admin.md | 135 ++++---- docs/es/extend/api-throttling.md | 53 +-- docs/es/extend/authorization.md | 178 +++++----- docs/es/extend/backend-events.md | 95 +++--- docs/es/extend/console.md | 9 +- docs/es/extend/data.md | 164 +++++---- docs/es/extend/distribution.md | 2 +- docs/es/extend/formatting.md | 42 +-- docs/es/extend/forms.md | 22 +- docs/es/extend/frontend-pages.md | 26 +- docs/es/extend/frontend.md | 79 ++--- docs/es/extend/i18n.md | 123 ++++--- docs/es/extend/interactive-components.md | 2 +- docs/es/extend/mail.md | 66 ++-- docs/es/extend/middleware.md | 36 +- docs/es/extend/notifications.md | 346 ++++++++++--------- docs/es/extend/permissions.md | 22 +- docs/es/extend/post-types.md | 2 +- docs/es/extend/routes.md | 82 +++-- docs/es/extend/search.md | 2 +- docs/es/extend/service-provider.md | 25 +- docs/es/extend/settings.md | 38 +-- docs/es/extend/start.md | 83 +++-- docs/es/extend/testing.md | 187 ++++++----- docs/es/extend/theme.md | 2 +- docs/es/extend/translate.md | 9 +- docs/es/extend/update-b16.md | 2 +- docs/es/extensions.md | 2 +- docs/es/install.md | 27 +- docs/es/languages.md | 2 +- docs/es/mail.md | 2 +- docs/es/themes.md | 2 +- docs/es/troubleshoot.md | 26 +- docs/es/update.md | 2 +- docs/extend/README.md | 2 +- docs/extend/admin.md | 136 ++++---- docs/extend/api-throttling.md | 51 +-- docs/extend/api.md | 139 ++++---- docs/extend/authorization.md | 181 +++++----- docs/extend/backend-events.md | 102 +++--- docs/extend/console.md | 9 +- docs/extend/distribution.md | 2 +- docs/extend/extending-extensions.md | 51 ++- docs/extend/extensibility.md | 13 +- docs/extend/formatting.md | 40 +-- docs/extend/forms.md | 21 +- docs/extend/frontend-pages.md | 37 ++- docs/extend/frontend.md | 77 ++--- docs/extend/i18n.md | 125 ++++--- docs/extend/mail.md | 62 ++-- docs/extend/middleware.md | 35 +- docs/extend/models.md | 39 +-- docs/extend/notifications.md | 346 ++++++++++--------- docs/extend/post-types.md | 2 +- docs/extend/routes.md | 79 ++--- docs/extend/search.md | 56 ++-- docs/extend/service-provider.md | 25 +- docs/extend/settings.md | 40 ++- docs/extend/start.md | 83 +++-- docs/extend/testing.md | 191 ++++++----- docs/extend/theme.md | 2 +- docs/extend/translate.md | 9 +- docs/extend/update-b12.md | 4 +- docs/extend/update-b14.md | 136 ++++---- docs/extend/update-b15.md | 3 +- docs/extend/update-b8.md | 40 +-- docs/faq.md | 2 +- docs/install.md | 27 +- docs/it/README.md | 8 +- docs/it/bugs.md | 6 +- docs/it/code-of-conduct.md | 18 +- docs/it/config.md | 14 +- docs/it/contributing.md | 65 ++-- docs/it/extend/README.md | 2 +- docs/it/extend/admin.md | 128 +++----- docs/it/extend/api-throttling.md | 51 +-- docs/it/extend/authorization.md | 184 +++++------ docs/it/extend/backend-events.md | 95 +++--- docs/it/extend/console.md | 9 +- docs/it/extend/data.md | 175 +++++----- docs/it/extend/distribution.md | 2 +- docs/it/extend/formatting.md | 40 +-- docs/it/extend/forms.md | 21 +- docs/it/extend/frontend-pages.md | 24 +- docs/it/extend/frontend.md | 80 ++--- docs/it/extend/i18n.md | 137 ++++---- docs/it/extend/mail.md | 62 ++-- docs/it/extend/middleware.md | 49 ++- docs/it/extend/notifications.md | 347 ++++++++++---------- docs/it/extend/permissions.md | 18 +- docs/it/extend/post-types.md | 2 +- docs/it/extend/routes.md | 82 +++-- docs/it/extend/search.md | 2 +- docs/it/extend/service-provider.md | 27 +- docs/it/extend/settings.md | 36 +- docs/it/extend/start.md | 92 +++--- docs/it/extend/testing.md | 2 +- docs/it/extend/theme.md | 2 +- docs/it/extend/translate.md | 11 +- docs/it/extend/update-b15.md | 9 +- docs/it/extend/update-b16.md | 7 +- docs/it/extensions.md | 6 +- docs/it/faq.md | 2 +- docs/it/install.md | 33 +- docs/it/languages.md | 2 +- docs/it/mail.md | 2 +- docs/it/troubleshoot.md | 22 +- docs/it/update.md | 2 +- docs/tr/README.md | 8 +- docs/tr/admin.md | 2 +- docs/tr/bugs.md | 6 +- docs/tr/code-of-conduct.md | 18 +- docs/tr/config.md | 14 +- docs/tr/console.md | 2 +- docs/tr/contributing.md | 64 ++-- docs/tr/extend/README.md | 2 +- docs/tr/extend/admin.md | 2 +- docs/tr/extend/api-throttling.md | 2 +- docs/tr/extend/authorization.md | 2 +- docs/tr/extend/backend-events.md | 2 +- docs/tr/extend/console.md | 2 +- docs/tr/extend/data.md | 2 +- docs/tr/extend/distribution.md | 2 +- docs/tr/extend/formatting.md | 2 +- docs/tr/extend/forms.md | 2 +- docs/tr/extend/frontend-pages.md | 2 +- docs/tr/extend/frontend.md | 2 +- docs/tr/extend/i18n.md | 2 +- docs/tr/extend/interactive-components.md | 2 +- docs/tr/extend/mail.md | 2 +- docs/tr/extend/middleware.md | 2 +- docs/tr/extend/notifications.md | 2 +- docs/tr/extend/permissions.md | 2 +- docs/tr/extend/post-types.md | 2 +- docs/tr/extend/routes.md | 2 +- docs/tr/extend/search.md | 2 +- docs/tr/extend/service-provider.md | 2 +- docs/tr/extend/settings.md | 2 +- docs/tr/extend/slugging.md | 2 +- docs/tr/extend/start.md | 2 +- docs/tr/extend/testing.md | 2 +- docs/tr/extend/theme.md | 2 +- docs/tr/extend/translate.md | 2 +- docs/tr/extend/update-b10.md | 2 +- docs/tr/extend/update-b12.md | 2 +- docs/tr/extend/update-b13.md | 2 +- docs/tr/extend/update-b14.md | 2 +- docs/tr/extend/update-b15.md | 2 +- docs/tr/extend/update-b8.md | 2 +- docs/tr/extensions.md | 2 +- docs/tr/faq.md | 2 +- docs/tr/install.md | 18 +- docs/tr/languages.md | 2 +- docs/tr/mail.md | 2 +- docs/tr/releases.md | 2 +- docs/tr/themes.md | 2 +- docs/tr/troubleshoot.md | 26 +- docs/tr/update.md | 2 +- docs/troubleshoot.md | 26 +- docs/update.md | 2 +- docs/zh/README.md | 8 +- docs/zh/appearance.md | 1 + docs/zh/bugs.md | 6 +- docs/zh/code-of-conduct.md | 14 +- docs/zh/config.md | 14 +- docs/zh/contributing.md | 59 ++-- docs/zh/extend/README.md | 2 +- docs/zh/extend/console.md | 9 +- docs/zh/extend/start.md | 89 +++-- docs/zh/faq.md | 6 +- docs/zh/install.md | 28 +- docs/zh/permissions.md | 1 + docs/zh/tags.md | 1 + docs/zh/themes.md | 2 +- docs/zh/troubleshoot.md | 24 +- 214 files changed, 3626 insertions(+), 3870 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index ba27027e9..44772bd7f 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,6 +1,6 @@ const locales = require('./config/locales'); -module.exports = ctx => ({ +module.exports = (ctx) => ({ base: '/', head: require('./config/head'), @@ -10,21 +10,25 @@ module.exports = ctx => ({ head: [ ['link', { href: 'https://fonts.googleapis.com/css2?family=Mukta:wght@200;400;600&display=swap', rel: 'stylesheet' }], - ['script', {id: "scriptImporter"}, ` + [ + 'script', + { id: 'scriptImporter' }, + ` (function() { var script = document.createElement("script"); script.src = "/js/i18n.js"; setTimeout(() => document.body.append(script)) })(); - `] + `, + ], ], themeConfig: { - logo: "/logo-docs.svg", + logo: '/logo-docs.svg', algolia: ctx.isProd && { - apiKey: '8f760cdb850b1e696b72329eed96b01b', - indexName: 'flarum' + apiKey: '8f760cdb850b1e696b72329eed96b01b', + indexName: 'flarum', }, searchPlaceholder: 'Search Docs', @@ -34,4 +38,4 @@ module.exports = ctx => ({ locales: locales.theme(), }, -}) +}); diff --git a/docs/.vuepress/config/head.js b/docs/.vuepress/config/head.js index 97b8bd5f6..32268d2c6 100644 --- a/docs/.vuepress/config/head.js +++ b/docs/.vuepress/config/head.js @@ -5,15 +5,16 @@ module.exports = [ rel: 'icon', type: 'image/png', size: '32x32', - href: '/favicon-32x32.png' - } - ], [ + href: '/favicon-32x32.png', + }, + ], + [ 'link', { rel: 'icon', type: 'image/png', size: '192x192', - href: '/favicon-192x192.png' - } - ] -] + href: '/favicon-192x192.png', + }, + ], +]; diff --git a/docs/.vuepress/config/locales/en/index.js b/docs/.vuepress/config/locales/en/index.js index 3fa90584d..bcc7159a7 100644 --- a/docs/.vuepress/config/locales/en/index.js +++ b/docs/.vuepress/config/locales/en/index.js @@ -1,4 +1,4 @@ module.exports = { - lang: 'en', - title: 'Flarum Documentation', -} + lang: 'en', + title: 'Flarum Documentation', +}; diff --git a/docs/.vuepress/config/locales/en/nav.js b/docs/.vuepress/config/locales/en/nav.js index 01aed0624..80562fcfb 100644 --- a/docs/.vuepress/config/locales/en/nav.js +++ b/docs/.vuepress/config/locales/en/nav.js @@ -1,13 +1,13 @@ module.exports = [ - { text: 'Guide', link: '/' }, - { text: 'Extend', link: '/extend/' }, - { text: 'API Reference', link: 'https://api.docs.flarum.org/' }, - { - text: 'Flarum', - items: [ - { text: 'Home', link: 'https://flarum.org/' }, - { text: 'Community', link: 'https://discuss.flarum.org/' }, - { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, - ] - } - ] + { text: 'Guide', link: '/' }, + { text: 'Extend', link: '/extend/' }, + { text: 'API Reference', link: 'https://api.docs.flarum.org/' }, + { + text: 'Flarum', + items: [ + { text: 'Home', link: 'https://flarum.org/' }, + { text: 'Community', link: 'https://discuss.flarum.org/' }, + { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, + ], + }, +]; diff --git a/docs/.vuepress/config/locales/en/sidebar.js b/docs/.vuepress/config/locales/en/sidebar.js index 6c2788f9e..2aab7cb0e 100644 --- a/docs/.vuepress/config/locales/en/sidebar.js +++ b/docs/.vuepress/config/locales/en/sidebar.js @@ -3,15 +3,7 @@ module.exports = { { title: 'Main Concepts', collapsable: false, - children: [ - '', - 'start', - 'frontend', - 'routes', - 'models', - 'api', - 'distribution' - ] + children: ['', 'start', 'frontend', 'routes', 'models', 'api', 'distribution'], }, { title: 'Reference Guides', @@ -27,8 +19,8 @@ module.exports = { 'permissions', 'settings', 'testing', - 'theme' - ] + 'theme', + ], }, { title: 'Advanced Guides', @@ -45,21 +37,13 @@ module.exports = { 'notifications', 'post-types', 'search', - 'service-provider' - ] + 'service-provider', + ], }, { title: 'Update Guides', collapsable: false, - children: [ - 'update-b16', - 'update-b15', - 'update-b14', - 'update-b13', - 'update-b12', - 'update-b10', - 'update-b8', - ] + children: ['update-b16', 'update-b15', 'update-b14', 'update-b13', 'update-b12', 'update-b10', 'update-b8'], }, // { // title: 'Themes', @@ -80,44 +64,22 @@ module.exports = { { title: 'Introduction', collapsable: false, - children: [ - '', - 'code-of-conduct', - 'releases', - 'contributing', - 'bugs', - 'faq' - ] + children: ['', 'code-of-conduct', 'releases', 'contributing', 'bugs', 'faq'], }, { title: 'Setting Up', collapsable: false, - children: [ - 'composer', - 'install', - 'update', - 'troubleshoot' - ] + children: ['composer', 'install', 'update', 'troubleshoot'], }, { title: 'Management', collapsable: false, - children: [ - 'admin', - 'config', - 'extensions', - 'languages', - 'themes', - 'mail', - 'console' - ] + children: ['admin', 'config', 'extensions', 'languages', 'themes', 'mail', 'console'], }, { title: 'Advanced', collapsable: false, - children: [ - 'extenders' - ] - } + children: ['extenders'], + }, ], -} +}; diff --git a/docs/.vuepress/config/locales/en/theme.js b/docs/.vuepress/config/locales/en/theme.js index 6c2c516a4..2485e5d52 100644 --- a/docs/.vuepress/config/locales/en/theme.js +++ b/docs/.vuepress/config/locales/en/theme.js @@ -1,12 +1,12 @@ module.exports = { - selectText: 'Languages', - label: 'English', + selectText: 'Languages', + label: 'English', - searchPlaceholder: 'Search Docs', - - editLinkText: 'Edit this page', - lastUpdated: 'Last Updated', + searchPlaceholder: 'Search Docs', - nav: require('./nav'), - sidebar: require('./sidebar'), -} + editLinkText: 'Edit this page', + lastUpdated: 'Last Updated', + + nav: require('./nav'), + sidebar: require('./sidebar'), +}; diff --git a/docs/.vuepress/config/locales/es/index.js b/docs/.vuepress/config/locales/es/index.js index 49e45287e..6ec43d1cb 100644 --- a/docs/.vuepress/config/locales/es/index.js +++ b/docs/.vuepress/config/locales/es/index.js @@ -1,4 +1,4 @@ module.exports = { - lang: 'es', - title: 'Documentación de Flarum', -} + lang: 'es', + title: 'Documentación de Flarum', +}; diff --git a/docs/.vuepress/config/locales/es/nav.js b/docs/.vuepress/config/locales/es/nav.js index 8f6511672..dab37abde 100644 --- a/docs/.vuepress/config/locales/es/nav.js +++ b/docs/.vuepress/config/locales/es/nav.js @@ -1,13 +1,13 @@ module.exports = [ - { text: 'Guía', link: '/es/' }, - { text: 'Extender', link: '/es/extend/' }, - { text: 'Referencia de la API', link: 'https://api.docs.flarum.org/' }, - { - text: 'Flarum', - items: [ - { text: 'Inicio', link: 'https://flarum.org/' }, - { text: 'Comunidad', link: 'https://discuss.flarum.org/' }, - { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, - ] - } - ] + { text: 'Guía', link: '/es/' }, + { text: 'Extender', link: '/es/extend/' }, + { text: 'Referencia de la API', link: 'https://api.docs.flarum.org/' }, + { + text: 'Flarum', + items: [ + { text: 'Inicio', link: 'https://flarum.org/' }, + { text: 'Comunidad', link: 'https://discuss.flarum.org/' }, + { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, + ], + }, +]; diff --git a/docs/.vuepress/config/locales/es/sidebar.js b/docs/.vuepress/config/locales/es/sidebar.js index 6ff19d2ba..da644e037 100644 --- a/docs/.vuepress/config/locales/es/sidebar.js +++ b/docs/.vuepress/config/locales/es/sidebar.js @@ -3,26 +3,12 @@ module.exports = { { title: 'Conceptos Principales', collapsable: false, - children: [ - '', - 'start', - 'frontend', - 'routes', - 'data', - 'distribution', - 'update-b16', - ] + children: ['', 'start', 'frontend', 'routes', 'data', 'distribution', 'update-b16'], }, { title: 'Guías de Referencia', collapsable: false, - children: [ - 'admin', - 'frontend-pages', - 'interactive-components', - 'forms', - 'backend-events', - ] + children: ['admin', 'frontend-pages', 'interactive-components', 'forms', 'backend-events'], }, { title: 'Guías Avanzadas', @@ -43,7 +29,7 @@ module.exports = { 'service-provider', 'settings', 'testing', - ] + ], }, // { // title: 'Themes', @@ -64,36 +50,17 @@ module.exports = { { title: 'Introducción', collapsable: false, - children: [ - '', - 'code-of-conduct', - 'releases', - 'contributing', - 'bugs', - 'faq' - ] + children: ['', 'code-of-conduct', 'releases', 'contributing', 'bugs', 'faq'], }, { title: 'Configuración', collapsable: false, - children: [ - 'install', - 'update', - 'troubleshoot' - ] + children: ['install', 'update', 'troubleshoot'], }, { title: 'Gestión', collapsable: false, - children: [ - 'admin', - 'config', - 'extensions', - 'languages', - 'themes', - 'mail', - 'console' - ] - } + children: ['admin', 'config', 'extensions', 'languages', 'themes', 'mail', 'console'], + }, ], -} +}; diff --git a/docs/.vuepress/config/locales/es/theme.js b/docs/.vuepress/config/locales/es/theme.js index 0a5dac72e..3ac115bcd 100644 --- a/docs/.vuepress/config/locales/es/theme.js +++ b/docs/.vuepress/config/locales/es/theme.js @@ -1,12 +1,12 @@ module.exports = { - selectText: 'Idiomas', - label: 'Español', + selectText: 'Idiomas', + label: 'Español', - searchPlaceholder: 'Buscar Documentos', - - editLinkText: 'Editar esta página', - lastUpdated: 'Última actualización', + searchPlaceholder: 'Buscar Documentos', - nav: require('./nav'), - sidebar: require('./sidebar'), -} + editLinkText: 'Editar esta página', + lastUpdated: 'Última actualización', + + nav: require('./nav'), + sidebar: require('./sidebar'), +}; diff --git a/docs/.vuepress/config/locales/index.js b/docs/.vuepress/config/locales/index.js index f4922f903..cc3ed717c 100644 --- a/docs/.vuepress/config/locales/index.js +++ b/docs/.vuepress/config/locales/index.js @@ -3,14 +3,14 @@ const paths = { en: '/' }; module.exports = { get(file = '') { - return langs.reduce((locales, name) => { - locales[paths[name] || `/${name}/`] = require(`./${name}${file}`); + return langs.reduce((locales, name) => { + locales[paths[name] || `/${name}/`] = require(`./${name}${file}`); - return locales; - }, {}); + return locales; + }, {}); }, theme() { return this.get('/theme'); - } -} + }, +}; diff --git a/docs/.vuepress/config/locales/it/index.js b/docs/.vuepress/config/locales/it/index.js index 17e3e7bf9..ef1e60949 100644 --- a/docs/.vuepress/config/locales/it/index.js +++ b/docs/.vuepress/config/locales/it/index.js @@ -1,4 +1,4 @@ module.exports = { - lang: 'it', - title: 'Documentazione di Flarum', -} + lang: 'it', + title: 'Documentazione di Flarum', +}; diff --git a/docs/.vuepress/config/locales/it/nav.js b/docs/.vuepress/config/locales/it/nav.js index e5f943e71..bb957e5a7 100644 --- a/docs/.vuepress/config/locales/it/nav.js +++ b/docs/.vuepress/config/locales/it/nav.js @@ -1,13 +1,13 @@ module.exports = [ - { text: 'Guida', link: '/it/' }, - { text: 'Estendi', link: '/it/extend/' }, - { text: 'Referenze API', link: 'https://api.docs.flarum.org/' }, - { - text: 'Flarum', - items: [ - { text: 'Home', link: 'https://flarum.org/' }, - { text: 'Community', link: 'https://discuss.flarum.org/' }, - { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, - ] - } - ] + { text: 'Guida', link: '/it/' }, + { text: 'Estendi', link: '/it/extend/' }, + { text: 'Referenze API', link: 'https://api.docs.flarum.org/' }, + { + text: 'Flarum', + items: [ + { text: 'Home', link: 'https://flarum.org/' }, + { text: 'Community', link: 'https://discuss.flarum.org/' }, + { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, + ], + }, +]; diff --git a/docs/.vuepress/config/locales/it/sidebar.js b/docs/.vuepress/config/locales/it/sidebar.js index 21305bb01..ef0728ee2 100644 --- a/docs/.vuepress/config/locales/it/sidebar.js +++ b/docs/.vuepress/config/locales/it/sidebar.js @@ -3,26 +3,12 @@ module.exports = { { title: 'Concetti principali', collapsable: false, - children: [ - '', - 'start', - 'frontend', - 'routes', - 'data', - 'distribution', - 'update-b15', - ] + children: ['', 'start', 'frontend', 'routes', 'data', 'distribution', 'update-b15'], }, { title: 'Guide di riferimento', collapsable: false, - children: [ - 'admin', - 'frontend-pages', - 'interactive-components', - 'forms', - 'backend-events', - ] + children: ['admin', 'frontend-pages', 'interactive-components', 'forms', 'backend-events'], }, { title: 'Guide Avanzate', @@ -43,7 +29,7 @@ module.exports = { 'service-provider', 'settings', 'testing', - ] + ], }, // { // title: 'Themes', @@ -64,36 +50,17 @@ module.exports = { { title: 'Introduzione', collapsable: false, - children: [ - '', - 'code-of-conduct', - 'releases', - 'contributing', - 'bugs', - 'faq' - ] + children: ['', 'code-of-conduct', 'releases', 'contributing', 'bugs', 'faq'], }, { title: 'Impostazioni', collapsable: false, - children: [ - 'install', - 'update', - 'troubleshoot' - ] + children: ['install', 'update', 'troubleshoot'], }, { title: 'Gestione', collapsable: false, - children: [ - 'admin', - 'config', - 'extensions', - 'languages', - 'themes', - 'mail', - 'console' - ] - } + children: ['admin', 'config', 'extensions', 'languages', 'themes', 'mail', 'console'], + }, ], -} +}; diff --git a/docs/.vuepress/config/locales/it/theme.js b/docs/.vuepress/config/locales/it/theme.js index b9f1bbebd..3815f4ee5 100644 --- a/docs/.vuepress/config/locales/it/theme.js +++ b/docs/.vuepress/config/locales/it/theme.js @@ -1,12 +1,12 @@ module.exports = { - selectText: 'Lingue', - label: 'Italiano', + selectText: 'Lingue', + label: 'Italiano', - searchPlaceholder: 'Search Docs', - - editLinkText: 'Modifica questa pagina', - lastUpdated: 'Ultimo aggiornamento', + searchPlaceholder: 'Search Docs', - nav: require('./nav'), - sidebar: require('./sidebar'), -} + editLinkText: 'Modifica questa pagina', + lastUpdated: 'Ultimo aggiornamento', + + nav: require('./nav'), + sidebar: require('./sidebar'), +}; diff --git a/docs/.vuepress/config/locales/tr/index.js b/docs/.vuepress/config/locales/tr/index.js index ffd51dbe1..e4ce1149f 100644 --- a/docs/.vuepress/config/locales/tr/index.js +++ b/docs/.vuepress/config/locales/tr/index.js @@ -1,4 +1,4 @@ module.exports = { - lang: 'tr', - title: 'Flarum Belgeleri', -} + lang: 'tr', + title: 'Flarum Belgeleri', +}; diff --git a/docs/.vuepress/config/locales/tr/nav.js b/docs/.vuepress/config/locales/tr/nav.js index 603d51a2e..052dfcc4c 100644 --- a/docs/.vuepress/config/locales/tr/nav.js +++ b/docs/.vuepress/config/locales/tr/nav.js @@ -1,13 +1,13 @@ module.exports = [ - { text: 'Kılavuz', link: '/' }, - { text: 'Genişletme', link: '/extend/' }, - { text: 'API Referansı', link: 'https://api.docs.flarum.org/' }, - { - text: 'Flarum', - items: [ - { text: 'Anasayfa', link: 'https://flarum.org/' }, - { text: 'Topluluk', link: 'https://discuss.flarum.org/' }, - { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, - ] - } - ] + { text: 'Kılavuz', link: '/' }, + { text: 'Genişletme', link: '/extend/' }, + { text: 'API Referansı', link: 'https://api.docs.flarum.org/' }, + { + text: 'Flarum', + items: [ + { text: 'Anasayfa', link: 'https://flarum.org/' }, + { text: 'Topluluk', link: 'https://discuss.flarum.org/' }, + { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, + ], + }, +]; diff --git a/docs/.vuepress/config/locales/tr/sidebar.js b/docs/.vuepress/config/locales/tr/sidebar.js index 5dc4e1545..23ef4cba3 100644 --- a/docs/.vuepress/config/locales/tr/sidebar.js +++ b/docs/.vuepress/config/locales/tr/sidebar.js @@ -16,18 +16,12 @@ module.exports = { 'update-b13', 'update-b14', 'update-b15', - ] + ], }, { title: 'Referans Kılavuzları', collapsable: false, - children: [ - 'admin', - 'frontend-pages', - 'interactive-components', - 'forms', - 'backend-events', - ] + children: ['admin', 'frontend-pages', 'interactive-components', 'forms', 'backend-events'], }, { title: 'Gelişmiş Kılavuzlar', @@ -48,7 +42,7 @@ module.exports = { 'service-provider', 'settings', 'testing', - ] + ], }, // { // title: 'Themes', @@ -69,36 +63,17 @@ module.exports = { { title: 'Giriş', collapsable: false, - children: [ - '', - 'code-of-conduct', - 'releases', - 'contributing', - 'bugs', - 'faq' - ] + children: ['', 'code-of-conduct', 'releases', 'contributing', 'bugs', 'faq'], }, { title: 'Ayarlama', collapsable: false, - children: [ - 'install', - 'update', - 'troubleshoot' - ] + children: ['install', 'update', 'troubleshoot'], }, { title: 'Yönetim', collapsable: false, - children: [ - 'admin', - 'config', - 'extensions', - 'languages', - 'themes', - 'mail', - 'console' - ] - } + children: ['admin', 'config', 'extensions', 'languages', 'themes', 'mail', 'console'], + }, ], -} \ No newline at end of file +}; diff --git a/docs/.vuepress/config/locales/tr/theme.js b/docs/.vuepress/config/locales/tr/theme.js index 862ac4d6f..23731ce10 100644 --- a/docs/.vuepress/config/locales/tr/theme.js +++ b/docs/.vuepress/config/locales/tr/theme.js @@ -1,10 +1,10 @@ module.exports = { - selectText: 'Diller', - label: 'Türkçe', - - editLinkText: 'Bu sayfayı düzenle', - lastUpdated: 'Son güncelleme', + selectText: 'Diller', + label: 'Türkçe', - nav: require('./nav'), - sidebar: require('./sidebar'), -} + editLinkText: 'Bu sayfayı düzenle', + lastUpdated: 'Son güncelleme', + + nav: require('./nav'), + sidebar: require('./sidebar'), +}; diff --git a/docs/.vuepress/config/locales/zh/index.js b/docs/.vuepress/config/locales/zh/index.js index 8ef318660..2eca0c2ae 100644 --- a/docs/.vuepress/config/locales/zh/index.js +++ b/docs/.vuepress/config/locales/zh/index.js @@ -1,4 +1,4 @@ module.exports = { - lang: 'zh-Hans', - title: 'Flarum 文档', -} + lang: 'zh-Hans', + title: 'Flarum 文档', +}; diff --git a/docs/.vuepress/config/locales/zh/nav.js b/docs/.vuepress/config/locales/zh/nav.js index bb7e36024..0932e0d57 100644 --- a/docs/.vuepress/config/locales/zh/nav.js +++ b/docs/.vuepress/config/locales/zh/nav.js @@ -1,13 +1,13 @@ module.exports = [ - { text: '指南', link: '/zh/' }, - { text: '进阶', link: '/zh/extend/' }, - { text: 'API 参考', link: 'https://api.docs.flarum.org/' }, - { - text: 'Flarum', - items: [ - { text: '首页', link: 'https://flarum.org/' }, - { text: '社区', link: 'https://discuss.flarum.org/' }, - { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, - ] - } - ] + { text: '指南', link: '/zh/' }, + { text: '进阶', link: '/zh/extend/' }, + { text: 'API 参考', link: 'https://api.docs.flarum.org/' }, + { + text: 'Flarum', + items: [ + { text: '首页', link: 'https://flarum.org/' }, + { text: '社区', link: 'https://discuss.flarum.org/' }, + { text: 'GitHub', link: 'https://github.com/flarum/flarum/' }, + ], + }, +]; diff --git a/docs/.vuepress/config/locales/zh/sidebar.js b/docs/.vuepress/config/locales/zh/sidebar.js index c2a2b6353..4a314220f 100644 --- a/docs/.vuepress/config/locales/zh/sidebar.js +++ b/docs/.vuepress/config/locales/zh/sidebar.js @@ -3,20 +3,12 @@ module.exports = { { title: '核心概念', collapsable: false, - children: [ - '', - ['start','起步'], - ] + children: ['', ['start', '起步']], }, { title: '高级指引', collapsable: false, - children: [ - 'console', - 'post-types', - 'search', - 'testing', - ] + children: ['console', 'post-types', 'search', 'testing'], }, // { // title: 'Themes', @@ -37,36 +29,17 @@ module.exports = { { title: '介绍', collapsable: false, - children: [ - '', - 'code-of-conduct', - 'releases', - 'contributing', - 'bugs', - 'faq' - ] + children: ['', 'code-of-conduct', 'releases', 'contributing', 'bugs', 'faq'], }, { title: '部署', collapsable: false, - children: [ - 'install', - 'update', - 'troubleshoot' - ] + children: ['install', 'update', 'troubleshoot'], }, { title: '管理', collapsable: false, - children: [ - ['admin','后台管理'], - 'config', - 'extensions', - 'languages', - 'themes', - ['mail','配置邮箱'], - 'console' - ] - } - ] -} + children: [['admin', '后台管理'], 'config', 'extensions', 'languages', 'themes', ['mail', '配置邮箱'], 'console'], + }, + ], +}; diff --git a/docs/.vuepress/config/locales/zh/theme.js b/docs/.vuepress/config/locales/zh/theme.js index 0addcedbf..ada123603 100644 --- a/docs/.vuepress/config/locales/zh/theme.js +++ b/docs/.vuepress/config/locales/zh/theme.js @@ -1,10 +1,10 @@ module.exports = { - selectText: '选择语言', - label: '简体中文', - - editLinkText: '帮助我们改善此页', - lastUpdated: '上次更新', + selectText: '选择语言', + label: '简体中文', - nav: require('./nav'), - sidebar: require('./sidebar'), -} + editLinkText: '帮助我们改善此页', + lastUpdated: '上次更新', + + nav: require('./nav'), + sidebar: require('./sidebar'), +}; diff --git a/docs/.vuepress/config/plugins.js b/docs/.vuepress/config/plugins.js index 27a379935..eae9dc922 100644 --- a/docs/.vuepress/config/plugins.js +++ b/docs/.vuepress/config/plugins.js @@ -1,7 +1,10 @@ module.exports = [ - ['container', { + [ + 'container', + { type: 'vue', before: '
',
-      after: '
' - }] -] + after: '', + }, + ], +]; diff --git a/docs/.vuepress/public/js/i18n.js b/docs/.vuepress/public/js/i18n.js index c212b642f..02b03c1a0 100644 --- a/docs/.vuepress/public/js/i18n.js +++ b/docs/.vuepress/public/js/i18n.js @@ -1,87 +1,91 @@ var locale, dir, file_path, tip, outdated_tip, processing_tip, is_processing; function initTip(locale) { - switch (locale) { - case 'en': - outdated_tip = 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; - processing_tip = 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; - is_processing = false; - break; - case 'zh': - outdated_tip = '此页面的翻译可能更新不及时,最新信息请以英文文档为准。如果翻译有问题,请告诉我们。'; - processing_tip = '当前文档仍在翻译中(进度 6/23),有关最新信息,请查阅英文文档。如果翻译有问题,请告诉我们。'; - is_processing = true; - break; - case 'tr': - outdated_tip = 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; - processing_tip = 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; - is_processing = true; - break; - case 'it': - outdated_tip = 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; - processing_tip = 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; - is_processing = true; - break; - case 'es': - outdated_tip = 'La traducción de esta página podría no estar actualizada, por favor consulte el documento en Inglés para obtener la información más reciente. Si hay algún problema con la traducción, por favor háganoslo saber.'; - processing_tip = 'La traducción de los documentos de extensión aún está en desarrollo, por favor, consulte el documento en Inglés para obtener la información más reciente. Si tiene problemas con la traducción, por favor háganoslo saber.'; - is_processing = true; - break; - default: - break; - } + switch (locale) { + case 'en': + outdated_tip = + 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; + processing_tip = + 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; + is_processing = false; + break; + case 'zh': + outdated_tip = '此页面的翻译可能更新不及时,最新信息请以英文文档为准。如果翻译有问题,请告诉我们。'; + processing_tip = '当前文档仍在翻译中(进度 6/23),有关最新信息,请查阅英文文档。如果翻译有问题,请告诉我们。'; + is_processing = true; + break; + case 'tr': + outdated_tip = + 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; + processing_tip = + 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; + is_processing = true; + break; + case 'it': + outdated_tip = + 'The translation of this page may not be up to date, please refer to the English document for the latest information. If there is a problem with the translation, please let us know.'; + processing_tip = + 'The translation of extend documents is still a work in progress, please refer to the English document for the latest information. If you have problems with the translation, please let us know.'; + is_processing = true; + break; + case 'es': + outdated_tip = + 'La traducción de esta página podría no estar actualizada, por favor consulte el documento en Inglés para obtener la información más reciente. Si hay algún problema con la traducción, por favor háganoslo saber.'; + processing_tip = + 'La traducción de los documentos de extensión aún está en desarrollo, por favor, consulte el documento en Inglés para obtener la información más reciente. Si tiene problemas con la traducción, por favor háganoslo saber.'; + is_processing = true; + break; + default: + break; + } } - var title = document.title; var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; var target = document.querySelector('head > title'); var observer = new MutationObserver(function (mutations) { - mutations.forEach(function () { - if (title != document.title) { - showTip(); - title = document.title; - } - }); + mutations.forEach(function () { + if (title != document.title) { + showTip(); + title = document.title; + } + }); }); observer.observe(target, { - subtree: true, - characterData: true, - childList: true, + subtree: true, + characterData: true, + childList: true, }); - -locale = document.getElementsByTagName("html").item(0).getAttribute("lang").substring(0, 2); +locale = document.getElementsByTagName('html').item(0).getAttribute('lang').substring(0, 2); initTip(locale); function showTip() { + url = window.location.pathname; - url = window.location.pathname; + locale = document.getElementsByTagName('html').item(0).getAttribute('lang').substring(0, 2); + if (locale != 'en') { + dir = url.substring(3, url.lastIndexOf('/')); + file_path = url.substring(url.lastIndexOf('/')); + href = dir + file_path; - locale = document.getElementsByTagName("html").item(0).getAttribute("lang").substring(0, 2); - if (locale != 'en') { - dir = url.substring(3, url.lastIndexOf('/')); - file_path = url.substring(url.lastIndexOf('/')); - href = dir + file_path; + initTip(locale); - initTip(locale); + tip = dir == '/extend' && is_processing ? processing_tip : outdated_tip; + try { + document + .querySelector('div.theme-default-content') + .insertAdjacentHTML('afterbegin', '

' + tip + '

'); - tip = (dir == '/extend' && is_processing) ? processing_tip : outdated_tip; - try { - document.querySelector('div.theme-default-content').insertAdjacentHTML('afterbegin', '

' + tip + '

' - ); + var tip_a = document.querySelectorAll('div.outdated-tip p a'); - var tip_a = document.querySelectorAll('div.outdated-tip p a'); - - tip_a[0].setAttribute("href", href); - tip_a[0].setAttribute("target", "_blank"); - tip_a[1].setAttribute("href", "https://github.com/flarum/docs/issues"); - tip_a[1].setAttribute("target", "_blank"); - } catch (error) { - - } - } + tip_a[0].setAttribute('href', href); + tip_a[0].setAttribute('target', '_blank'); + tip_a[1].setAttribute('href', 'https://github.com/flarum/docs/issues'); + tip_a[1].setAttribute('target', '_blank'); + } catch (error) {} + } } window.onload = showTip; diff --git a/docs/README.md b/docs/README.md index ec0122e21..7e6bb9b45 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,10 +8,10 @@ This user guide will help you to set up your own forum using Flarum and teach yo Flarum is the combined successor of [esoTalk](https://github.com/esotalk/esoTalk) and [FluxBB](https://fluxbb.org). It is designed to be: -* **Fast and simple.** No clutter, no bloat, no complex dependencies. Flarum is built with PHP so it’s quick and easy to deploy. The interface is powered by [Mithril](https://mithril.js.org), a performant JavaScript framework with a tiny footprint. +- **Fast and simple.** No clutter, no bloat, no complex dependencies. Flarum is built with PHP so it’s quick and easy to deploy. The interface is powered by [Mithril](https://mithril.js.org), a performant JavaScript framework with a tiny footprint. -* **Beautiful and responsive.** This is forum software for humans. Flarum is carefully designed to be consistent and intuitive across platforms, out-of-the-box. +- **Beautiful and responsive.** This is forum software for humans. Flarum is carefully designed to be consistent and intuitive across platforms, out-of-the-box. -* **Powerful and extensible.** Customize, extend, and integrate Flarum to suit your community. Flarum’s architecture is amazingly flexible, with a [powerful Extension API](/extend/). +- **Powerful and extensible.** Customize, extend, and integrate Flarum to suit your community. Flarum’s architecture is amazingly flexible, with a [powerful Extension API](/extend/). -* **Free and open.** Flarum is released under the [MIT license](https://github.com/flarum/flarum/blob/master/LICENSE). +- **Free and open.** Flarum is released under the [MIT license](https://github.com/flarum/flarum/blob/master/LICENSE). diff --git a/docs/bugs.md b/docs/bugs.md index 2e71a3e15..25033d663 100644 --- a/docs/bugs.md +++ b/docs/bugs.md @@ -6,7 +6,7 @@ If you discover a security vulnerability within Flarum, please send an email to ::: -Thank you for helping us test Flarum. We're happy to have you on the team! We need people who can *troubleshoot issues patiently* and *communicate them clearly*. As you probably know, good bug reporting takes some time and effort. If you're fine with that, then let's get started! +Thank you for helping us test Flarum. We're happy to have you on the team! We need people who can _troubleshoot issues patiently_ and _communicate them clearly_. As you probably know, good bug reporting takes some time and effort. If you're fine with that, then let's get started! ## Duplicates @@ -15,7 +15,7 @@ Found a bug already? Wonderful! We'd love to hear about it — but first you - Search our [Support forum](https://discuss.flarum.org/t/support) to see if it's already been reported. - We could be working on a fix, so search our [issue tracker](https://github.com/flarum/core/issues) too. -If you've searched *thoroughly* and come up empty-handed, we'll welcome your report. If it's just a simple issue (a misspelled word or graphics glitch, for example) skip to the next paragraph. But if you're seeing errors, or something is clearly broken, we'll need you to gather some information first. Please head over to our [Troubleshooting](troubleshoot.md) guide and follow the instructions there. Collect as much info as you can! +If you've searched _thoroughly_ and come up empty-handed, we'll welcome your report. If it's just a simple issue (a misspelled word or graphics glitch, for example) skip to the next paragraph. But if you're seeing errors, or something is clearly broken, we'll need you to gather some information first. Please head over to our [Troubleshooting](troubleshoot.md) guide and follow the instructions there. Collect as much info as you can! ## Reporting @@ -25,4 +25,4 @@ If you can, check if the issue is reproducible with the latest version of Flarum Remember: the goal of a bug report is to make it easy for us to replicate the bug and fix it. You might want to read [this article](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) for some useful tips on how to write an effective bug report. It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear reprduction steps will not be triaged. If an issue labeled "needs verification" receives no further input from the issue author for more than 5 days, it will be closed. -Once you've posted your report, we'd ask that you please *follow the discussion* and wait patiently. We may need to ask for further details or clarification; but we've always got plenty to do, and it could be a while before we can give your report the time it deserves. +Once you've posted your report, we'd ask that you please _follow the discussion_ and wait patiently. We may need to ask for further details or clarification; but we've always got plenty to do, and it could be a while before we can give your report the time it deserves. diff --git a/docs/code-of-conduct.md b/docs/code-of-conduct.md index bd7f1ffea..31df39026 100644 --- a/docs/code-of-conduct.md +++ b/docs/code-of-conduct.md @@ -2,7 +2,7 @@ ### _Welcome to the Flarum Community!_ -... And thanks for joining us! We're excited about Flarum, and are always happy to meet people who feel the same way. We want *everyone* to get the most out of Flarum and the Flarum community, so we ask that you please read and follow these guidelines. These apply whether you're using our forum, Discord chat, communicating on GitHub, or any other form of communication without the Flarum community. +... And thanks for joining us! We're excited about Flarum, and are always happy to meet people who feel the same way. We want _everyone_ to get the most out of Flarum and the Flarum community, so we ask that you please read and follow these guidelines. These apply whether you're using our forum, Discord chat, communicating on GitHub, or any other form of communication without the Flarum community. ### Above All, Be Cool! @@ -16,29 +16,29 @@ We're all here to talk about Flarum, and to work together toward making it an ev - Spam, phishing posts, and any actions intended to deface this site - Discussion of software piracy and similar topics -*All the above are grounds for moderator action.* If you have an issue with another member, we ask that you please don't confront them yourself. If it's on the forum, please use the *Report* command on the post in question, then leave it up to the staff to deal with the situation. Otherwise, report the violation to [admin@flarum.org](mailto:admin@flarum.org). +_All the above are grounds for moderator action._ If you have an issue with another member, we ask that you please don't confront them yourself. If it's on the forum, please use the _Report_ command on the post in question, then leave it up to the staff to deal with the situation. Otherwise, report the violation to [admin@flarum.org](mailto:admin@flarum.org). -Our moderators may edit or delete any content that is offensive or disruptive to the flow of communication. Serious or repeated offenses may lead to suspension of the offending user's account. So, you know, *be cool*. 😎 +Our moderators may edit or delete any content that is offensive or disruptive to the flow of communication. Serious or repeated offenses may lead to suspension of the offending user's account. So, you know, _be cool_. 😎 ### Make Yourself Heard -Want to start a new discussion? First, be sure to read [our FAQ](faq.md) and follow the links to make sure you're fully informed about the project. Then spend some time browsing the forum, familiarize yourself with [the tag system](https://discuss.flarum.org/tags), and do a few searches for keywords related to your topic: *it could be someone has already started a discussion about it!* +Want to start a new discussion? First, be sure to read [our FAQ](faq.md) and follow the links to make sure you're fully informed about the project. Then spend some time browsing the forum, familiarize yourself with [the tag system](https://discuss.flarum.org/tags), and do a few searches for keywords related to your topic: _it could be someone has already started a discussion about it!_ When you're sure you're ready to start a discussion, please keep the following points in mind: - Give it a good title! You'll get the best results if your title makes it clear what you want to talk about. - Choose the right tag(s). This will increase the likelihood your post will be read and answered promptly. -- *Don’t* post repeatedly about the same topic, as doing so will tend to have the opposite effect. -- If not using a tag set aside for multilingual use, *post in English only.* We can't help if we can't read you! +- _Don’t_ post repeatedly about the same topic, as doing so will tend to have the opposite effect. +- If not using a tag set aside for multilingual use, _post in English only._ We can't help if we can't read you! - Remember, you don't need to sign your posts. We've got your profile to let us know who you are. Please make the effort to help us keep things organized. Time spent tidying up is time that we can't spend getting to know you, discussing your issues, and talking about Flarum. And that, after all, is what we're all here to do! ### Make Your Reply Count - + You're taking the time to participate in a discussion, in the hope that others will read your ideas and take them into consideration. So why not make the effort to make your reply worth reading? -- Don't reply to a title. Take some time to *read* the OP, and at least *scan* the rest of the conversation first. +- Don't reply to a title. Take some time to _read_ the OP, and at least _scan_ the rest of the conversation first. - Ask yourself if your reply adds to the discussion. If it doesn't, give it some more thought before posting. - Avoid making one-word posts just to agree with someone; you can use the "Like" button for that. - Avoid making multiple posts in a row when one would suffice. This is a forum, not a chat room. @@ -46,6 +46,6 @@ You're taking the time to participate in a discussion, in the hope that others w - If you just want to post a bit of nonsense as a test, please do it in the [Test Posting](https://discuss.flarum.org/t/sandbox) tag instead. - Make sure your replies provide constructive feedback and support to allow for an inclusive community. -No one's going to complain about the occasional joke or smart remark. We like to keep the mood light! But to keep things productive, as well, we ask that you try to avoid derailing a discussion altogether. +No one's going to complain about the occasional joke or smart remark. We like to keep the mood light! But to keep things productive, as well, we ask that you try to avoid derailing a discussion altogether. > Thanks to Dominion for his help in putting these guidelines together. diff --git a/docs/composer.md b/docs/composer.md index c8a9ece67..00e39c765 100644 --- a/docs/composer.md +++ b/docs/composer.md @@ -1,11 +1,10 @@ - # Composer Flarum uses a program called composer[Composer](https://getcomposer.org) to manage its dependencies and extensions. You'll need to use composer if you want to: - Install or update Flarum -- Install, update, or remove Flarum extensions +- Install, update, or remove Flarum extensions This guide is provided as a brief explanation of Composer. We highly recommend consulting the [official documentation](https://getcomposer.org/doc/00-intro.md) for more information. @@ -17,7 +16,7 @@ Historically, Composer has caused issues on shared hosting due to huge memory us ## What is Composer? -> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. — [Composer Introduction]([https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) +> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. — [Composer Introduction](<[https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)>) Each Flarum installation consists primarily of Flarum core and a set of [extensions](extensions.md).Each of these has its own dependencies and releases. @@ -52,70 +51,67 @@ As mentioned above, the entire composer configuration for your Flarum site is co ```jsonc { - // This following section is mostly just metadata about the package. - // For forum admins, this doesn't really matter. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // It's a list of packages we want, and the versions for each. - // We'll discuss this shortly. - "require": { - "flarum/core": "^0.1.0", - "flarum/approval": "^0.1.0", - "flarum/bbcode": "^0.1.0", - "flarum/emoji": "^0.1.0", - "flarum/lang-english": "^0.1.0", - "flarum/flags": "^0.1.0", - "flarum/likes": "^0.1.0", - "flarum/lock": "^0.1.0", - "flarum/markdown": "^0.1.0", - "flarum/mentions": "^0.1.0", - "flarum/nicknames": "^0.1.0", - "flarum/pusher": "^0.1.0", - "flarum/statistics": "^0.1.0", - "flarum/sticky": "^0.1.0", - "flarum/subscriptions": "^0.1.0", - "flarum/suspend": "^0.1.0", - "flarum/tags": "^0.1.0" - }, - - // Various composer config. The ones here are sensible defaults. - // See https://getcomposer.org/doc/06-config.md for a list of options. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // Since Flarum is still in beta, this tells composer that it's ok - // to install beta packages. Once a stable version is tagged, this - // line can be removed. - "minimum-stability": "beta", - - // If composer can find a stable (not dev, alpha, or beta) version - // of a package, it should use that. Generally speaking, production - // sites shouldn't run beta software unless you know what you're doing. - "prefer-stable": true + // This following section is mostly just metadata about the package. + // For forum admins, this doesn't really matter. + "name": "flarum/flarum", + "description": "Delightfully simple forum software.", + "type": "project", + "keywords": ["forum", "discussion"], + "homepage": "https://flarum.org/", + "license": "MIT", + "authors": [ + { + "name": "Flarum", + "email": "info@flarum.org", + "homepage": "https://flarum.org/team" + } + ], + "support": { + "issues": "https://github.com/flarum/core/issues", + "source": "https://github.com/flarum/flarum", + "docs": "https://flarum.org/docs/" + }, + // End of metadata + + // This next section is the one we care about the most. + // It's a list of packages we want, and the versions for each. + // We'll discuss this shortly. + "require": { + "flarum/core": "^0.1.0", + "flarum/approval": "^0.1.0", + "flarum/bbcode": "^0.1.0", + "flarum/emoji": "^0.1.0", + "flarum/lang-english": "^0.1.0", + "flarum/flags": "^0.1.0", + "flarum/likes": "^0.1.0", + "flarum/lock": "^0.1.0", + "flarum/markdown": "^0.1.0", + "flarum/mentions": "^0.1.0", + "flarum/nicknames": "^0.1.0", + "flarum/pusher": "^0.1.0", + "flarum/statistics": "^0.1.0", + "flarum/sticky": "^0.1.0", + "flarum/subscriptions": "^0.1.0", + "flarum/suspend": "^0.1.0", + "flarum/tags": "^0.1.0" + }, + + // Various composer config. The ones here are sensible defaults. + // See https://getcomposer.org/doc/06-config.md for a list of options. + "config": { + "preferred-install": "dist", + "sort-packages": true + }, + + // Since Flarum is still in beta, this tells composer that it's ok + // to install beta packages. Once a stable version is tagged, this + // line can be removed. + "minimum-stability": "beta", + + // If composer can find a stable (not dev, alpha, or beta) version + // of a package, it should use that. Generally speaking, production + // sites shouldn't run beta software unless you know what you're doing. + "prefer-stable": true } ``` @@ -134,7 +130,7 @@ As with any other software, Composer must first be [installed]([https://getcompo ### Dedicated Web Server -In this case you can install composer as recommended in the Composer [guide]([https://getcomposer.org/doc/00-intro.md#system-requirements) +In this case you can install composer as recommended in the Composer [guide]([https://getcomposer.org/doc/00-intro.md#system-requirements) ### Managed / Shared hosting @@ -148,7 +144,7 @@ Some articles on the internet will mention that you can use tools like a PHP she ## How do I use Composer? -You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). +You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). Once you have Composer installed, you should be able to run Composer commands in your SSH terminal via `composer COMMAND`. diff --git a/docs/config.md b/docs/config.md index 2b23101e9..f964a850c 100644 --- a/docs/config.md +++ b/docs/config.md @@ -10,11 +10,10 @@ It also provides Flarum with database info and more. Here's a quick overview of what everything means with an example file: ```php - false, // enables or disables debug mode, used to troubleshoot issues 'offline' => false, // enables or disables site maintenance mode. This makes your site inaccessible to all users (including admins). - 'database' => - array ( + 'database' => [ 'driver' => 'mysql', // the database driver, i.e. MySQL, MariaDB... 'host' => 'localhost', // the host of the connection, localhost in most cases unless using an external service 'database' => 'flarum', // the name of the database in the instance @@ -25,12 +24,11 @@ Here's a quick overview of what everything means with an example file: 'prefix' => '', // the prefix for the tables, useful if you are sharing the same database with another service 'port' => '3306', // the port of the connection, defaults to 3306 with MySQL 'strict' => false, - ), + ], 'url' => 'https://flarum.localhost', // the URL installation, you will want to change this if you change domains - 'paths' => - array ( + 'paths' => [ 'api' => 'api', // /api goes to the API 'admin' => 'admin', // /admin goes to the admin - ), -); + ], +]; ``` diff --git a/docs/contributing.md b/docs/contributing.md index ecea17696..dee17b96a 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -54,34 +54,39 @@ npm run dev A typical contribution workflow looks like this: 1. 🌳 **Branch** off the appropriate branch into a new feature branch. - * *Bug fixes* should be sent to the latest stable branch. - * *Minor* features that are fully backwards compatible with the current Flarum release may be sent to the latest stable branch. - * *Major* features should always be sent to the `master` branch, which contains the upcoming Flarum release. - * Internally we use the naming scheme `/` (eg. `tz/refactor-frontend`). + + - _Bug fixes_ should be sent to the latest stable branch. + - _Minor_ features that are fully backwards compatible with the current Flarum release may be sent to the latest stable branch. + - _Major_ features should always be sent to the `master` branch, which contains the upcoming Flarum release. + - Internally we use the naming scheme `/` (eg. `tz/refactor-frontend`). 2. 🔨 **Write** some code. - * See below about [Coding Style](#coding-style). -1. 🚦 **Test** your code. - * Add unit tests as necessary when fixing bugs or adding features. - * Run the test suite with `vendor/bin/phpunit` in the relevant package folder. + - See below about [Coding Style](#coding-style). + +3. 🚦 **Test** your code. + - Add unit tests as necessary when fixing bugs or adding features. + - Run the test suite with `vendor/bin/phpunit` in the relevant package folder. 4. 💾 **Commit** your code with a descriptive message. - * If your change resolves an existing issue (usually, it should) include "Fixes #123" on a newline, where 123 is the issue number. - * Write a [good commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + + - If your change resolves an existing issue (usually, it should) include "Fixes #123" on a newline, where 123 is the issue number. + - Write a [good commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 5. 🎁 **Submit** a Pull Request on GitHub. - * Fill out the pull request template. - * If your change is visual, include a screenshot or GIF demonstrating the change. - * Do NOT check-in the JavaScript `dist` files. These will be compiled automatically on merge. + + - Fill out the pull request template. + - If your change is visual, include a screenshot or GIF demonstrating the change. + - Do NOT check-in the JavaScript `dist` files. These will be compiled automatically on merge. 6. 🤝 **Engage** with the Flarum team for approval. - * Team members will review your code. We may suggest some changes or improvements or alternatives, but for small changes your pull request should be accepted quickly. - * When addressing feedback, push additional commits instead of overwriting or squashing (we will squash on merge). + + - Team members will review your code. We may suggest some changes or improvements or alternatives, but for small changes your pull request should be accepted quickly. + - When addressing feedback, push additional commits instead of overwriting or squashing (we will squash on merge). 7. 🕺 **Dance** like you just contributed to Flarum. @@ -95,10 +100,10 @@ Don't worry if your code styling isn't perfect! StyleCI will automatically merge Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/core/blob/master/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. -* Namespaces should be singular (eg. `Flarum\Discussion`, not `Flarum\Discussions`) -* Interfaces should be suffixed with `Interface` (eg. `MailableInterface`) -* Abstract classes should be prefixed with `Abstract` (eg. `AbstractModel`) -* Traits should be suffixed with `Trait` (eg. `ScopeVisibilityTrait`) +- Namespaces should be singular (eg. `Flarum\Discussion`, not `Flarum\Discussions`) +- Interfaces should be suffixed with `Interface` (eg. `MailableInterface`) +- Abstract classes should be prefixed with `Abstract` (eg. `AbstractModel`) +- Traits should be suffixed with `Trait` (eg. `ScopeVisibilityTrait`) ### JavaScript @@ -107,16 +112,18 @@ Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/a ### Database **Columns** should be named according to their data type: -* DATETIME or TIMESTAMP: `{verbed}_at` (eg. created_at, read_at) or `{verbed}_until` (eg. suspended_until) -* INT that is a count: `{noun}_count` (eg. comment_count, word_count) -* Foreign key: `{verbed}_{entity}_id` (eg. hidden_user_id) - * Verb can be omitted for primary relationship (eg. post author is just `user_id`) -* BOOL: `is_{adjective}` (eg. is_locked) + +- DATETIME or TIMESTAMP: `{verbed}_at` (eg. created_at, read_at) or `{verbed}_until` (eg. suspended_until) +- INT that is a count: `{noun}_count` (eg. comment_count, word_count) +- Foreign key: `{verbed}_{entity}_id` (eg. hidden_user_id) + - Verb can be omitted for primary relationship (eg. post author is just `user_id`) +- BOOL: `is_{adjective}` (eg. is_locked) **Tables** should be named as follows: -* Use plural form (`discussions`) -* Separate multiple words with underscores (`access_tokens`) -* For relationships tables, join the two table names in singular form with an underscore in alphabetical order (eg. `discussion_user`) + +- Use plural form (`discussions`) +- Separate multiple words with underscores (`access_tokens`) +- For relationships tables, join the two table names in singular form with an underscore in alphabetical order (eg. `discussion_user`) ### CSS diff --git a/docs/es/README.md b/docs/es/README.md index 6249eb8e6..9fddf9cf6 100644 --- a/docs/es/README.md +++ b/docs/es/README.md @@ -8,10 +8,10 @@ Esta guía de usuario te ayudará a crear tu propio foro usando Flarum y te ense Flarum es el sucesor combinado de [esoTalk](https://github.com/esotalk/esoTalk) y [FluxBB](https://fluxbb.org). Está diseñado para ser: -* **Rápido y simple.** Sin desorden, sin relleno, sin dependencias complejas. Flarum está construido con PHP por lo que es rápido y fácil de desplegar. La interfaz está impulsada por [Mithril](https://mithril.js.org), un marco de trabajo de JavaScript de alto rendimiento con una pequeña huella. +- **Rápido y simple.** Sin desorden, sin relleno, sin dependencias complejas. Flarum está construido con PHP por lo que es rápido y fácil de desplegar. La interfaz está impulsada por [Mithril](https://mithril.js.org), un marco de trabajo de JavaScript de alto rendimiento con una pequeña huella. -* **Bonito y responsivo.** Este es el software de foros hecho para personas. Flarum está cuidadosamente diseñado para ser consistente e intuitivo en todas las plataformas, desde el principio. +- **Bonito y responsivo.** Este es el software de foros hecho para personas. Flarum está cuidadosamente diseñado para ser consistente e intuitivo en todas las plataformas, desde el principio. -* **Potente y extensible.** Personalice, extienda e integre Flarum para adaptarlo a su comunidad. La arquitectura de Flarum es increíblemente flexible, con una [potente API de extensión](/extend/). +- **Potente y extensible.** Personalice, extienda e integre Flarum para adaptarlo a su comunidad. La arquitectura de Flarum es increíblemente flexible, con una [potente API de extensión](/extend/). -* **Gratis y libre.** Flarum está liberado bajo la [licencia MIT](https://github.com/flarum/flarum/blob/master/LICENSE). \ No newline at end of file +- **Gratis y libre.** Flarum está liberado bajo la [licencia MIT](https://github.com/flarum/flarum/blob/master/LICENSE). diff --git a/docs/es/admin.md b/docs/es/admin.md index 2a44fcef1..592634be0 100644 --- a/docs/es/admin.md +++ b/docs/es/admin.md @@ -2,4 +2,4 @@ El Panel de Administración de Flarum es una interfaz fácil de usar para administrar su foro. Solo está disponible para los usuarios del [grupo] "Admin" (permissions.md). -Para acceder al panel de administración, haz clic en tu **Nombre** en la parte superior derecha de la pantalla, y selecciona **Administración**. \ No newline at end of file +Para acceder al panel de administración, haz clic en tu **Nombre** en la parte superior derecha de la pantalla, y selecciona **Administración**. diff --git a/docs/es/bugs.md b/docs/es/bugs.md index 55ea3f479..a9bbf5bf0 100644 --- a/docs/es/bugs.md +++ b/docs/es/bugs.md @@ -6,7 +6,7 @@ Si descubre una vulnerabilidad de seguridad en Flarum, por favor envíe un corre ::: -Gracias por ayudarnos a testear Flarum. ¡Estamos contentos de tenerte en el equipo! Necesitamos gente que pueda *resolver problemas con paciencia* y *comunicarlos con claridad*. Como probablemente sepas, un buen informe de errores requiere algo de tiempo y esfuerzo. Si te parece bien, ¡empecemos! +Gracias por ayudarnos a testear Flarum. ¡Estamos contentos de tenerte en el equipo! Necesitamos gente que pueda _resolver problemas con paciencia_ y _comunicarlos con claridad_. Como probablemente sepas, un buen informe de errores requiere algo de tiempo y esfuerzo. Si te parece bien, ¡empecemos! ## Duplicados @@ -15,7 +15,7 @@ Gracias por ayudarnos a testear Flarum. ¡Estamos contentos de tenerte en el equ - Busca en nuestro [Foro de soporte](https://discuss.flarum.org/t/support) para ver si ya se ha informado de ello. - Podríamos estar trabajando en una solución, así que busca también en nuestro [seguimiento de problemas](https://github.com/flarum/core/issues). -Si has buscado *a fondo* y no has encontrado nada, agradeceremos tu informe. Si se trata de un simple problema (una palabra mal escrita o un fallo gráfico, por ejemplo) pasa al siguiente párrafo. Pero si ves errores, o algo está claramente roto, necesitaremos que reúnas algo de información primero. Dirígete a nuestra guía [Resolución de problemas](troubleshoot.md) y sigue las instrucciones. Recoge toda la información que puedas. +Si has buscado _a fondo_ y no has encontrado nada, agradeceremos tu informe. Si se trata de un simple problema (una palabra mal escrita o un fallo gráfico, por ejemplo) pasa al siguiente párrafo. Pero si ves errores, o algo está claramente roto, necesitaremos que reúnas algo de información primero. Dirígete a nuestra guía [Resolución de problemas](troubleshoot.md) y sigue las instrucciones. Recoge toda la información que puedas. ## Informes @@ -25,4 +25,4 @@ Si puedes, comprueba si el problema es reproducible con la última versión de F Recuerda: el objetivo de un informe de error es facilitarnos la replicación del error y su solución. Puede que quieras leer [este artículo](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) para obtener algunos consejos útiles sobre cómo escribir un informe de error eficaz. Es **requerido** que describas claramente los pasos necesarios para reproducir el problema que tienes. Los problemas que no tengan pasos claros de reproducción no serán evaluados. Si un problema etiquetado como "necesita verificación" no recibe más información del autor del problema durante más de 5 días, se cerrará. -Una vez que hayas publicado tu informe, te pedimos que *sigas la discusión* y esperes pacientemente. Es posible que necesitemos pedir más detalles o aclaraciones; pero siempre tenemos mucho que hacer, y podría pasar un tiempo antes de que podamos dedicar a tu informe el tiempo que merece. \ No newline at end of file +Una vez que hayas publicado tu informe, te pedimos que _sigas la discusión_ y esperes pacientemente. Es posible que necesitemos pedir más detalles o aclaraciones; pero siempre tenemos mucho que hacer, y podría pasar un tiempo antes de que podamos dedicar a tu informe el tiempo que merece. diff --git a/docs/es/code-of-conduct.md b/docs/es/code-of-conduct.md index ead9f9f29..229d1ee33 100644 --- a/docs/es/code-of-conduct.md +++ b/docs/es/code-of-conduct.md @@ -2,7 +2,7 @@ ### _¡Bienvenido a la Comunidad de Flarum!_ -... ¡Y gracias por unirte a nosotros! Estamos entusiasmados con Flarum, y siempre estamos contentos de conocer a personas que sienten lo mismo. Queremos que *todos* aprovechen al máximo Flarum y la comunidad de Flarum, por lo que te pedimos que leas y sigas estas directrices. Estas se aplican ya sea que estés usando nuestro foro, el chat de Discord, comunicándote en GitHub, o cualquier otra forma de comunicación sin la comunidad de Flarum. +... ¡Y gracias por unirte a nosotros! Estamos entusiasmados con Flarum, y siempre estamos contentos de conocer a personas que sienten lo mismo. Queremos que _todos_ aprovechen al máximo Flarum y la comunidad de Flarum, por lo que te pedimos que leas y sigas estas directrices. Estas se aplican ya sea que estés usando nuestro foro, el chat de Discord, comunicándote en GitHub, o cualquier otra forma de comunicación sin la comunidad de Flarum. ### Por encima de todo, ¡mantén la calma! @@ -16,20 +16,20 @@ Todos estamos aquí para hablar de Flarum, y para trabajar juntos para hacer una - Spam, suplantación de identidad y cualquier otra acción que pretenda desprestigiar este sitio - Discusión de la piratería de software y temas similares -*Todo lo anterior es motivo de acción por parte de los moderadores.* Si tienes un problema con otro miembro, te pedimos que no te enfrentes a él. Si es en el foro, utiliza el comando *Informar* en el mensaje en cuestión, y luego deja que el personal se encargue de la situación. De lo contrario, informa de la infracción a [admin@flarum.org](mailto:admin@flarum.org). +_Todo lo anterior es motivo de acción por parte de los moderadores._ Si tienes un problema con otro miembro, te pedimos que no te enfrentes a él. Si es en el foro, utiliza el comando _Informar_ en el mensaje en cuestión, y luego deja que el personal se encargue de la situación. De lo contrario, informa de la infracción a [admin@flarum.org](mailto:admin@flarum.org). -Nuestros moderadores pueden editar o borrar cualquier contenido que sea ofensivo o que interrumpa el flujo de comunicación. Las infracciones graves o repetidas pueden llevar a la suspensión de la cuenta del usuario infractor. Así que, ya sabes, *sé guay*. 😎 +Nuestros moderadores pueden editar o borrar cualquier contenido que sea ofensivo o que interrumpa el flujo de comunicación. Las infracciones graves o repetidas pueden llevar a la suspensión de la cuenta del usuario infractor. Así que, ya sabes, _sé guay_. 😎 ### Hazte Oír -¿Quieres iniciar una nueva discusión? Primero, asegúrate de leer [nuestro FAQ](faq.md) y sigue los enlaces para asegurarte de que estás completamente informado sobre el proyecto. A continuación, dedícate a navegar por el foro, familiarízate con [el sistema de etiquetas](https://discuss.flarum.org/tags) y haz algunas búsquedas de palabras clave relacionadas con tu tema: *¡podría ser que alguien ya haya iniciado una discusión al respecto!* +¿Quieres iniciar una nueva discusión? Primero, asegúrate de leer [nuestro FAQ](faq.md) y sigue los enlaces para asegurarte de que estás completamente informado sobre el proyecto. A continuación, dedícate a navegar por el foro, familiarízate con [el sistema de etiquetas](https://discuss.flarum.org/tags) y haz algunas búsquedas de palabras clave relacionadas con tu tema: _¡podría ser que alguien ya haya iniciado una discusión al respecto!_ Cuando estés seguro de que estás preparado para iniciar una discusión, ten en cuenta los siguientes puntos: - ¡Dale un buen título! Obtendrás mejores resultados si tu título deja claro de qué quieres hablar. - Elige la(s) etiqueta(s) adecuada(s). Esto aumentará la probabilidad de que tu mensaje sea leído y respondido rápidamente. -- *No* publiques repetidamente sobre el mismo tema, ya que esto tiende a tener el efecto contrario. -- Si no utilizas una etiqueta reservada para uso multilingüe, *publica sólo en inglés.* ¡No podemos ayudarte si no podemos leerte! +- _No_ publiques repetidamente sobre el mismo tema, ya que esto tiende a tener el efecto contrario. +- Si no utilizas una etiqueta reservada para uso multilingüe, _publica sólo en inglés._ ¡No podemos ayudarte si no podemos leerte! - Recuerda que no es necesario que firmes tus mensajes. Tenemos tu perfil para saber quién eres. Por favor, haz el esfuerzo de ayudarnos a mantener las cosas organizadas. El tiempo que pasamos ordenando es tiempo que no podemos dedicar a conocerte, a discutir tus asuntos y a hablar de Flarum. Y eso, al fin y al cabo, es lo que hemos venido a hacer. @@ -38,7 +38,7 @@ Por favor, haz el esfuerzo de ayudarnos a mantener las cosas organizadas. El tie Te tomas el tiempo de participar en una discusión, con la esperanza de que los demás lean tus ideas y las tengan en cuenta. Así que, ¿por qué no hacer un esfuerzo para que tu respuesta merezca la pena? -- No respondas a un título. Tómate un tiempo para *leer* el texto y, al menos, *escanear* el resto de la conversación. +- No respondas a un título. Tómate un tiempo para _leer_ el texto y, al menos, _escanear_ el resto de la conversación. - Pregúntate si tu respuesta aporta algo a la discusión. Si no lo hace, piénsalo mejor antes de publicar. - Evita hacer posts de una sola palabra sólo para estar de acuerdo con alguien; para eso puedes usar el botón "Me gusta". - Evita hacer varios mensajes seguidos cuando uno sería suficiente. Esto es un foro, no una sala de chat. @@ -46,6 +46,6 @@ Te tomas el tiempo de participar en una discusión, con la esperanza de que los - Si sólo quieres publicar una tontería como prueba, hazlo en la etiqueta [Test Posting](https://discuss.flarum.org/t/sandbox). - Asegúrate de que tus respuestas aportan comentarios constructivos y apoyo para permitir una comunidad inclusiva. -Nadie se va a quejar por una broma o un comentario inteligente ocasional. Nos gusta que el ambiente sea distendido. Pero para que las cosas sigan siendo productivas, te pedimos que trates de evitar el descarrilamiento de la discusión. +Nadie se va a quejar por una broma o un comentario inteligente ocasional. Nos gusta que el ambiente sea distendido. Pero para que las cosas sigan siendo productivas, te pedimos que trates de evitar el descarrilamiento de la discusión. -> Gracias a Dominion por su ayuda en la elaboración de estas directrices. \ No newline at end of file +> Gracias a Dominion por su ayuda en la elaboración de estas directrices. diff --git a/docs/es/config.md b/docs/es/config.md index 840564f3a..21804f9b5 100644 --- a/docs/es/config.md +++ b/docs/es/config.md @@ -10,10 +10,9 @@ También proporciona a Flarum información de la base de datos y más. Aquí hay un rápido resumen de lo que significa todo con un archivo de ejemplo: ```php - false, // activa o desactiva el modo de depuración, utilizado para solucionar problemas - 'database' => - array ( + 'database' => [ 'driver' => 'mysql', // el controlador de la base de datos, es decir, MySQL, MariaDB... 'host' => 'localhost', // el host de la conexión, localhost en la mayoría de los casos, a menos que se utilice un servicio externo 'database' => 'flarum', // el nombre de la base de datos en la instancia @@ -24,12 +23,11 @@ Aquí hay un rápido resumen de lo que significa todo con un archivo de ejemplo: 'prefix' => '', // el prefijo de las tablas, útil si se comparte la misma base de datos con otro servicio 'port' => '3306', // el puerto de la conexión, por defecto 3306 con MySQL 'strict' => false, - ), + ], 'url' => 'https://flarum.localhost', // la configuración de la URL, deberá cambiarla si cambia de dominio - 'paths' => - array ( + 'paths' => [ 'api' => 'api', // /api va a la API 'admin' => 'admin', // /admin va a la administración - ), -); + ], +]; ``` diff --git a/docs/es/console.md b/docs/es/console.md index aa0fc83d8..d4399b9bd 100644 --- a/docs/es/console.md +++ b/docs/es/console.md @@ -48,4 +48,4 @@ Ejecuta todas las migraciones pendientes. Debe utilizarse cuando se añade o act `php flarum migrate:reset --extension [extension_id]` -Restablece todas las migraciones de una extensión. Esto es utilizado principalmente por los desarrolladores de extensiones, pero en ocasiones, puede ser necesario ejecutar este comando si se está eliminando una extensión, y desea borrar todos sus datos de la base de datos. Tenga en cuenta que la extensión en cuestión debe estar instalada (pero no necesariamente activada) para que esto funcione. \ No newline at end of file +Restablece todas las migraciones de una extensión. Esto es utilizado principalmente por los desarrolladores de extensiones, pero en ocasiones, puede ser necesario ejecutar este comando si se está eliminando una extensión, y desea borrar todos sus datos de la base de datos. Tenga en cuenta que la extensión en cuestión debe estar instalada (pero no necesariamente activada) para que esto funcione. diff --git a/docs/es/contributing.md b/docs/es/contributing.md index 8ef6cc4f4..efb9487ce 100644 --- a/docs/es/contributing.md +++ b/docs/es/contributing.md @@ -14,7 +14,7 @@ Si estás planeando seguir adelante y trabajar en algo, por favor comenta en el ## Configuración de desarrollo -[flarum/flarum](https://github.com/flarum/flarum) es una aplicación "esqueleto" que para descargar utiliza Composer [flarum/core](https://github.com/flarum/core) y un [conjunto de extensiones](https://github.com/flarum). Para poder trabajar con ellas, se recomienda hacer un fork y clonarlas en el [repositorio de la ruta del Composer](https://getcomposer.org/doc/05-repositories.md#path): +[flarum/flarum](https://github.com/flarum/flarum) es una aplicación "esqueleto" que para descargar utiliza Composer [flarum/core](https://github.com/flarum/core) y un [conjunto de extensiones](https://github.com/flarum). Para poder trabajar con ellas, se recomienda hacer un fork y clonarlas en el [repositorio de la ruta del Composer](https://getcomposer.org/doc/05-repositories.md#path): ```bash git clone https://github.com/flarum/flarum.git @@ -54,33 +54,38 @@ npm run dev Un flujo de trabajo de contribución típico es el siguiente: 1. 🌳 Se bifurca el **Branch** apropiado en un nuevo branch de características. - * *Correcciones de Bugs* debe enviarse al ultimo branch estable. - * Características *menores* que son totalmente compatibles con la versión actual de Flarum pueden ser enviadas al ultimo branch estable. - * Características *mayores* deben enviarse siempre al branch `master`, que contiene la próxima versión de Flarum. - * Internamente utilizamos el scheme de nomenclatura `/` (eg. `tz/refactor-frontend`). + + - _Correcciones de Bugs_ debe enviarse al ultimo branch estable. + - Características _menores_ que son totalmente compatibles con la versión actual de Flarum pueden ser enviadas al ultimo branch estable. + - Características _mayores_ deben enviarse siempre al branch `master`, que contiene la próxima versión de Flarum. + - Internamente utilizamos el scheme de nomenclatura `/` (eg. `tz/refactor-frontend`). 2. 🔨 **Escribe** algo de código. - * Ver abajo sobre el [Estilo de codificación](#coding-style). -1. 🚦 **Prueba** el código. - * Añade pruebas unitarias según sea necesario cuando arregles errores o añadas características. - * Ejecute el conjunto de pruebas con `vendor/bin/phpunit` en la carpeta del paquete correspondiente. + - Ver abajo sobre el [Estilo de codificación](#coding-style). + +3. 🚦 **Prueba** el código. +_ Añade pruebas unitarias según sea necesario cuando arregles errores o añadas características. +_ Ejecute el conjunto de pruebas con `vendor/bin/phpunit` en la carpeta del paquete correspondiente. 4. 💾 Haz el **commit** de su código con un mensaje descriptivo. - * Si su cambio resuelve un problema existente (por lo general, debería) incluir "Fixes #123" en una nueva línea, donde 123 es el número del issue. - * Escriba un [buen mensaje en el commit](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + + - Si su cambio resuelve un problema existente (por lo general, debería) incluir "Fixes #123" en una nueva línea, donde 123 es el número del issue. + - Escriba un [buen mensaje en el commit](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 5. 🎁 **Envia** un Pull Request en GitHub. - * Rellene la plantilla del pull request. - * Si su cambio es visual, incluya una captura de pantalla o GIF que muestre el cambio. - * NO registre los archivos `dist` de JavaScript. Éstos se compilarán automáticamente en el merge. + + - Rellene la plantilla del pull request. + - Si su cambio es visual, incluya una captura de pantalla o GIF que muestre el cambio. + - NO registre los archivos `dist` de JavaScript. Éstos se compilarán automáticamente en el merge. 6. 🤝 **Intercambio** con el equipo de Flarum para su aprobación. - * Los miembros del equipo revisarán su código. Podemos sugerir algunos cambios o mejoras o alternativas, pero para los pequeños cambios su pull request debería ser aceptado rápidamente. - * Cuando se aborda la retroalimentación, envíe commits adicionales en lugar de sobrescribir o aplastar (vamos a aplastar en la fusión). + + - Los miembros del equipo revisarán su código. Podemos sugerir algunos cambios o mejoras o alternativas, pero para los pequeños cambios su pull request debería ser aceptado rápidamente. + - Cuando se aborda la retroalimentación, envíe commits adicionales en lugar de sobrescribir o aplastar (vamos a aplastar en la fusión). 7. 🕺 **Baila** como si acabaras de contribuir a Flarum. @@ -88,16 +93,16 @@ Un flujo de trabajo de contribución típico es el siguiente: Para mantener el código base de Flarum limpio y consistente, tenemos una serie de pautas de estilo de codificación que seguimos. En caso de duda, lee el código fuente. -No te preocupes si el estilo de tu código no es perfecto. StyleCI fusionará automáticamente cualquier corrección de estilo en los repositorios de Flarum después de fusionar las solicitudes de extracción. Esto nos permite centrarnos en el contenido de la contribución y no en el estilo +No te preocupes si el estilo de tu código no es perfecto. StyleCI fusionará automáticamente cualquier corrección de estilo en los repositorios de Flarum después de fusionar las solicitudes de extracción. Esto nos permite centrarnos en el contenido de la contribución y no en el estilo ### PHP Flarum sigue el estándar de codificación [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) y el estándar de carga automática [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md). Además de esto, nos ajustamos a una serie de [otras reglas de estilo](https://github.com/flarum/core/blob/master/.styleci.yml). Usamos las declaraciones de tipo y de retorno de PHP 7 cuando es posible, y [PHPDoc](https://docs.phpdoc.org/) para proporcionar documentación en línea. Intenta imitar el estilo utilizado por el resto del código base en tus contribuciones. -* Los espacios de nombres deben ser singulares (p. ej. `Flarum-Discussion`, no `Flarum-Discussions`). -* Las interfaces deben llevar el sufijo `Interface` (p. ej. `MailableInterface`) -* Las clases abstractas deben llevar el prefijo `Abstract` (p. ej. `AbstractModel`) -* Los rasgos deben llevar el sufijo `Trait` (p. ej. `ScopeVisibilityTrait`) +- Los espacios de nombres deben ser singulares (p. ej. `Flarum-Discussion`, no `Flarum-Discussions`). +- Las interfaces deben llevar el sufijo `Interface` (p. ej. `MailableInterface`) +- Las clases abstractas deben llevar el prefijo `Abstract` (p. ej. `AbstractModel`) +- Los rasgos deben llevar el sufijo `Trait` (p. ej. `ScopeVisibilityTrait`) ### JavaScript @@ -106,16 +111,18 @@ El JavaScript de Flarum sigue en su mayoría la [Guía de estilo de Airbnb](http ### Base de datos **Columnas** deben nombrarse según su tipo de datos: -* DATETIME o TIMESTAMP: `{verbed}_at` (ej. created_at, read_at) o `{verbed}_until` (ej. suspended_until) -* INT que es un recuento: `{noun}_count` (ej. comment_count, word_count) -* Clave foránea: `{verbed}_{entity}_id` (ej. hidden_user_id) - * Se puede omitir el término para la relación primaria (por ejemplo, el autor del post es sólo `user_id`) -* BOOL: `is_{adjective}` (ej. is_locked) + +- DATETIME o TIMESTAMP: `{verbed}_at` (ej. created_at, read_at) o `{verbed}_until` (ej. suspended_until) +- INT que es un recuento: `{noun}_count` (ej. comment_count, word_count) +- Clave foránea: `{verbed}_{entity}_id` (ej. hidden_user_id) + - Se puede omitir el término para la relación primaria (por ejemplo, el autor del post es sólo `user_id`) +- BOOL: `is_{adjective}` (ej. is_locked) **Tablas** deben ser nombradas de la siguiente manera: -* Utilizar la forma plural (`discussions`) -* Separe las palabras múltiples con guiones bajos (`access_tokens`) -* Para las tablas de relaciones, unir los dos nombres de las tablas en singular con un guión bajo en orden alfabético (ej. `discussion_user`) + +- Utilizar la forma plural (`discussions`) +- Separe las palabras múltiples con guiones bajos (`access_tokens`) +- Para las tablas de relaciones, unir los dos nombres de las tablas en singular con un guión bajo en orden alfabético (ej. `discussion_user`) ### CSS @@ -139,4 +146,4 @@ Usted confirma que puede concedernos estos derechos. Usted declara que está leg Usted declara que las Contribuciones son sus obras originales de autoría, y que, según su conocimiento, ninguna otra persona reclama, o tiene derecho a reclamar, ningún derecho sobre ninguna invención o patente relacionada con las Contribuciones. Usted también declara que no está legalmente obligado, ya sea mediante la celebración de un acuerdo o de otro modo, de ninguna manera que entre en conflicto con los términos de esta licencia. -La Fundación Flarum reconoce que, salvo lo descrito explícitamente en este Acuerdo, cualquier Contribución que usted proporcione se realiza "tal cual", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, YA SEAN EXPRESAS O IMPLÍCITAS, INCLUYENDO, SIN LIMITACIÓN, CUALQUIER GARANTÍA O CONDICIÓN DE TÍTULO, NO INFRACCIÓN, COMERCIABILIDAD O IDONEIDAD PARA UN PROPÓSITO PARTICULAR. \ No newline at end of file +La Fundación Flarum reconoce que, salvo lo descrito explícitamente en este Acuerdo, cualquier Contribución que usted proporcione se realiza "tal cual", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, YA SEAN EXPRESAS O IMPLÍCITAS, INCLUYENDO, SIN LIMITACIÓN, CUALQUIER GARANTÍA O CONDICIÓN DE TÍTULO, NO INFRACCIÓN, COMERCIABILIDAD O IDONEIDAD PARA UN PROPÓSITO PARTICULAR. diff --git a/docs/es/extend/README.md b/docs/es/extend/README.md index e843d7a2c..4e3c53f40 100644 --- a/docs/es/extend/README.md +++ b/docs/es/extend/README.md @@ -22,7 +22,7 @@ Para lograr esta extensibilidad, Flarum ha sido construido con ricas APIs y punt **Las extensiones de terceros** son características creadas por otros y no están oficialmente soportadas por el equipo de Flarum. Pueden ser construidas y usadas para abordar casos de uso más específicos. -Si quieres solucionar un error o una deficiencia del núcleo, o de una extensión ya existente, puede ser apropiado *contribuir al proyecto respectivo* en lugar de dispersar el esfuerzo en una nueva extensión de terceros. Es una buena idea comenzar una discusión en la [Comunidad Flarum](https://discuss.flarum.org/) para obtener la perspectiva de los desarrolladores de Flarum. +Si quieres solucionar un error o una deficiencia del núcleo, o de una extensión ya existente, puede ser apropiado _contribuir al proyecto respectivo_ en lugar de dispersar el esfuerzo en una nueva extensión de terceros. Es una buena idea comenzar una discusión en la [Comunidad Flarum](https://discuss.flarum.org/) para obtener la perspectiva de los desarrolladores de Flarum. ## Recursos útiles @@ -39,4 +39,4 @@ Si quieres solucionar un error o una deficiencia del núcleo, o de una extensió ### Obtener ayuda - [Comunidad oficial de desarrollo de Flarum](https://discuss.flarum.org/t/dev) -- [Únase a nosotros en #extend en nuestro chat de Discord](https://flarum.org/discord/) \ No newline at end of file +- [Únase a nosotros en #extend en nuestro chat de Discord](https://flarum.org/discord/) diff --git a/docs/es/extend/admin.md b/docs/es/extend/admin.md index 95d163f04..393101ea9 100644 --- a/docs/es/extend/admin.md +++ b/docs/es/extend/admin.md @@ -12,26 +12,23 @@ Esta nueva API le permite añadir ajustes a su extensión con muy pocas líneas ### Cómo informar a la API sobre su extensión -Antes de que puedas registrar nada, tienes que decirle a `ExtensionData` de qué extensión va a obtener datos. +Antes de que puedas registrar nada, tienes que decirle a `ExtensionData` de qué extensión va a obtener datos. Simplemente ejecute la función `for` en `app.extensionData` pasando el id de su extensión. Para encontrar el id de tu extensión, toma el nombre del compositor y sustituye las barras por guiones (ejemplo: 'fof/merge-discussions' se convierte en 'fof-merge-discussions'). Para el siguiente ejemplo, utilizaremos la extensión ficticia 'acme/interstellar': ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar'); }); ``` -Una vez hecho esto, puedes empezar a añadir configuraciones y permisos. +Una vez hecho esto, puedes empezar a añadir configuraciones y permisos. ::: Note -Todas las funciones de registro en `ExtensionData` son encadenables, lo que significa que puedes llamarlas una tras otra sin tener que volver a ejecutar `for`. +Todas las funciones de registro en `ExtensionData` son encadenables, lo que significa que puedes llamarlas una tras otra sin tener que volver a ejecutar `for`. ::: @@ -39,24 +36,20 @@ Todas las funciones de registro en `ExtensionData` son encadenables, lo que sign Se recomienda añadir campos de configuración para los elementos simples. Como regla general, si sólo necesitas almacenar cosas en la tabla de ajustes, esto debería ser suficiente para ti. -Para añadir un campo, llama a la función `registerSetting` después de `for` en `app.extensionData` y pasa un 'setting object' como primer argumento. Detrás de las escenas `ExtensionData` en realidad convierte su configuración en un [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), puede pasar un número de prioridad como el segundo argumento. +Para añadir un campo, llama a la función `registerSetting` después de `for` en `app.extensionData` y pasa un 'setting object' como primer argumento. Detrás de las escenas `ExtensionData` en realidad convierte su configuración en un [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), puede pasar un número de prioridad como el segundo argumento. Aquí hay un ejemplo con un elemento switch (booleano): ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // Esta es la clave con la que se guardarán los ajustes en la tabla de ajustes de la base de datos. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // La etiqueta que se mostrará para que el administrador sepa lo que hace el ajuste. - type: 'boolean', // Qué tipo de ajuste es, las opciones válidas son: booleano, texto (o cualquier otro tipo de etiqueta ), y seleccionar. - }, - 30 // Opcional: Prioridad - ) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting( + { + setting: 'acme-interstellar.coordinates', // Esta es la clave con la que se guardarán los ajustes en la tabla de ajustes de la base de datos. + label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // La etiqueta que se mostrará para que el administrador sepa lo que hace el ajuste. + type: 'boolean', // Qué tipo de ajuste es, las opciones válidas son: booleano, texto (o cualquier otro tipo de etiqueta ), y seleccionar. + }, + 30 // Opcional: Prioridad + ); }); ``` @@ -78,25 +71,20 @@ Si se utiliza `type: 'select'` el objeto de ajuste tiene un aspecto un poco dife Si quieres añadir algo a los ajustes como algún texto extra o una entrada más complicada, también puedes pasar una devolución de llamada como primer argumento que devuelva JSX. Este callback se ejecutará en el contexto de [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) y los valores de configuración no se serializarán automáticamente. ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting(function () { + if (app.session.user.username() === 'RocketMan') { + return ( +
+

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

+ +
+ ); + } + }); }); ``` @@ -104,29 +92,27 @@ app.initializers.add('interstellar', function(app) { Como novedad en la beta 15, los permisos pueden encontrarse ahora en dos lugares. Ahora, puedes ver los permisos individuales de cada extensión en su página. Todos los permisos se pueden seguir encontrando en la página de permisos. -Para que esto ocurra, los permisos deben estar registrados en `ExtensionData`. Esto se hace de forma similar a la configuración, llamando a `registerPermission`. +Para que esto ocurra, los permisos deben estar registrados en `ExtensionData`. Esto se hace de forma similar a la configuración, llamando a `registerPermission`. + +Argumentos: + +- Objeto de permiso +- Qué tipo de permiso - ver las funciones de [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) para los tipos (eliminar elementos del nombre) +- Prioridad de `ItemList` -Argumentos: - * Objeto de permiso - * Qué tipo de permiso - ver las funciones de [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) para los tipos (eliminar elementos del nombre) - * Prioridad de `ItemList` - Volvemos a nuestra extensión favorita del rocket: ```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Icono Font-Awesome - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etiqueta de permiso - permission: 'discussion.rocket_fly', // Nombre real del permiso almacenado en la base de datos (y utilizado al comprobar el permiso). - }, - 'start', // Se añadirá el permiso de la categoría en el grid - 95 // Opcional: Prioridad - ); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPermission( + { + icon: 'fas fa-rocket', // Icono Font-Awesome + label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etiqueta de permiso + permission: 'discussion.rocket_fly', // Nombre real del permiso almacenado en la base de datos (y utilizado al comprobar el permiso). + }, + 'start', // Se añadirá el permiso de la categoría en el grid + 95 // Opcional: Prioridad + ); }); ``` @@ -154,25 +140,18 @@ import ExtensionPage from 'flarum/components/ExtensionPage'; export default class StarPage extends ExtensionPage { content() { - return ( -

¡Hola desde la sección de ajustes!

- ) + return

¡Hola desde la sección de ajustes!

; } } - ``` Entonces, simplemente ejecute `registerPage`: ```js - import StarPage from './components/StarPage'; -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPage(StarPage); }); ``` @@ -186,11 +165,11 @@ En la beta 15, las páginas de las extensiones tienen espacio para información Para más información, consulte el esquema [composer.json](https://getcomposer.org/doc/04-schema.md). -| Descripción | Dónde en composer.json | -| --------------------------------- | -------------------------------------- | -| Enlace de discusión discuss.flarum.org | Clave "forum" dentro de "support" | -| Documentación | Clave "docs" dentro de "support" | -| Soporte (correo electrónico) | Clave "email" dentro de "support" | -| Sitio web | Clave "homepage" | -| Donación | Bloque de claves "funding" (Nota: Sólo se utilizará el primer enlace) | -| Fuente | Clave "source" dentro de "support" | \ No newline at end of file +| Descripción | Dónde en composer.json | +| -------------------------------------- | --------------------------------------------------------------------- | +| Enlace de discusión discuss.flarum.org | Clave "forum" dentro de "support" | +| Documentación | Clave "docs" dentro de "support" | +| Soporte (correo electrónico) | Clave "email" dentro de "support" | +| Sitio web | Clave "homepage" | +| Donación | Bloque de claves "funding" (Nota: Sólo se utilizará el primer enlace) | +| Fuente | Clave "source" dentro de "support" | diff --git a/docs/es/extend/api-throttling.md b/docs/es/extend/api-throttling.md index 1a30e8943..c56354806 100644 --- a/docs/es/extend/api-throttling.md +++ b/docs/es/extend/api-throttling.md @@ -17,7 +17,7 @@ El formato de un acelerador personalizado es extremadamente simple: todo lo que - `false`: Esto evita explícitamente el aceleramiento para esta solicitud, anulando todos los demás aceleradores. - `true`: Esto marca la solicitud como para ser acelerada. - `null`: Esto significa que este acelerador no se aplica. -Cualquier otra salida será ignorada, con el mismo efecto que `null`. + Cualquier otra salida será ignorada, con el mismo efecto que `null`. Los aceleradores se ejecutarán en TODAS las peticiones, y son responsables de averiguar si se aplican o no. Por ejemplo, considere el acelerador de correos de Flarum: @@ -25,21 +25,26 @@ Los aceleradores se ejecutarán en TODAS las peticiones, y son responsables de a use DateTime; use Flarum\Post\Post; -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; +function ($request) +{ + if (!in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { + return; + } + + $actor = $request->getAttribute('actor'); + + if ($actor->can('postWithoutThrottle')) { + return false; + } + + if ( + Post::where('user_id', $actor->id) + ->where('created_at', '>=', new DateTime('-10 seconds')) + ->exists() + ) { + return true; + } +} ``` Los aceleradores pueden ser añadidos o eliminados a través del middleware `ThrottleApi` en `extend.php`. Por ejemplo: @@ -50,12 +55,12 @@ Los aceleradores pueden ser añadidos o eliminados a través del middleware `Thr use Flarum\Extend; return [ - // Other extenders - (new Extend\ThrottleApi()) - ->set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders + // Other extenders + (new Extend\ThrottleApi()) + ->set('throttleAll', function () { + return false; + }) + ->remove('bypassThrottlingAttribute'), + // Other extenders ]; -``` \ No newline at end of file +``` diff --git a/docs/es/extend/authorization.md b/docs/es/extend/authorization.md index 3e4b50dd2..5e46d150f 100644 --- a/docs/es/extend/authorization.md +++ b/docs/es/extend/authorization.md @@ -104,27 +104,27 @@ use Flarum\User\User; class TagPolicy extends AbstractPolicy { - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function startDiscussion(User $actor, Tag $tag) - { - if ($tag->is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function startDiscussion(User $actor, Tag $tag) + { + if ($tag->is_restricted) { + return $actor->hasPermission('tag' . $tag->id . '.startDiscussion') ? $this->allow() : $this->deny(); } + } + + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function addToDiscussion(User $actor, Tag $tag) + { + return $this->startDiscussion($actor, $tag); + } } ``` @@ -142,34 +142,34 @@ use Flarum\User\User; class GlobalPolicy extends AbstractPolicy { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } + + /** + * @param Flarum\User\User $actor + * @param string $ability + * @return bool|void + */ + public function can(User $actor, string $ability) + { + if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { + $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); + $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); + + if ($enoughPrimary && $enoughSecondary) { + return $this->allow(); + } else { + return $this->deny(); + } } + } } ``` @@ -184,9 +184,7 @@ use YourNamespace\Access; return [ // Otros extensores - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), + (new Extend\Policy())->modelPolicy(Tag::class, Access\TagPolicy::class)->globalPolicy(Access\GlobalPolicy::class), // Otros extensores ]; ``` @@ -243,10 +241,9 @@ $query->where('posts.is_private', false); // Sin embargo, reconocemos que algunas extensiones podrían tener casos de uso válidos para mostrar publicaciones privadas. // Así que en su lugar, incluimos todos los mensajes que no son privados, Y todos los mensajes privados deseados por las extensiones. $query->where(function ($query) use ($actor) { - $query->where('posts.is_private', false) - ->orWhere(function ($query) use ($actor) { - $query->whereVisibleTo($actor, 'viewPrivate'); - }); + $query->where('posts.is_private', false)->orWhere(function ($query) use ($actor) { + $query->whereVisibleTo($actor, 'viewPrivate'); + }); }); ``` @@ -260,12 +257,12 @@ use Illuminate\Database\Eloquent\Builder; class ScopePostVisibility { - public function __invoke(User $actor, $query) - { - if ($actor->can('posts.viewPrivate')) { - $query->whereRaw("1=1"); - } + public function __invoke(User $actor, $query) + { + if ($actor->can('posts.viewPrivate')) { + $query->whereRaw('1=1'); } + } } ``` @@ -288,14 +285,14 @@ use Illuminate\Database\Eloquent\Builder; class ScopeTagVisibility { - /** - * @param User $actor - * @param Builder $query - */ - public function __invoke(User $actor, Builder $query) - { - $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); - } + /** + * @param User $actor + * @param Builder $query + */ + public function __invoke(User $actor, Builder $query) + { + $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); + } } ``` @@ -312,26 +309,27 @@ use Illuminate\Database\Eloquent\Builder; class ScopeDiscussionVisibilityForAbility { - /** - * @param User $actor - * @param Builder $query - * @param string $ability - */ - public function __invoke(User $actor, Builder $query, $ability) - { - if (substr($ability, 0, 4) === 'view') { - return; - } - - // Si una discusión requiere un determinado permiso para que sea - // visible, entonces podemos comprobar si el usuario tiene concedido ese - // permiso para cualquiera de las etiquetas de la discusión. - $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { - return $query->select('discussion_id') - ->from('discussion_tag') - ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.'.$ability)); - }); + /** + * @param User $actor + * @param Builder $query + * @param string $ability + */ + public function __invoke(User $actor, Builder $query, $ability) + { + if (substr($ability, 0, 4) === 'view') { + return; } + + // Si una discusión requiere un determinado permiso para que sea + // visible, entonces podemos comprobar si el usuario tiene concedido ese + // permiso para cualquiera de las etiquetas de la discusión. + $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { + return $query + ->select('discussion_id') + ->from('discussion_tag') + ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.' . $ability)); + }); + } } ``` @@ -351,11 +349,9 @@ return [ // 'view' es opcional aquí, ya que es el valor por defecto para el argumento de la habilidad. // Sin embargo, si estuviéramos aplicando esto a una habilidad diferente, como `viewPrivate`, // tendríamos que especificarlo explícitamente. - (new Extend\ModelVisibility(Tag::class)) - ->scope(Access\ScopeTagVisibility::class, 'view'), + (new Extend\ModelVisibility(Tag::class))->scope(Access\ScopeTagVisibility::class, 'view'), - (new Extend\ModelVisibility(Discussion::class)) - ->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), + (new Extend\ModelVisibility(Discussion::class))->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), // Otros extensores ]; ``` @@ -371,4 +367,4 @@ Los permisos globales (`viewDiscussions`, `viewUserList`) pueden incluirse en el Por ejemplo, cuando devolvemos listas de discusiones, comprobamos si el usuario puede responder, renombrar, editar y borrar, y almacenamos esos datos en el modelo de discusión del frontend. Entonces es accesible a través de `discussion.canReply()` o `discussion.canEdit()`, pero no hay nada mágico ahí: es sólo otro atributo enviado por el serializador. -Para un ejemplo de cómo adjuntar datos a un serializador, vea un [caso similar para transmitir ajustes](settings.md#accessing-settings). \ No newline at end of file +Para un ejemplo de cómo adjuntar datos a un serializador, vea un [caso similar para transmitir ajustes](settings.md#accessing-settings). diff --git a/docs/es/extend/backend-events.md b/docs/es/extend/backend-events.md index 40e8c63ac..d5d96204c 100644 --- a/docs/es/extend/backend-events.md +++ b/docs/es/extend/backend-events.md @@ -19,23 +19,21 @@ use Flarum\Extend; use Flarum\Post\Event\Deleted; use Symfony\Contracts\Translation\TranslatorInterface; - return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // haz algo aquí - }) - ->listen(Deleted::class, PostDeletedListener::class) + (new Extend\Event()) + ->listen(Deleted::class, function ($event) { + // haz algo aquí + }) + ->listen(Deleted::class, PostDeletedListener::class), ]; - class PostDeletedListener { protected $translator; public function __construct(TranslatorInterface $translator) { - $this->translator = $translator; + $this->translator = $translator; } public function handle(Deleted $event) @@ -55,30 +53,27 @@ Despachar eventos es muy sencillo. Todo lo que necesitas hacer es inyectar `Illu use Flarum\Post\Event\Deleted; use Illuminate\Contracts\Events\Dispatcher; - class SomeClass { - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Lógica - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // Más lógica - } + /** + * @var Dispatcher + */ + protected $events; + + /** + * @param Dispatcher $events + */ + public function __construct(Dispatcher $events) + { + $this->events = $events; + } + + public function someMethod() + { + // Lógica + $this->events->dispatch(new Deleted($somePost, $someActor)); + // Más lógica + } } ``` @@ -105,24 +100,24 @@ use Flarum\User\User; class Deleted { - /** - * @var Post - */ - public $post; - - /** - * @var User - */ - public $actor; - - /** - * @param Post $post - * @param User $user - */ - public function __construct(Post $post, User $actor = null) - { - $this->post = $post; - $this->actor = $actor; - } + /** + * @var Post + */ + public $post; + + /** + * @var User + */ + public $actor; + + /** + * @param Post $post + * @param User $user + */ + public function __construct(Post $post, User $actor = null) + { + $this->post = $post; + $this->actor = $actor; + } } -``` \ No newline at end of file +``` diff --git a/docs/es/extend/console.md b/docs/es/extend/console.md index 1de4c7cbb..c528b1a5a 100644 --- a/docs/es/extend/console.md +++ b/docs/es/extend/console.md @@ -10,12 +10,11 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -class YourCommand implements AbstractCommand { +class YourCommand implements AbstractCommand +{ protected function configure() { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); + $this->setName('YOUR COMMAND NAME')->setDescription('YOUR COMMAND DESCRIPTION'); } protected function fire() { @@ -34,7 +33,7 @@ use YourNamespace\Console\CustomCommand; return [ // Otros extensores - (new Extend\Console())->command(CustomCommand::class) + (new Extend\Console())->command(CustomCommand::class), // Otros extensores ]; ``` diff --git a/docs/es/extend/data.md b/docs/es/extend/data.md index 88de40415..b5ac68495 100644 --- a/docs/es/extend/data.md +++ b/docs/es/extend/data.md @@ -35,12 +35,12 @@ En Flarum, los archivos de migración deben **devolver un array** con dos funcio use Illuminate\Database\Schema\Builder; return [ - 'up' => function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } + 'up' => function (Builder $schema) { + // up migration + }, + 'down' => function (Builder $schema) { + // down migration + }, ]; ``` @@ -48,7 +48,7 @@ Para tareas comunes como la creación de una tabla, o la adición de columnas a ### Ciclo de vida de las migraciones -Las migraciones se aplican cuando la extensión se habilita por primera vez o cuando está habilitada y hay algunas migraciones pendientes. Las migraciones ejecutadas se registran en la base de datos, y cuando se encuentran algunas en la carpeta de migraciones de una extensión que no están registradas como completadas todavía, se ejecutarán. +Las migraciones se aplican cuando la extensión se habilita por primera vez o cuando está habilitada y hay algunas migraciones pendientes. Las migraciones ejecutadas se registran en la base de datos, y cuando se encuentran algunas en la carpeta de migraciones de una extensión que no están registradas como completadas todavía, se ejecutarán. Las migraciones también pueden aplicarse manualmente con `php flarum migrate`, que también es necesario para actualizar las migraciones de una extensión ya habilitada. Para deshacer los cambios aplicados por las migraciones, es necesario hacer clic en "Desinstalar" junto a una extensión en la interfaz de administración, o utilizar el comando `php flarum migrate:reset`. No se puede romper nada ejecutando `php flarum migrate` de nuevo si ya has migrado - las migraciones ejecutadas no se ejecutarán de nuevo. @@ -63,7 +63,7 @@ use Flarum\Database\Migration; use Illuminate\Database\Schema\Blueprint; return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); + $table->increments('id'); }); ``` @@ -83,8 +83,8 @@ Para añadir columnas a una tabla existente, utilice el ayudante `Migration::add ```php return Migration::addColumns('users', [ - 'email' => ['string', 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] + 'email' => ['string', 'nullable' => true], + 'discussion_count' => ['integer', 'unsigned' => true], ]); ``` @@ -174,14 +174,14 @@ use Flarum\Api\Serializer\UserSerializer; class DiscussionSerializer extends AbstractSerializer { - protected $type = 'discussions'; + protected $type = 'discussions'; - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } + protected function getDefaultAttributes($discussion) + { + return [ + 'title' => $discussion->title, + ]; + } } ``` @@ -229,12 +229,12 @@ Una vez que hayas definido tus recursos en los serializadores, necesitarás expo Siguiendo las convenciones de JSON-API, puedes añadir cinco rutas estándar para tu tipo de recurso utilizando el extensor `Routes`: ```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) +(new Extend\Routes('api')) + ->get('/tags', 'tags.index', ListTagsController::class) + ->get('/tags/{id}', 'tags.show', ShowTagController::class) + ->post('/tags', 'tags.create', CreateTagController::class) + ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) + ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class); ``` El espacio de nombres `Flarum\Api\Controller` contiene una serie de clases abstractas de controladores que puedes extender para implementar fácilmente tus recursos JSON-API. @@ -250,12 +250,12 @@ use Tobscure\JsonApi\Document; class ListTagsController extends AbstractListController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + return Tag::all(); + } } ``` @@ -271,14 +271,14 @@ use Tobscure\JsonApi\Document; class ShowTagController extends AbstractShowController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + return Tag::findOrFail($id); + } } ``` @@ -294,16 +294,16 @@ use Tobscure\JsonApi\Document; class CreateTagController extends AbstractCreateController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); + + return Tag::create([ + 'name' => Arr::get($attributes, 'name'), + ]); + } } ``` @@ -321,13 +321,13 @@ use Illuminate\Support\Arr; use Psr\Http\Message\ServerRequestInterface as Request; class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } +{ + protected function delete(Request $request) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + Tag::findOrFail($id)->delete(); + } } ``` @@ -338,7 +338,7 @@ Para incluir las relaciones al **enumerar**, **mostrar** o **crear** su recurso, ```php // Las relaciones que se incluyen por defecto. public $include = ['user']; - + // Otras relaciones que están disponibles para ser incluidas. public $optionalInclude = ['discussions']; ``` @@ -358,7 +358,7 @@ Puede permitir que el número de recursos que se **liste** sea personalizado esp ```php // El número de registros incluidos por defecto. public $limit = 20; - + // El número máximo de registros que se pueden solicitar. public $maxLimit = 50; ``` @@ -381,7 +381,7 @@ Puede permitir que se personalice el orden de clasificación de los recursos que ```php // El campo de clasificación por defecto y el orden a utilizar. public $sort = ['name' => 'asc']; - + // Los campos que están disponibles para ser ordenados. public $sortFields = ['firstName', 'lastName']; ``` @@ -393,7 +393,7 @@ $sort = $this->extractSort($request); $query = Tag::query(); foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); + $query->orderBy(snake_case($field), $order); } return $query->get(); @@ -409,19 +409,19 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Añade aquí la lógica personalizada para modificar el controlador - // antes de que se ejecuten las consultas de datos. - }) -] + (new Extend\ApiController(ListDiscussionsController::class)) + ->setSerializer(MyDiscussionSerializer::class) + ->addInclude('user') + ->addOptionalInclude('posts') + ->setLimit(20) + ->setMaxLimit(50) + ->setSort(['name' => 'asc']) + ->addSortField('firstName') + ->prepareDataQuery(function ($controller) { + // Añade aquí la lógica personalizada para modificar el controlador + // antes de que se ejecuten las consultas de datos. + }), +]; ``` El extensor `ApiController` también puede utilizarse para ajustar los datos antes de la serialización @@ -432,11 +432,10 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] + (new Extend\ApiController(ListDiscussionsController::class))->prepareDataForSerialization(function ($controller, $data, $request, $document) { + $data->load('myCustomRelation'); + }), +]; ``` ## Modelos Frontend @@ -448,9 +447,10 @@ Ahora que has expuesto tus datos en el JSON:API de Flarum, es finalmente el mome El frontend de Flarum contiene un `store` de datos local que proporciona una interfaz para interactuar con el JSON:API. Puedes recuperar recursos de la API usando el método `find`, que siempre devuelve una promesa: + ```js // GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); +app.store.find('discussions', { sort: 'createdAt' }).then(console.log); // GET /api/discussions/123 app.store.find('discussions', 123).then(console.log); @@ -478,6 +478,7 @@ Puede obtener más información sobre el almacén en nuestra [documentación de Si has añadido un nuevo tipo de recurso, tendrás que definir un nuevo modelo para él. Los modelos deben extender la clase `Model` y redefinir los atributos y relaciones del recurso: + ```js import Model from 'flarum/Model'; @@ -535,12 +536,9 @@ También puede guardar las relaciones pasándolas en una clave `relationships`. ```js user.save({ relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) + groups: [store.getById('groups', 1), store.getById('groups', 2)], + }, +}); ``` ### Creación de nuevos recursos diff --git a/docs/es/extend/distribution.md b/docs/es/extend/distribution.md index 62986fe27..df6424434 100644 --- a/docs/es/extend/distribution.md +++ b/docs/es/extend/distribution.md @@ -42,4 +42,4 @@ Lo más probable es que quieras crear una discusión en la Comunidad Flarum en l ```bash composer require vendor/package -``` \ No newline at end of file +``` diff --git a/docs/es/extend/formatting.md b/docs/es/extend/formatting.md index fb773a42d..2d0ef553c 100644 --- a/docs/es/extend/formatting.md +++ b/docs/es/extend/formatting.md @@ -16,27 +16,27 @@ use s9e\TextFormatter\Parser; use s9e\TextFormatter\Renderer; return [ - (new Extend\Formatter) - // Añadir la configuración del formateador de texto personalizado - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modificar el texto en bruto antes de analizarlo. - // Esta llamada de retorno debe devolver el texto modificado. - ->parse(function (Parser $parser, $context, $text) { - // lógica personalizada aquí - return $newText; - }) - // Modificar el XML a renderizar antes de renderizar. - // Esta llamada de retorno debe devolver el nuevo XML. - // Por ejemplo, en la extensión de menciones, esto se utiliza para - // proporcionar el nombre de usuario y el nombre para mostrar del usuario que está siendo mencionado. - // Asegúrese de que el último argumento $request sea nulo (u omitido por completo). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // lógica personalizada aquí - return $newXml; - }) + (new Extend\Formatter()) + // Añadir la configuración del formateador de texto personalizado + ->configure(function (Configurator $config) { + $config->BBCodes->addFromRepository('B'); + }) + // Modificar el texto en bruto antes de analizarlo. + // Esta llamada de retorno debe devolver el texto modificado. + ->parse(function (Parser $parser, $context, $text) { + // lógica personalizada aquí + return $newText; + }) + // Modificar el XML a renderizar antes de renderizar. + // Esta llamada de retorno debe devolver el nuevo XML. + // Por ejemplo, en la extensión de menciones, esto se utiliza para + // proporcionar el nombre de usuario y el nombre para mostrar del usuario que está siendo mencionado. + // Asegúrese de que el último argumento $request sea nulo (u omitido por completo). + ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { + // lógica personalizada aquí + return $newXml; + }), ]; ``` -Con una buena comprensión de TextFormatter, esto le permitirá lograr cualquier cosa, desde simples adiciones de etiquetas BBCode hasta tareas de formato más complejas como la extensión **Mentions** de Flarum. \ No newline at end of file +Con una buena comprensión de TextFormatter, esto le permitirá lograr cualquier cosa, desde simples adiciones de etiquetas BBCode hasta tareas de formato más complejas como la extensión **Mentions** de Flarum. diff --git a/docs/es/extend/forms.md b/docs/es/extend/forms.md index 72e95caab..700bb8213 100644 --- a/docs/es/extend/forms.md +++ b/docs/es/extend/forms.md @@ -21,10 +21,9 @@ import FieldSet from 'flarum/components/FieldSet'; import Button from 'flarum/components/Button'; import Switch from 'flarum/components/Switch'; - class FormComponent extends Component { oninit(vnode) { - this.textInput = ""; + this.textInput = ''; this.booleanInput = false; } @@ -32,14 +31,12 @@ class FormComponent extends Component { return (
- this.textInput = e.target.value}> - - this.booleanInput = val}> - + (this.textInput = e.target.value)}> + (this.booleanInput = val)}>
- ) + ); } onsubmit() { @@ -59,11 +56,10 @@ Su uso básico es: ```js import Stream from 'flarum/utils/Stream'; - -const value = Stream("hello!"); -value() === "hello!"; // verdadero -value("world!"); -value() === "world!"; // verdadero +const value = Stream('hello!'); +value() === 'hello!'; // verdadero +value('world!'); +value() === 'world!'; // verdadero ``` En los formularios de Flarum, los flujos se utilizan frecuentemente junto con el attr bidi. @@ -110,4 +106,4 @@ El sistema de peticiones de Flarum está disponible globalmente a través de `ap - Si la petición da error, mostrará una alerta que, si está en modo de depuración, puede ser pulsada para mostrar un modal de error completo. - Puede proporcionar la opción `background: false`, que ejecutará la petición de forma sincronizada. Sin embargo, esto no debería hacerse casi nunca. -Por lo demás, la API para utilizar `app.request` es la misma que la de `m.request`. \ No newline at end of file +Por lo demás, la API para utilizar `app.request` es la misma que la de `m.request`. diff --git a/docs/es/extend/frontend-pages.md b/docs/es/extend/frontend-pages.md index 1dfb97dd1..c5e46d90b 100644 --- a/docs/es/extend/frontend-pages.md +++ b/docs/es/extend/frontend-pages.md @@ -18,10 +18,9 @@ Los componentes de página funcionan como cualquier otro componente heredado. Pa ```js import Page from 'flarum/components/Page'; - export default class CustomPage extends Page { view() { - return

¡Hola!

+ return

¡Hola!

; } } ``` @@ -54,7 +53,7 @@ import DiscussionPage from 'flarum/components/DiscussionPage'; app.current.matches(DiscussionPage); // Para comprobar el tipo de página y algunos datos -app.current.matches(IndexPage, {routeName: 'following'}); +app.current.matches(IndexPage, { routeName: 'following' }); ``` ## Resolvers de rutas (avanzado) @@ -82,19 +81,22 @@ import CustomPage from './components/CustomPage'; import CustomPageResolver from './resolvers/CustomPageResolver'; // Utilizar una instancia de resolución de rutas -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; +app.routes['resolverInstance'] = { + path: '/custom/path/1', + resolver: { + onmatch: function (args) { + if (!app.session.user) return m.route.SKIP; - return CustomPage; - } -}}; + return CustomPage; + }, + }, +}; // Utilizar una clase de resolución de rutas personalizada -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage }; // Utilizar la clase de resolución por defecto (`flarum/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', component: CustomPage }; ``` ### Resolvers personalizados @@ -150,4 +152,4 @@ export default class DiscussionPageResolver extends DefaultResolver { return super.render(vnode); } } -``` \ No newline at end of file +``` diff --git a/docs/es/extend/frontend.md b/docs/es/extend/frontend.md index 5141a59d7..83b56b84e 100644 --- a/docs/es/extend/frontend.md +++ b/docs/es/extend/frontend.md @@ -6,8 +6,8 @@ Esta página describe cómo realizar cambios en la interfaz de usuario de Flarum Flarum tiene dos aplicaciones frontales separadas: -* `forum`, el lado público de su foro donde los usuarios crean discusiones y mensajes. -* `admin`, el lado privado de tu foro donde, como administrador de tu foro, configuras tu instalación de Flarum. +- `forum`, el lado público de su foro donde los usuarios crean discusiones y mensajes. +- `admin`, el lado privado de tu foro donde, como administrador de tu foro, configuras tu instalación de Flarum. Comparten el mismo código fundacional, así que una vez que sabes cómo extender uno, sabes cómo extender ambos. @@ -19,8 +19,8 @@ Antes de que podamos escribir cualquier JavaScript, necesitamos configurar un ** Para hacer esta transpilación, tienes que trabajar en un entorno capaz. No, no se trata de un entorno doméstico o de oficina, ¡puedes trabajar en el baño por lo que a mí respecta! Me refiero a las herramientas instaladas en tu sistema. Necesitarás: -* Node.js y npm ([Descarga](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) +- Node.js y npm ([Descarga](https://nodejs.org/en/download/)) +- Webpack (`npm install -g webpack`) Esto puede ser complicado porque cada sistema es diferente. Desde el sistema operativo que usas, hasta las versiones de los programas que tienes instalados, pasando por los permisos de acceso de los usuarios... ¡me dan escalofríos sólo de pensarlo! Si tienes problemas, ~~dale recuerdos~~ utiliza [Google](https://google.com) para ver si alguien se ha encontrado con el mismo error que tú y ha encontrado una solución. Si no, pide ayuda en la [Comunidad Flarum](https://discuss.flarum.org) o en el [chat de Discord](https://flarum.org/discord/). @@ -105,13 +105,13 @@ Tenga en cuenta que todo esto es simplemente una recomendación: no hay nada que El archivo más importante aquí es `index.js`: todo lo demás es simplemente extraer clases y funciones en sus propios archivos. Repasemos una estructura típica de archivos `index.js`: ```js -import {extend, override} from 'flarum/extend'; +import { extend, override } from 'flarum/extend'; // Proporcionamos nuestro código de extensión en forma de un "inicializador". // Este es un callback que se ejecutará después de que el núcleo haya arrancado. -app.initializers.add('our-extension', function(app) { +app.initializers.add('our-extension', function (app) { // Su código de extensión aquí - console.log("EXTENSION NAME is working!"); + console.log('EXTENSION NAME is working!'); }); ``` @@ -131,17 +131,17 @@ Your `forum.js` file is the JavaScript equivalent of `extend.php`. Like its PHP Deberías familiarizarte con la sintaxis adecuada para [importar módulos js](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), ya que la mayoría de las extensiones más grandes que unas pocas líneas dividirán su js en múltiples archivos. -Casi todas las extensiones de Flarum necesitarán importar *algo* de Flarum Core. +Casi todas las extensiones de Flarum necesitarán importar _algo_ de Flarum Core. Como la mayoría de las extensiones, el código fuente JS del núcleo está dividido en las carpetas `admin`, `common` y `forum`. Sin embargo, todo se exporta bajo `flarum`. Para elaborar: -* Cuando se desarrolla para `admin`, core exporta sus directorios `admin` y `common` como `flarum`. Por ejemplo, `admin/components/AdminLinkButton` está disponible como `flarum/components/AdminLinkButton`. -* Cuando se desarrolla para `forum`, core exporta sus directorios `common` y `forum` como `flarum`. Por ejemplo, `forum/states/PostStreamState` está disponible como `flarum/states/PostStreamState`. -* En ambos casos, los archivos `common` están disponibles bajo `flarum`: `common/Component` se exporta como `flarum/Component`. +- Cuando se desarrolla para `admin`, core exporta sus directorios `admin` y `common` como `flarum`. Por ejemplo, `admin/components/AdminLinkButton` está disponible como `flarum/components/AdminLinkButton`. +- Cuando se desarrolla para `forum`, core exporta sus directorios `common` y `forum` como `flarum`. Por ejemplo, `forum/states/PostStreamState` está disponible como `flarum/states/PostStreamState`. +- En ambos casos, los archivos `common` están disponibles bajo `flarum`: `common/Component` se exporta como `flarum/Component`. En algunos casos, una extensión puede querer extender el código de otra extensión de flarum. Esto sólo es posible para las extensiones que exportan explícitamente su contenido. -* `flarum/tags` y `flarum/flags` son actualmente las únicas extensiones empaquetadas que permiten extender su JS. Puedes importar sus contenidos desde `flarum/{EXT_NAME}/PATH` (por ejemplo, `flarum/tags/components/TagHero`). -* El proceso para extender cada extensión comunitaria es diferente; debe consultar la documentación de cada extensión individual. +- `flarum/tags` y `flarum/flags` son actualmente las únicas extensiones empaquetadas que permiten extender su JS. Puedes importar sus contenidos desde `flarum/{EXT_NAME}/PATH` (por ejemplo, `flarum/tags/components/TagHero`). +- El proceso para extender cada extensión comunitaria es diferente; debe consultar la documentación de cada extensión individual. ### Transpilación @@ -167,10 +167,7 @@ Para que el JavaScript de tu extensión se cargue en el frontend, necesitamos de use Flarum\Extend; -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') -]; +return [(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')]; ``` Flarum hará que cualquier cosa que haga `export` desde `forum.js` esté disponible en el objeto global `flarum.extensions['acme-hello-world']`. Por lo tanto, puede elegir exponer su propia API pública para que otras extensiones interactúen con ella. @@ -186,9 +183,7 @@ Sólo se permite un archivo JavaScript principal por extensión. Si necesitas in También puedes añadir activos CSS y [LESS](http://lesscss.org/features/) al frontend utilizando el método `css` del extensor `Frontend`: ```php - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') +(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')->css(__DIR__ . '/less/forum.less'); ``` ::: tip @@ -205,11 +200,11 @@ El quid de la cuestión es que Flarum genera elementos virtuales del DOM que son Debido a que la interfaz está construida con JavaScript, es realmente fácil engancharse y hacer cambios. Todo lo que tienes que hacer es encontrar el extensor adecuado para la parte de la interfaz que quieres cambiar, y luego añadir tu propio DOM virtual a la mezcla. -La mayoría de las partes mutables de la interfaz son en realidad *listas de elementos*. Por ejemplo: +La mayoría de las partes mutables de la interfaz son en realidad _listas de elementos_. Por ejemplo: -* Los controles que aparecen en cada entrada (Responder, Me gusta, Editar, Borrar) -* Los elementos de navegación de la barra lateral del índice (Todos los debates, Seguir, Etiquetas) -* Los elementos de la cabecera (Búsqueda, Notificaciones, Menú de usuario) +- Los controles que aparecen en cada entrada (Responder, Me gusta, Editar, Borrar) +- Los elementos de navegación de la barra lateral del índice (Todos los debates, Seguir, Etiquetas) +- Los elementos de la cabecera (Búsqueda, Notificaciones, Menú de usuario) Cada elemento de estas listas recibe un **nombre** para que puedas añadir, eliminar y reorganizar los elementos fácilmente. Simplemente encuentre el componente apropiado para la parte de la interfaz que desea cambiar, y monkey-patch sus métodos para modificar el contenido de la lista de elementos. Por ejemplo, para añadir un enlace a Google en la cabecera: @@ -217,7 +212,7 @@ Cada elemento de estas listas recibe un **nombre** para que puedas añadir, elim import { extend } from 'flarum/extend'; import HeaderPrimary from 'flarum/components/HeaderPrimary'; -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add('google', Google); }); ``` @@ -245,13 +240,13 @@ DiscussionPage Deberías familiarizarte con la [API de componentes de Mithril](https://mithril.js.org/components.html) y el [sistema de redraw](https://mithril.js.org/autoredraw.html). Flarum envuelve los componentes en la clase `flarum/Component`, que extiende la [clase componentes](https://mithril.js.org/components.html#classes) de Mithril. Proporciona las siguientes ventajas: -* Los atributos pasados a los componentes están disponibles en toda la clase a través de `this.attrs`. -* El método estático `initAttrs` muta `this.attrs` antes de establecerlos, y te permite establecer valores por defecto o modificarlos de alguna manera antes de usarlos en tu clase. Ten en cuenta que esto no afecta al `vnode.attrs` inicial. -* El método `$` devuelve un objeto jQuery para el elemento DOM raíz del componente. Opcionalmente se puede pasar un selector para obtener los hijos del DOM. -* el método estático `component` puede ser utilizado como una alternativa a JSX y al hyperscript `m`. Los siguientes son equivalentes: - * `m(CustomComponentClass, attrs, children)` - * `CustomComponentClass.component(attrs, children)` - * `{children}` +- Los atributos pasados a los componentes están disponibles en toda la clase a través de `this.attrs`. +- El método estático `initAttrs` muta `this.attrs` antes de establecerlos, y te permite establecer valores por defecto o modificarlos de alguna manera antes de usarlos en tu clase. Ten en cuenta que esto no afecta al `vnode.attrs` inicial. +- El método `$` devuelve un objeto jQuery para el elemento DOM raíz del componente. Opcionalmente se puede pasar un selector para obtener los hijos del DOM. +- el método estático `component` puede ser utilizado como una alternativa a JSX y al hyperscript `m`. Los siguientes son equivalentes: + - `m(CustomComponentClass, attrs, children)` + - `CustomComponentClass.component(attrs, children)` + - `{children}` Sin embargo, las clases de componentes que extienden `Component` deben llamar a `super` cuando utilizan los métodos `oninit`, `oncreate` y `onbeforeupdate`. @@ -274,9 +269,7 @@ class Counter extends Component { return (
Count: {this.count} - +
); } @@ -309,14 +302,14 @@ Casi todas las extensiones del frontend utilizan [monkey patching](https://en.wi ```jsx // Esto añade un atributo al global `app`. -app.googleUrl = "https://google.com"; +app.googleUrl = 'https://google.com'; // Esto reemplaza la salida de la página de discusión con "Hello World" import DiscussionPage from 'flarum/components/DiscussionPage'; -DiscussionPage.prototype.view = function() { +DiscussionPage.prototype.view = function () { return

Hello World

; -} +}; ``` convertirá las páginas de discusión de Flarum en anuncios de "Hola Mundo". ¡Qué creativo! @@ -344,7 +337,7 @@ import CustomComponentClass from './components/CustomComponentClass'; // Aquí, añadimos un elemento a la lista de elementos devuelta. Estamos utilizando un componente personalizado // como se ha comentado anteriormente. También hemos especificado una prioridad como tercer argumento, // que se utilizará para ordenar estos elementos. Ten en cuenta que no necesitamos devolver nada. -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add( 'google', @@ -357,7 +350,7 @@ extend(HeaderPrimary.prototype, 'items', function(items) { // Aquí, utilizamos condicionalmente la salida original de un método, // o creamos nuestro propio ItemList, y luego añadimos un elemento a él. // Ten en cuenta que DEBEMOS devolver nuestra salida personalizada. -override(HeaderPrimary.prototype, 'items', function(original) { +override(HeaderPrimary.prototype, 'items', function (original) { let items; if (someArbitraryCondition) { @@ -375,9 +368,9 @@ override(HeaderPrimary.prototype, 'items', function(original) { Dado que todos los componentes y utilidades de Flarum están representados por clases, `extend`, `override`, y el típico JS significa que podemos enganchar o reemplazar cualquier método en cualquier parte de Flarum. Algunos usos potenciales "avanzados" incluyen: -* Extender o anular `view` para cambiar (o redefinir completamente) la estructura html de los componentes de Flarum. Esto abre a Flarum a una tematización ilimitada -* Engancharse a los métodos de los componentes Mithril para añadir escuchas de eventos JS, o redefinir la lógica del negocio. +- Extender o anular `view` para cambiar (o redefinir completamente) la estructura html de los componentes de Flarum. Esto abre a Flarum a una tematización ilimitada +- Engancharse a los métodos de los componentes Mithril para añadir escuchas de eventos JS, o redefinir la lógica del negocio. ### Utilidades de Flarum -Flarum define (y proporciona) bastantes funciones de ayuda y utilidades, que puede querer utilizar en sus extensiones. La mejor manera de conocerlas es a través de [el código fuente](https://github.com/flarum/core/tree/master/js) o [nuestra documentación de la API de javascript](https://api.docs.flarum.org/js/). \ No newline at end of file +Flarum define (y proporciona) bastantes funciones de ayuda y utilidades, que puede querer utilizar en sus extensiones. La mejor manera de conocerlas es a través de [el código fuente](https://github.com/flarum/core/tree/master/js) o [nuestra documentación de la API de javascript](https://api.docs.flarum.org/js/). diff --git a/docs/es/extend/i18n.md b/docs/es/extend/i18n.md index 789d9a2f2..aa3e1387e 100644 --- a/docs/es/extend/i18n.md +++ b/docs/es/extend/i18n.md @@ -48,15 +48,16 @@ Se pueden utilizar claves adicionales para dividir el espacio de nombres de la e Cada clave de espaciado de nombres debe ir seguida de dos puntos. Las claves deben anidarse según el formato de esquema de YAML, añadiendo dos espacios de sangría por cada nivel de la jerarquía. Poniendo todo esto junto, el archivo de configuración regional para el [tutorial de inicio rápido](start.md) podría ser algo así: ```yaml -acme-hello-world: # Namespacing for the extension; unindented. - alert: # Namespacing for alerts; indented 2 spaces. - hello_text: "Hello, world!" # Identifier/translation; indented 4 spaces. +acme-hello-world: # Namespacing for the extension; unindented. + alert: # Namespacing for alerts; indented 2 spaces. + hello_text: 'Hello, world!' # Identifier/translation; indented 4 spaces. ``` Una vez que tengas esta información, puedes formar la **clave de traducción completa** que utilizarás para acceder a una traducción enumerando sus claves en orden desde el espacio de nombres de extensión hasta un identificador, con puntos como delimitadores. Por ejemplo, la clave de traducción completa para la traducción "Hello, world!" sería: ```javascript -'acme-hello-world.alert.hello_text' +'acme-hello-world.alert.hello_text'; + ``` Eso es todo lo que necesitas saber sobre la mecánica de la creación de claves. Sin embargo, ten en cuenta que hay un formato estándar que los desarrolladores deben seguir al crear recursos lingüísticos para Flarum. Las reglas para [traducciones de namespacing](#namespacing-translations) y [naming ID keys](#naming-id-keys) se pueden encontrar en el Apéndice A. @@ -75,7 +76,7 @@ Habrás notado que sólo una de las dos traducciones de ejemplo de la sección a Dado que Flarum utiliza corchetes y paréntesis angulares para denotar marcadores de posición para [variables] (#including-variables) y [etiquetas HTML](#html-tags), respectivamente, no hace falta decir que cualquier traducción que incluya dichos marcadores de posición también deberá ir entre comillas dobles. -Además, debe utilizar **comillas simples** para encerrar cualquier traducción que incluya uno o más caracteres de comillas dobles (`"`) o barras invertidas (`\`). Esta regla tiene prioridad. Así que si una traducción incluyera tanto comillas dobles como uno o más caracteres de la lista anterior — como lo hace [este ejemplo](#incluyendo-variables), en el que un marcador de posición de una variable está delimitado por comillas — tendría que encerrarlo entre *comillas simples*. +Además, debe utilizar **comillas simples** para encerrar cualquier traducción que incluya uno o más caracteres de comillas dobles (`"`) o barras invertidas (`\`). Esta regla tiene prioridad. Así que si una traducción incluyera tanto comillas dobles como uno o más caracteres de la lista anterior — como lo hace [este ejemplo](#incluyendo-variables), en el que un marcador de posición de una variable está delimitado por comillas — tendría que encerrarlo entre _comillas simples_. ::: @@ -91,6 +92,7 @@ literal_block_text: | Las comillas son innecesarias, incluso cuando el bloque contiene caracteres especiales. ``` + El bloque literal termina con la última línea con una sangría de al menos dos espacios más que la clave de identificación. Las comillas no son necesarias porque el bloque está efectivamente delimitado por estos dos espacios extra de sangría. Los recursos lingüísticos básicos de Flarum emplean bloques literales principalmente para el contenido del cuerpo del correo electrónico. @@ -102,13 +104,13 @@ No es raro utilizar el mismo trozo de texto en más de un lugar o contexto. Supo - Como un **botón** en el que los usuarios pueden hacer clic cuando quieren editar algunas cosas - Como el **título** de un cuadro de diálogo que se muestra cuando los usuarios hacen clic en ese botón -Tu instinto podría ser el de añadir una única traducción — llamémosla "`edit_stuff`" — y utilizar esa clave de identificación dos veces en tu código. Este enfoque es eficiente, pero carece de flexibilidad: en algunos idiomas, puede que no sea posible utilizar la misma frase tanto para el botón como para el título del diálogo. Una forma mejor sería definir *dos* claves para su uso en el código, y luego establecer que ambas hagan referencia a la misma traducción, de esta manera: +Tu instinto podría ser el de añadir una única traducción — llamémosla "`edit_stuff`" — y utilizar esa clave de identificación dos veces en tu código. Este enfoque es eficiente, pero carece de flexibilidad: en algunos idiomas, puede que no sea posible utilizar la misma frase tanto para el botón como para el título del diálogo. Una forma mejor sería definir _dos_ claves para su uso en el código, y luego establecer que ambas hagan referencia a la misma traducción, de esta manera: ```yaml -edit_stuff_button: => edit_stuff # Se utiliza en el código que crea el botón. -edit_stuff_title: => edit_stuff # Se utiliza en el código que crea el diálogo. +edit_stuff_button: => edit_stuff # Se utiliza en el código que crea el botón. +edit_stuff_title: => edit_stuff # Se utiliza en el código que crea el diálogo. -edit_stuff: Edit Stuff # No se utiliza en el código. +edit_stuff: Edit Stuff # No se utiliza en el código. ``` Puede establecer que una clave haga referencia a otra sustituyendo su traducción por un signo de igualdad (`=`), un signo de mayor que (`>`) y un espacio, seguido de la clave de traducción completa a la que se hará referencia. Al instalar la extensión, el compilador de Flarum resolverá estas referencias para crear un conjunto completo de traducciones que pueda utilizar. @@ -120,7 +122,7 @@ Hay más cosas que decir sobre las referencias; para empezar, ¡hemos ignorado t Una vez que hayas añadido una traducción a tu archivo de configuración regional, con el espaciado de nombres y las claves de identificación apropiadas, puedes utilizar el método `app.translator.trans()` para hacer referencia a esa traducción en tu código. Por ejemplo, el archivo `js/forum/src/index.js` para el [tutorial de inicio rápido](start.md) podría tener este aspecto: ```javascript -app.initializers.add('acme-hello-world', function() { +app.initializers.add('acme-hello-world', function () { alert(app.translator.trans('acme-hello-world.alert.hello_text')); }); ``` @@ -132,11 +134,13 @@ Esto muestra el método de traducción básico, sin campanas ni silbidos. A cont Puedes incluir variables en las traducciones. Como ejemplo, veamos el código que crea el primer elemento del [desplegable de resultados de búsqueda](https://github.com/flarum/core/blob/master/js/forum/src/components/DiscussionsSearchSource.js) de Flarum. Este botón cita la consulta de búsqueda introducida por el usuario — información que se pasa al traductor junto con la clave de traducción, como parámetro adicional: ```jsx harmony -{LinkButton.component({ - icon: 'search', - children: app.translator.trans('all_discussions_button', {query}), - href: app.route('index', {q: query}) -})} +{ + LinkButton.component({ + icon: 'search', + children: app.translator.trans('all_discussions_button', { query }), + href: app.route('index', { q: query }), + }); +} ``` Un marcador de posición coincidente en la traducción permite al traductor saber dónde debe insertar la variable: @@ -156,7 +160,7 @@ Comienza añadiendo una clave al argumento de los parámetros para cada elemento ```jsx harmony
{app.translator.trans('icon_text', { - a: + a: , })}
``` @@ -165,7 +169,7 @@ Tenga en cuenta que cada parámetro se define utilizando una sola etiqueta HTML, Puede ver que no se pasan todas las etiquetas como argumento, sólo las que tienen atributos. ```yaml -icon_text: "Introduce el nombre de cualquier clase de icono FontAwesome, sin el prefijo fa-." +icon_text: 'Introduce el nombre de cualquier clase de icono FontAwesome, sin el prefijo fa-.' ``` Por supuesto, puedes dar a un parámetro el nombre que quieras — ¡podrías usar `` y `` para encerrar el texto de tu enlace si realmente quisieras! Pero le recomendamos que se ciña lo más posible a las etiquetas HTML que se están representando, para que sus localizadores puedan entender lo que está pasando. @@ -178,11 +182,7 @@ En ocasiones, puede ser necesario proporcionar versiones alternativas de una tra ```js const remaining = this.minPrimary - primaryCount; -return app.translator.transChoice( - 'choose_primary_placeholder', - remaining, - { count: remaining } -); +return app.translator.transChoice('choose_primary_placeholder', remaining, { count: remaining }); ``` Este ejemplo es del modal [Choose Tags](https://github.com/flarum/tags/blob/master/js/forum/src/components/TagDiscussionModal.js) de la extensión Tags, donde se indica al usuario cuántas etiquetas primarias más puede seleccionar. Nótese que la variable `remaining` se pasa al traductor **dos veces**. Primero, aparece como ella misma, para condicionar la pluralización de la palabra "tags". Luego aparece de nuevo como el valor del parámetro `count`, que el traductor puede utilizar para insertar ese valor en la traducción. @@ -190,7 +190,7 @@ Este ejemplo es del modal [Choose Tags](https://github.com/flarum/tags/blob/mast Cuando se llama al método `app.translator.transChoice()`, el traductor explora la traducción en busca de una variante que coincida con el tipo de pluralización requerido por el valor de la variable. Estas variantes tienen que ser listadas en serie — la forma singular primero, luego las formas plurales en orden de magnitud creciente — y separadas usando el carácter de línea vertical (`|`). Esta es la traducción al inglés del código anterior: ```yaml -choose_primary_placeholder: "Choose a primary tag|Choose {count} primary tags" +choose_primary_placeholder: 'Choose a primary tag|Choose {count} primary tags' ``` Por supuesto, el inglés sólo tiene dos variantes: singular o plural. Tendrá que proporcionar variantes adicionales cuando cree traducciones para un idioma que tenga más de una forma plural. Si necesita información detallada sobre el número de variantes necesarias para un idioma — o el orden en el que deben aparecer — puede consultar directamente las [reglas de pluralización](https://github.com/symfony/symfony/blob/3.3/src/Symfony/Component/Translation/PluralizationRules.php) que utiliza Flarum para asignar la variable a las formas plurales. @@ -230,43 +230,44 @@ Se espera que los desarrolladores que deseen contribuir al desarrollo de Flarum ### Namespacing en las traducciones -Todas las traducciones deben organizarse en categorías, utilizando claves de espaciado de nombres dispuestas en hasta **tres** niveles. Cada nivel proporciona a los localizadores una información importante sobre *donde se utiliza la traducción:* +Todas las traducciones deben organizarse en categorías, utilizando claves de espaciado de nombres dispuestas en hasta **tres** niveles. Cada nivel proporciona a los localizadores una información importante sobre _donde se utiliza la traducción:_ -#### ➡ La clave de nivel superior indica *qué componente utiliza la traducción*. +#### ➡ La clave de nivel superior indica _qué componente utiliza la traducción_. El espacio de nombres para las claves de traducción utilizadas en los componentes oficiales de Flarum, incluidas las extensiones incluidas, debe coincidir con el nombre del archivo de configuración regional del paquete de idiomas para el componente en cuestión. Los espacios de nombres para los componentes de Flarum que no son extensiones se fijan como se muestra a continuación: ```yaml -core: # Traducciones utilizadas por el núcleo de Flarum -validation: # Traducciones utilizadas por el validador de Laravel +core: # Traducciones utilizadas por el núcleo de Flarum +validation: # Traducciones utilizadas por el validador de Laravel ``` Las claves de traducción usadas en una extensión, incluyendo cualquier extensión de terceros, deben tener un espacio de nombre usando el nombre de la extensión en formato `vendor-package`, donde los prefijos `flarum-` y `flarum-ext-` se eliminan del `package` (por ejemplo, `flarum-tags` para la extensión Tags y `foo-bar` para una extensión `foo/flarum-ext-bar`). Sólo debe haber **un** prefijo de primer nivel en cualquier archivo de configuración regional; debe ser la primera línea del archivo de configuración regional. -#### ➡ La clave de segundo nivel indica *qué interfaz utiliza la traducción*. +#### ➡ La clave de segundo nivel indica _qué interfaz utiliza la traducción_. Como Flarum no tiene muchas interfaces, hemos creado una pequeña lista de claves de segundo nivel para que puedas elegir. Hemos incluido las más usadas en la plantilla del archivo locale creado con el esqueleto de la extensión. A continuación encontrará la lista completa, con explicaciones: ```yaml -admin: # Translations used by the admin interface. -forum: # Translations used by the forum user interface. -lib: # Translations used by either of the above. -views: # Translations used outside the normal JS client. -api: # Translations used in messages output by the API. -email: # Translations used in emails sent by Flarum. +admin: # Translations used by the admin interface. +forum: # Translations used by the forum user interface. +lib: # Translations used by either of the above. +views: # Translations used outside the normal JS client. +api: # Translations used in messages output by the API. +email: # Translations used in emails sent by Flarum. ``` + Las primeras cuatro claves corresponden aproximadamente a los directorios que contienen el código donde se utilizarán las traducciones en ese espacio de nombres. (La mayoría de sus claves probablemente irán en `admin` o `forum`.) Las dos claves restantes son un poco diferentes: el espacio de nombres `api` es para las traducciones utilizadas en los mensajes emitidos por la API, mientras que el espacio de nombres `email` contiene los recursos para todos los correos electrónicos enviados por el foro. ```yaml -ref: # Translations referenced by more than one key. -group: # Translations used as default group names. +ref: # Translations referenced by more than one key. +group: # Translations used as default group names. ``` Estas dos claves no corresponden a interfaces; son para traducciones que requieren un manejo especial. Explicaremos cómo utilizar el espacio de nombres `ref` cuando hablemos de [reutilizar traducciones](#reusing-translations). El espacio de nombres `group` contiene los nombres de los grupos por defecto, que son traducidos por el servidor en lugar de en el front-end. -#### ➡ La clave de tercer nivel indica *qué parte de la interfaz de usuario utiliza la traducción*. +#### ➡ La clave de tercer nivel indica _qué parte de la interfaz de usuario utiliza la traducción_. Las claves de este nivel no están definidas de forma tan rígida. Su propósito principal es dividir la interfaz de usuario en partes manejables, de modo que los localizadores puedan encontrar las traducciones y ver por sí mismos cómo las utiliza el software. (Las claves de tercer nivel no se utilizan en los espacios de nombres `ref` y `group`, que no necesitan ser cortados). @@ -280,42 +281,42 @@ Como regla general, las claves de tercer nivel deben ser cortas — no más Al igual que las claves de espacio de nombres de tercer nivel, las claves de identificador deben expresarse en `snake_case`. Las claves de identificador deben estar organizadas en orden alfabético dentro de cada espacio de nombres, para que sean fáciles de encontrar para los desarrolladores. (¡Hay una excepción a esta regla! Las claves de identificación en el espacio de nombres `email` deben ser listadas tal y como aparecen en su cliente de correo: `subject` primero, luego `body`). -La clave de identificación típica consta de dos partes: una **raíz** y un **sufijo**; cada una de las cuales puede omitirse en determinadas circunstancias. Al igual que las claves de espaciado de nombres indican a los localizadores *dónde se utiliza la traducción*, cada parte de la clave ID proporciona un poco más de información sobre la traducción: +La clave de identificación típica consta de dos partes: una **raíz** y un **sufijo**; cada una de las cuales puede omitirse en determinadas circunstancias. Al igual que las claves de espaciado de nombres indican a los localizadores _dónde se utiliza la traducción_, cada parte de la clave ID proporciona un poco más de información sobre la traducción: -#### ➡ El sufijo indica *cómo se utiliza la traducción*. +#### ➡ El sufijo indica _cómo se utiliza la traducción_. Empezaremos con el sufijo porque es la parte más importante del nombre de la clave. Indica a los localizadores qué tipo de objeto deben buscar cuando tratan de encontrar la traducción en la interfaz. Por ejemplo, los sufijos de la siguiente lista se utilizan para objetos de la interfaz gráfica de usuario más o menos relacionados con las operaciones del usuario: ```yaml -_button: # Used for buttons (including dropdown menu items). -_link: # Used for links that are not shown graphically as buttons. -_heading: # Used for headings in tables and lists. -_label: # Used for the names of data fields, checkbox settings, etc. -_placeholder: # Used for placeholder text displayed in fields. +_button: # Used for buttons (including dropdown menu items). +_link: # Used for links that are not shown graphically as buttons. +_heading: # Used for headings in tables and lists. +_label: # Used for the names of data fields, checkbox settings, etc. +_placeholder: # Used for placeholder text displayed in fields. ``` Estos sufijos se utilizan para elementos de texto informativos o descriptivos: ```yaml -_confirmation: # Used for messages displayed to confirm an operation. -_message: # Used for messages that show the result of an operation. -_text: # Used for any text that is not a message, title, or tooltip. -_title: # Used for text displayed as the title of a page or modal. -_tooltip: # Used for text displayed when the user hovers over something. +_confirmation: # Used for messages displayed to confirm an operation. +_message: # Used for messages that show the result of an operation. +_text: # Used for any text that is not a message, title, or tooltip. +_title: # Used for text displayed as the title of a page or modal. +_tooltip: # Used for text displayed when the user hovers over something. ``` Y hay dos sufijos que se utilizan sólo en el espacio de nombres `email`: ```yaml -_body: # Used for the content of the email message. -_subject: # Used for the subject line of the email message. +_body: # Used for the content of the email message. +_subject: # Used for the subject line of the email message. ``` Lo anterior es una lista completa de los sufijos disponibles para su uso en los archivos de localización. Deberías tener cuidado de usarlos de forma consistente, ya que esto facilitará la vida de los localizadores. Si crees que falta algo en la lista, por favor, presenta un problema a los desarrolladores; consideraremos la posibilidad de añadir un nuevo sufijo si la situación lo justifica. -Los sufijos deben ser **omitidos** de las claves de identificación para [traducciones reutilizadas](#reusing-translations) en el espacio de nombres `ref:`. Esto se debe a que no se puede asegurar que estas traducciones se vayan a utilizar siempre en el mismo contexto. Añadir un nuevo contexto significaría cambiar el nombre de la clave *en todos los lugares a los que se hace referencia* … así que es mejor mantener estas traducciones genéricas. +Los sufijos deben ser **omitidos** de las claves de identificación para [traducciones reutilizadas](#reusing-translations) en el espacio de nombres `ref:`. Esto se debe a que no se puede asegurar que estas traducciones se vayan a utilizar siempre en el mismo contexto. Añadir un nuevo contexto significaría cambiar el nombre de la clave _en todos los lugares a los que se hace referencia_ … así que es mejor mantener estas traducciones genéricas. -#### ➡ La raíz indica *lo que dice la traducción*. +#### ➡ La raíz indica _lo que dice la traducción_. En otras palabras, debe ser un breve resumen del contenido de la traducción. Si la traducción es una frase muy corta, de no más de unas pocas palabras, puede utilizarla textualmente (en `snake_case`, por supuesto). En cambio, si es muy larga, hay que intentar reducirla al máximo. @@ -331,7 +332,6 @@ Las [referencias a claves](#key-references) únicas de Flarum cumplen la misma f ```yaml core: - forum: header: log_in_link: => core.ref.log_in @@ -352,14 +352,13 @@ El espacio de nombres `ref` también facilita el seguimiento de la reutilizació ```yaml core: - forum: header: log_in_link: => Log In log_in: - submit_button: => core.forum.header.log_in_link # No hay que hacer referencia a las claves - title: => core.forum.header.log_in_link # que no están en "ref" + submit_button: => core.forum.header.log_in_link # No hay que hacer referencia a las claves + title: => core.forum.header.log_in_link # que no están en "ref" ``` Sería muy fácil cambiar la traducción del enlace de la cabecera sin darte cuenta de que también estás cambiando cosas en el modal de Log In — ¡por no hablar de las extensiones que también podrían estar haciendo referencia a esa clave! Este tipo de cosas será menos probable que ocurran si mantiene sus traducciones reutilizadas en el espacio de nombres `ref`. @@ -400,7 +399,7 @@ Esto probablemente no hace falta decirlo. Al fin y al cabo, si vas a tomarte la Incluso pequeños fragmentos de texto pueden causar problemas a los localizadores. Una coma por aquí, dos puntos por allá … tal vez un par de paréntesis insertados para hacer la página más legible: estas cosas pueden causar y causan problemas a los localizadores. Al fin y al cabo, no todos los idiomas utilizan los mismos glifos para estas cosas. Un solo espacio codificado puede ser un problema para alguien que intente traducir la interfaz a un idioma que no utilice espacios para separar las palabras. -En general, cualquier texto mostrado que no sea suministrado por una variable o el resultado de un cálculo *debe* ser incluido en los archivos de configuración regional. Esto es fácil de decir, pero hacerlo realmente requiere un poco de perseverancia. +En general, cualquier texto mostrado que no sea suministrado por una variable o el resultado de un cálculo _debe_ ser incluido en los archivos de configuración regional. Esto es fácil de decir, pero hacerlo realmente requiere un poco de perseverancia. ### ¡Evite la sintaxis codificada! @@ -456,16 +455,16 @@ En inglés, el tiempo pasado simple no se ve afectado por la pluralización. Com Este es el tipo de situación en la que la tarea rutinaria de la abstracción lingüística requiere un poco más de cuidado y atención. Recuerda preguntarte si cada sustantivo (o pronombre) puede pluralizarse. Si puede, asegúrese de utilizar el método `app.translator.transChoice()` y pasar una variable apropiada al traductor. Por supuesto, no es necesario proporcionar ninguna variante de traducción en los recursos en inglés … ```yaml -mentioned_by_text: "{users} replied to this." # Se puede pluralizar... -mentioned_by_self_text: "{users} replied to this." # Se puede pluralizar... +mentioned_by_text: '{users} replied to this.' # Se puede pluralizar... +mentioned_by_self_text: '{users} replied to this.' # Se puede pluralizar... ``` … pero sería una muy buena idea añadir un comentario después de las traducciones en cuestión, para alertar a los localizadores del hecho de que el código soportará la adición de tales variantes, en caso de que sean necesarias. ### Reutilizar las traducciones, ¡no las claves! -Si las claves de espaciado de nombres se combinan para formar una especificación completa de dónde se utiliza una traducción, y la clave de identificación especifica exactamente cómo se utiliza la traducción y lo que dice, entonces es lógico que cada clave de traducción completa debe ser única. En otras palabras: *nunca debe utilizarse la misma clave más de una vez*. +Si las claves de espaciado de nombres se combinan para formar una especificación completa de dónde se utiliza una traducción, y la clave de identificación especifica exactamente cómo se utiliza la traducción y lo que dice, entonces es lógico que cada clave de traducción completa debe ser única. En otras palabras: _nunca debe utilizarse la misma clave más de una vez_. Aunque esto pueda parecer ineficiente, hay una buena razón para hacer las cosas de esta manera: es la forma más fácil de garantizar que los localizadores tengan la flexibilidad que necesitan. Si reutiliza claves en su código, acabará encontrando un obstáculo. Tus localizadores serán incapaces de encontrar una única expresión que se ajuste a todos los contextos en los que hayas utilizado alguna clave u otra … y entonces empezarán a molestarte para que arregles tu código. -Afortunadamente, puedes evitar muchos de estos problemas si simplemente tienes cuidado de [namespace translations](#namespacing-translations) correctamente, [name your ID keys](#naming-identifier-keys) apropiadamente, y siempre [reuse translations](#reusing-translations) en lugar de claves. Aunque pueda parecer una molestia, a la larga, el [formato estándar](#appendix-a:-standard-key-format) hará que la localización sea mucho más fácil para *todos*. \ No newline at end of file +Afortunadamente, puedes evitar muchos de estos problemas si simplemente tienes cuidado de [namespace translations](#namespacing-translations) correctamente, [name your ID keys](#naming-identifier-keys) apropiadamente, y siempre [reuse translations](#reusing-translations) en lugar de claves. Aunque pueda parecer una molestia, a la larga, el [formato estándar](#appendix-a:-standard-key-format) hará que la localización sea mucho más fácil para _todos_. diff --git a/docs/es/extend/interactive-components.md b/docs/es/extend/interactive-components.md index b28869ef0..65292dd3b 100644 --- a/docs/es/extend/interactive-components.md +++ b/docs/es/extend/interactive-components.md @@ -85,4 +85,4 @@ Esto se hace dividiendo el código para cada uso en una subclase de `flarum/comp El editor actual es otro componente, [`flarum/components/TextEditor`](https://api.docs.flarum.org/js/master/class/src/forum/components/texteditor.js~texteditor). Se puede acceder a su estado mediante una instancia de [`SuperTextarea`](https://api.docs.flarum.org/js/master/class/src/common/utils/supertextarea.js~supertextarea). -Está disponible globalmente para el compositor actual a través de `app.composer.editor`. Tiene una variedad de [métodos públicos](https://api.docs.flarum.org/js/master/class/src/common/utils/supertextarea.js~supertextarea) que permiten a las extensiones insertar y modificar mediante programación el contenido actual, las selecciones y la posición del cursor del editor de texto del compositor activo. \ No newline at end of file +Está disponible globalmente para el compositor actual a través de `app.composer.editor`. Tiene una variedad de [métodos públicos](https://api.docs.flarum.org/js/master/class/src/common/utils/supertextarea.js~supertextarea) que permiten a las extensiones insertar y modificar mediante programación el contenido actual, las selecciones y la posición del cursor del editor de texto del compositor activo. diff --git a/docs/es/extend/mail.md b/docs/es/extend/mail.md index a11f5c866..af851b8e3 100644 --- a/docs/es/extend/mail.md +++ b/docs/es/extend/mail.md @@ -1,6 +1,6 @@ # Correo -Además de los [controladores por defecto en el núcleo](../mail.md), Flarum permite añadir nuevos controladores de correo a través de extensores. Para crear su propio controlador de correo, necesitará crear una clase que implemente ``Flarum\Mail\DriverInterface``. Flarum se encarga de proporcionar la configuración del correo electrónico: sólo tiene que declarar la configuración que necesita, y los valores por defecto, en `availableSettings`. +Además de los [controladores por defecto en el núcleo](../mail.md), Flarum permite añadir nuevos controladores de correo a través de extensores. Para crear su propio controlador de correo, necesitará crear una clase que implemente `Flarum\Mail\DriverInterface`. Flarum se encarga de proporcionar la configuración del correo electrónico: sólo tiene que declarar la configuración que necesita, y los valores por defecto, en `availableSettings`. Por ejemplo: @@ -13,35 +13,37 @@ use Swift_Transport; class MailgunDriver implements DriverInterface { - public function availableSettings(): array - { - return [ - 'setting_one' => '', - 'setting_two' => 'defaultValue', - 'dropdown_setting' => [ - 'option_one_val' => 'Option One Display', - 'option_two_val' => 'Option Two Display', - ], - ]; - } - - public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag - { - $validator->make($settings->all(), [ - 'setting_one' => 'required', - 'setting_two' => 'nullable|integer', - ])->errors(); - } - - public function canSend(): bool - { - return true; - } - - public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport - { - // Devuelve un transporte de correo que implementa Swift Transport - } + public function availableSettings(): array + { + return [ + 'setting_one' => '', + 'setting_two' => 'defaultValue', + 'dropdown_setting' => [ + 'option_one_val' => 'Option One Display', + 'option_two_val' => 'Option Two Display', + ], + ]; + } + + public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag + { + $validator + ->make($settings->all(), [ + 'setting_one' => 'required', + 'setting_two' => 'nullable|integer', + ]) + ->errors(); + } + + public function canSend(): bool + { + return true; + } + + public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport + { + // Devuelve un transporte de correo que implementa Swift Transport + } } ``` @@ -53,7 +55,7 @@ use YourNamespace\Mail\CustomDriver; return [ // Otros extensores - (new Extend\Mail())->driver(CustomDriver::class) + (new Extend\Mail())->driver(CustomDriver::class), // Otros extensores ]; -``` \ No newline at end of file +``` diff --git a/docs/es/extend/middleware.md b/docs/es/extend/middleware.md index 65e365d2b..4a5b93117 100644 --- a/docs/es/extend/middleware.md +++ b/docs/es/extend/middleware.md @@ -32,22 +32,22 @@ use Flarum\Extend; // use Flarum\Http\Middleware\CheckCsrfToken; return [ - // Add middleware to forum frontend - (new Extend\Middleware('forum'))->add(YourMiddleware::class), - // Admin frontend - (new Extend\Middleware('admin'))->add(YourMiddleware::class), - // API frontend - (new Extend\Middleware('api'))->add(YourMiddleware::class), - - (new Extend\Middleware('frontend')) - // remove a middleware (e.g. remove CSRF token check 😱) - ->remove(CheckCsrfToken::class) - // insert before another middleware (e.g. before a CSRF token check) - ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) - // insert after another middleware (e.g. after a CSRF token check) - ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) - // replace a middleware (e.g. replace the CSRF check with your own implementation) - ->replace(CheckCsrfToken::class, YourMiddleware::class) + // Add middleware to forum frontend + (new Extend\Middleware('forum'))->add(YourMiddleware::class), + // Admin frontend + (new Extend\Middleware('admin'))->add(YourMiddleware::class), + // API frontend + (new Extend\Middleware('api'))->add(YourMiddleware::class), + + (new Extend\Middleware('frontend')) + // remove a middleware (e.g. remove CSRF token check 😱) + ->remove(CheckCsrfToken::class) + // insert before another middleware (e.g. before a CSRF token check) + ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) + // insert after another middleware (e.g. after a CSRF token check) + ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) + // replace a middleware (e.g. replace the CSRF check with your own implementation) + ->replace(CheckCsrfToken::class, YourMiddleware::class), ]; ``` @@ -114,7 +114,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface ]); $document = new Document(); $document->setErrors($error->getErrors()); - + return new JsonApiResponse($document, $error->getStatus()); } @@ -152,4 +152,4 @@ Una vez que todo está dicho y hecho y no estás devolviendo una respuesta por t return $handler->handle($request); ``` -¡Genial! Ya hemos terminado. ¡Ahora puedes hacer el middleware de tus sueños! \ No newline at end of file +¡Genial! Ya hemos terminado. ¡Ahora puedes hacer el middleware de tus sueños! diff --git a/docs/es/extend/notifications.md b/docs/es/extend/notifications.md index 1e77e371c..29c0d4a98 100644 --- a/docs/es/extend/notifications.md +++ b/docs/es/extend/notifications.md @@ -8,11 +8,11 @@ Flarum incluye un potente sistema de notificaciones para alertar a los usuarios Para definir un tipo de notificación, tendrá que crear una nueva clase que implemente `Flarum\Notification\Blueprint\BlueprintInterface`. Esta clase definirá el contenido y el comportamiento de su notificación a través de los siguientes métodos: -* `getSubject()` El modelo sobre el que trata la notificación (por ejemplo, el post que le ha gustado). -* `getSender()` El modelo del usuario que ha activado la notificación. -* `getData()` Cualquier otro dato que desee incluir para el acceso en el frontend (por ejemplo, el título de la antigua discusión cuando se renombra). -* `getType()` Aquí es donde se nombra la notificación, esto será importante para los pasos posteriores. -* `getSubjectModal()`: Especifica el tipo de modelo que es el sujeto (desde `getSubject`). +- `getSubject()` El modelo sobre el que trata la notificación (por ejemplo, el post que le ha gustado). +- `getSender()` El modelo del usuario que ha activado la notificación. +- `getData()` Cualquier otro dato que desee incluir para el acceso en el frontend (por ejemplo, el título de la antigua discusión cuando se renombra). +- `getType()` Aquí es donde se nombra la notificación, esto será importante para los pasos posteriores. +- `getSubjectModal()`: Especifica el tipo de modelo que es el sujeto (desde `getSubject`). Veamos un ejemplo de [Flarum Likes](https://github.com/flarum/likes/blob/master/src/Notification/PostLikedBlueprint.php): @@ -27,39 +27,39 @@ use Flarum\User\User; class PostLikedBlueprint implements BlueprintInterface { - public $post; + public $post; - public $user; + public $user; - public function __construct(Post $post, User $user) - { - $this->post = $post; - $this->user = $user; - } + public function __construct(Post $post, User $user) + { + $this->post = $post; + $this->user = $user; + } - public function getSubject() - { - return $this->post; - } + public function getSubject() + { + return $this->post; + } - public function getSender() - { - return $this->user; - } + public function getSender() + { + return $this->user; + } - public function getData() - { - } + public function getData() + { + } - public static function getType() - { - return 'postLiked'; - } + public static function getType() + { + return 'postLiked'; + } - public static function getSubjectModel() - { - return Post::class; - } + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -70,9 +70,9 @@ Echa un vistazo a [`DiscussionRenamedBlueprint`](https://github.com/flarum/core/ A continuación, vamos a registrar su notificación para que Flarum la conozca. Esto permitirá a los usuarios ser capaces de cambiar cómo quieren ser notificados de su notificación. Podemos hacer esto con el método `type` del extensor `Notification`. -* `$blueprint`: Su clase estática (ejemplo: `PostLikedBlueprint::class`) -* `$serializer`: El serializador de tu modelo de sujeto (ejemplo: `PostSerializer::class`) -* `$enabledByDefault`: Aquí es donde estableces qué métodos de notificación estarán habilitados por defecto. Acepta un array de cadenas, incluye 'alert' para tener notificaciones del foro (el icono de la campana), incluye 'email' para las notificaciones por correo electrónico. Puedes usar, uno de los dos, o ninguno. (ejemplo: `['alert']` activaría sólo las notificaciones en el foro por defecto) +- `$blueprint`: Su clase estática (ejemplo: `PostLikedBlueprint::class`) +- `$serializer`: El serializador de tu modelo de sujeto (ejemplo: `PostSerializer::class`) +- `$enabledByDefault`: Aquí es donde estableces qué métodos de notificación estarán habilitados por defecto. Acepta un array de cadenas, incluye 'alert' para tener notificaciones del foro (el icono de la campana), incluye 'email' para las notificaciones por correo electrónico. Puedes usar, uno de los dos, o ninguno. (ejemplo: `['alert']` activaría sólo las notificaciones en el foro por defecto) Veamos un ejemplo de [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/extend.php): @@ -116,84 +116,84 @@ use Symfony\Contracts\Translation\TranslatorInterface; class PostMentionedBlueprint implements BlueprintInterface, MailableInterface { - /** - * @var Post - */ - public $post; - - /** - * @var Post - */ - public $reply; - - /** - * @param Post $post - * @param Post $reply - */ - public function __construct(Post $post, Post $reply) - { - $this->post = $post; - $this->reply = $reply; - } + /** + * @var Post + */ + public $post; + + /** + * @var Post + */ + public $reply; + + /** + * @param Post $post + * @param Post $reply + */ + public function __construct(Post $post, Post $reply) + { + $this->post = $post; + $this->reply = $reply; + } - /** - * {@inheritdoc} - */ - public function getSubject() - { - return $this->post; - } + /** + * {@inheritdoc} + */ + public function getSubject() + { + return $this->post; + } - /** - * {@inheritdoc} - */ - public function getFromUser() - { - return $this->reply->user; - } + /** + * {@inheritdoc} + */ + public function getFromUser() + { + return $this->reply->user; + } - /** - * {@inheritdoc} - */ - public function getData() - { - return ['replyNumber' => (int) $this->reply->number]; - } + /** + * {@inheritdoc} + */ + public function getData() + { + return ['replyNumber' => (int) $this->reply->number]; + } - /** - * {@inheritdoc} - */ - public function getEmailView() - { - return ['text' => 'flarum-mentions::emails.postMentioned']; - } + /** + * {@inheritdoc} + */ + public function getEmailView() + { + return ['text' => 'flarum-mentions::emails.postMentioned']; + } - /** - * {@inheritdoc} - */ - public function getEmailSubject(TranslatorInterface $translator) - { - return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ - '{replier_display_name}' => $this->post->user->display_name, - '{title}' => $this->post->discussion->title - ]); - } + /** + * {@inheritdoc} + */ + public function getEmailSubject(TranslatorInterface $translator) + { + return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ + '{replier_display_name}' => $this->post->user->display_name, + '{title}' => $this->post->discussion->title, + ]); + } - /** - * {@inheritdoc} - */ - public static function getType() - { - return 'postMentioned'; - } + /** + * {@inheritdoc} + */ + public static function getType() + { + return 'postMentioned'; + } - /** - * {@inheritdoc} - */ - public static function getSubjectModel() - { - return Post::class; - } + /** + * {@inheritdoc} + */ + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -213,45 +213,45 @@ use Illuminate\Contracts\Queue\Queue; class PusherNotificationDriver implements NotificationDriverInterface { - /** - * @var Queue - */ - protected $queue; - - public function __construct(Queue $queue) - { - $this->queue = $queue; - } + /** + * @var Queue + */ + protected $queue; + + public function __construct(Queue $queue) + { + $this->queue = $queue; + } - /** - * {@inheritDoc} - */ - public function send(BlueprintInterface $blueprint, array $users): void - { - // El método `send` se encarga de determinar si es necesario enviar notificaciones. - // Si no (por ejemplo, si no hay usuarios a los que enviar), no tiene sentido programar un trabajo. - // Recomendamos encarecidamente que las notificaciones se envíen a través de una cola de trabajo por razones de rendimiento. - if (count($users)) { - $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); - } + /** + * {@inheritDoc} + */ + public function send(BlueprintInterface $blueprint, array $users): void + { + // El método `send` se encarga de determinar si es necesario enviar notificaciones. + // Si no (por ejemplo, si no hay usuarios a los que enviar), no tiene sentido programar un trabajo. + // Recomendamos encarecidamente que las notificaciones se envíen a través de una cola de trabajo por razones de rendimiento. + if (count($users)) { + $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); } + } - /** - * {@inheritDoc} - */ - public function registerType(string $blueprintClass, array $driversEnabledByDefault): void - { - // Este método se utiliza generalmente para registrar una preferencia del usuario para esta notificación. - // En el caso de pusher, no hay necesidad de esto. - } + /** + * {@inheritDoc} + */ + public function registerType(string $blueprintClass, array $driversEnabledByDefault): void + { + // Este método se utiliza generalmente para registrar una preferencia del usuario para esta notificación. + // En el caso de pusher, no hay necesidad de esto. + } } ``` Los controladores de notificaciones también se registran a través del extensor `Notification`, utilizando el método `driver`. Se proporcionan los siguientes argumentos -* `$driverName`: Un nombre único y legible para el controlador -* `$driverClass`: La clase estática del controlador (ejemplo: `PostSerializer::class`) -* `$typesEnabledByDefault`: Un array de tipos para los que este controlador debería estar habilitado por defecto. Se utilizará para calcular `$driversEnabledByDefault`, que se proporciona al método `registerType` del controlador. +- `$driverName`: Un nombre único y legible para el controlador +- `$driverClass`: La clase estática del controlador (ejemplo: `PostSerializer::class`) +- `$typesEnabledByDefault`: Un array de tipos para los que este controlador debería estar habilitado por defecto. Se utilizará para calcular `$driversEnabledByDefault`, que se proporciona al método `registerType` del controlador. Otro ejemplo de [Flarum Pusher](https://github.com/flarum/pusher/blob/master/extend.php): @@ -277,12 +277,12 @@ Al igual que en el plano de notificaciones, tenemos que decirle a Flarum cómo q Primero, crear una clase que extienda el componente de notificación. Entonces, hay 4 funciones que añadir: -* `icon()`: El icono [Font Awesome](https://fontawesome.com/) que aparecerá junto al texto de la notificación (ejemplo: `fas fa-code-branch`). -* `href()`: El enlace que debe abrirse al hacer clic en la notificación (ejemplo: `app.route.post(this.attrs.notification.subject())`). -* `content()`: Lo que debe mostrar la notificación en sí. Debería decir el nombre de usuario y luego la acción. Le seguirá la fecha de envío de la notificación (asegúrate de usar las traducciones). -* `exerpt()`: (opcional) Un pequeño extracto que se muestra debajo de la notificación (comúnmente un extracto de un post). +- `icon()`: El icono [Font Awesome](https://fontawesome.com/) que aparecerá junto al texto de la notificación (ejemplo: `fas fa-code-branch`). +- `href()`: El enlace que debe abrirse al hacer clic en la notificación (ejemplo: `app.route.post(this.attrs.notification.subject())`). +- `content()`: Lo que debe mostrar la notificación en sí. Debería decir el nombre de usuario y luego la acción. Le seguirá la fecha de envío de la notificación (asegúrate de usar las traducciones). +- `exerpt()`: (opcional) Un pequeño extracto que se muestra debajo de la notificación (comúnmente un extracto de un post). -*Veamos nuestro ejemplo, ¿de acuerdo?* +_Veamos nuestro ejemplo, ¿de acuerdo?_ De [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/js/src/forum/components/NewPostNotification.js), cuando se publica un nuevo post en una discusión seguida: @@ -304,7 +304,7 @@ export default class NewPostNotification extends Notification { } content() { - return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', {user: this.attrs.notification.sender()}); + return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', { user: this.attrs.notification.sender() }); } } ``` @@ -337,25 +337,26 @@ app.initializers.add('flarum-likes', () => { items.add('postLiked', { name: 'postLiked', icon: 'far fa-thumbs-up', - label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'), }); }); }); ``` + Sólo tienes que añadir el nombre de tu notificación (desde el plano), un icono que quieras mostrar y una descripción de la notificación y ya está todo listo. ## Envío de notificaciones -*Los datos no aparecen en la base de datos por arte de magia* +_Los datos no aparecen en la base de datos por arte de magia_ Ahora que tienes tu notificación configurada, es el momento de enviar la notificación al usuario. Afortunadamente, esta es la parte más fácil, simplemente usa la función de sincronización de [`NotificationSyncer`](https://github.com/flarum/core/blob/master/src/Notification/NotificationSyncer.php). Acepta 2 argumentos: -* `BlueprintInterface`: Este es el blueprint a instanciar que hicimos en el primer paso, debes incluir todas las variables que se usan en el blueprint (ejemplo: si a un usuario le gusta un post debes incluir el modelo `user` que le gustó el post). -* `$users`: Acepta un array de modelos de `user` que deben recibir la notificación +- `BlueprintInterface`: Este es el blueprint a instanciar que hicimos en el primer paso, debes incluir todas las variables que se usan en el blueprint (ejemplo: si a un usuario le gusta un post debes incluir el modelo `user` que le gustó el post). +- `$users`: Acepta un array de modelos de `user` que deben recibir la notificación -*¿Qué es eso? ¿Quieres poder eliminar notificaciones también?* La forma más sencilla de eliminar una notificación es pasar exactamente los mismos datos que al enviar una notificación, pero con una matriz de destinatarios vacía. +_¿Qué es eso? ¿Quieres poder eliminar notificaciones también?_ La forma más sencilla de eliminar una notificación es pasar exactamente los mismos datos que al enviar una notificación, pero con una matriz de destinatarios vacía. Veamos nuestro **último** ejemplo de hoy: @@ -377,41 +378,38 @@ use Illuminate\Contracts\Events\Dispatcher; class SendNotificationWhenPostIsLiked { - protected $notifications; + protected $notifications; - public function __construct(NotificationSyncer $notifications) - { - $this->notifications = $notifications; - } + public function __construct(NotificationSyncer $notifications) + { + $this->notifications = $notifications; + } - public function subscribe(Dispatcher $events) - { - $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); - $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); - } + public function subscribe(Dispatcher $events) + { + $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); + $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); + } - public function whenPostWasLiked(PostWasLiked $event) - { - $this->syncNotification($event->post, $event->user, [$event->post->user]); - } + public function whenPostWasLiked(PostWasLiked $event) + { + $this->syncNotification($event->post, $event->user, [$event->post->user]); + } - public function whenPostWasUnliked(PostWasUnliked $event) - { - $this->syncNotification($event->post, $event->user, []); - } + public function whenPostWasUnliked(PostWasUnliked $event) + { + $this->syncNotification($event->post, $event->user, []); + } - public function syncNotification(Post $post, User $user, array $recipients) - { - if ($post->user->id != $user->id) { - $this->notifications->sync( - new PostLikedBlueprint($post, $user), - $recipients - ); - } + public function syncNotification(Post $post, User $user, array $recipients) + { + if ($post->user->id != $user->id) { + $this->notifications->sync(new PostLikedBlueprint($post, $user), $recipients); } + } } ``` **¡Genial!** Ahora puedes enviar spam a los usuarios con actualizaciones de los acontecimientos del foro. -**¿Intentaste todo?** Bueno, si lo intentaste todo, supongo que... Es una broma. ¡Siéntete libre de postear en la [Comunidad Flarum](https://discuss.flarum.org/t/extensibility) o en el [Discord](https://flarum.org/discord/) y alguien estará por ahi para echarte una mano! \ No newline at end of file +**¿Intentaste todo?** Bueno, si lo intentaste todo, supongo que... Es una broma. ¡Siéntete libre de postear en la [Comunidad Flarum](https://discuss.flarum.org/t/extensibility) o en el [Discord](https://flarum.org/discord/) y alguien estará por ahi para echarte una mano! diff --git a/docs/es/extend/permissions.md b/docs/es/extend/permissions.md index 3ea8a323c..e4ebedd6e 100644 --- a/docs/es/extend/permissions.md +++ b/docs/es/extend/permissions.md @@ -18,7 +18,7 @@ Los administradores también pueden crear nuevos grupos a través del panel de a ## Permisos -Los "permisos" de Flarum se implementan como simples cadenas, y se asocian con los grupos en una tabla de +Los "permisos" de Flarum se implementan como simples cadenas, y se asocian con los grupos en una tabla de pseudounión (no es una verdadera relación ManyToMany, pero el concepto es el mismo). En realidad, eso es todo lo que hace la cuadrícula de permisos en el panel de control del administrador: estás añadiendo y eliminando estas cadenas de permisos de los grupos. @@ -55,15 +55,19 @@ Podemos hacer esto extendiendo el componente frontend `flarum/components/Permiss import { extend } from 'flarum/extend'; import PermissionGrid from 'flarum/components/PermissionGrid'; -export default function() { - extend(PermissionGrid.prototype, 'moderateItems', items => { - items.add('tag', { - icon: 'fas fa-tag', // Clases CSS para el icono. Generalmente en formato fontawesome, aunque también puedes usar tu propio css - label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'), - permission: 'discussion.tag' // La cadena del permiso. - }, 95); +export default function () { + extend(PermissionGrid.prototype, 'moderateItems', (items) => { + items.add( + 'tag', + { + icon: 'fas fa-tag', // Clases CSS para el icono. Generalmente en formato fontawesome, aunque también puedes usar tu propio css + label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'), + permission: 'discussion.tag', // La cadena del permiso. + }, + 95 + ); }); } ``` -Por defecto, los permisos sólo se conceden a los administradores. Si quieres que un permiso esté disponible para otros grupos por defecto, tendrás que utilizar una [migración de datos](data.md#migrations) para añadir filas para los grupos pertinentes. Si quieres hacer esto, te recomendamos **encarecidamente** que sólo asignes permisos por defecto a uno de los [grupos reservados](#groups). \ No newline at end of file +Por defecto, los permisos sólo se conceden a los administradores. Si quieres que un permiso esté disponible para otros grupos por defecto, tendrás que utilizar una [migración de datos](data.md#migrations) para añadir filas para los grupos pertinentes. Si quieres hacer esto, te recomendamos **encarecidamente** que sólo asignes permisos por defecto a uno de los [grupos reservados](#groups). diff --git a/docs/es/extend/post-types.md b/docs/es/extend/post-types.md index 2126282d8..021a8738e 100644 --- a/docs/es/extend/post-types.md +++ b/docs/es/extend/post-types.md @@ -1 +1 @@ -# Post Types \ No newline at end of file +# Post Types diff --git a/docs/es/extend/routes.md b/docs/es/extend/routes.md index 7e62fb4b0..5eceff30e 100644 --- a/docs/es/extend/routes.md +++ b/docs/es/extend/routes.md @@ -8,11 +8,11 @@ El enrutamiento ocurre tanto en el backend de PHP como en el frontend de JavaScr En el backend, Flarum tiene tres colecciones de rutas: -* `forum` Estas rutas son accesibles bajo `suforo.com/`. Incluyen rutas que muestran páginas en el frontend (como `suforo.com/d/123-título`) y otras rutas de utilidad (como la ruta de restablecimiento de contraseña). +- `forum` Estas rutas son accesibles bajo `suforo.com/`. Incluyen rutas que muestran páginas en el frontend (como `suforo.com/d/123-título`) y otras rutas de utilidad (como la ruta de restablecimiento de contraseña). -* Estas rutas son accesibles en `suforo.com/admin/`. Por defecto, sólo hay una ruta `admin` en el backend; el resto del enrutamiento de administración ocurre en el frontend. +- Estas rutas son accesibles en `suforo.com/admin/`. Por defecto, sólo hay una ruta `admin` en el backend; el resto del enrutamiento de administración ocurre en el frontend. -* `api` Estas rutas son accesibles en `suforo.com/api/` y conforman el JSON:API de Flarum. +- `api` Estas rutas son accesibles en `suforo.com/api/` y conforman el JSON:API de Flarum. ### Definición de rutas @@ -20,9 +20,9 @@ Puedes añadir rutas a cualquiera de estas colecciones utilizando el extensor `R Hay métodos para registrar rutas para cualquier método de petición HTTP: `get`, `post`, `put`, `patch` y `delete`. Todos estos métodos aceptan tres argumentos: -* `$path` La ruta utilizando la sintaxis [FastRoute](https://github.com/nikic/FastRoute#defining-routes). -* `$name` Nombre único para la ruta, utilizado para generar URLs. Para evitar conflictos con otras extensiones, debe utilizar el nombre de su proveedor como espacio de nombres. -* `$handler` El nombre de la clase del controlador que manejará la solicitud. Esto se resolverá a través del contenedor. +- `$path` La ruta utilizando la sintaxis [FastRoute](https://github.com/nikic/FastRoute#defining-routes). +- `$name` Nombre único para la ruta, utilizado para generar URLs. Para evitar conflictos con otras extensiones, debe utilizar el nombre de su proveedor como espacio de nombres. +- `$handler` El nombre de la clase del controlador que manejará la solicitud. Esto se resolverá a través del contenedor. ```php get('/hello-world', 'acme.hello-world', HelloWorldController::class) -]; +return [(new Extend\Routes('forum'))->get('/hello-world', 'acme.hello-world', HelloWorldController::class)]; ``` ### Controladores @@ -52,10 +49,10 @@ use Psr\Http\Server\RequestHandlerInterface; class HelloWorldController implements RequestHandlerInterface { - public function handle(Request $request): Response - { - return new HtmlResponse('

Hello, world!

'); - } + public function handle(Request $request): Response + { + return new HtmlResponse('

Hello, world!

'); + } } ``` @@ -76,8 +73,7 @@ El método `handle` de un Controlador es el código que se ejecuta cuando alguie A veces necesitará capturar segmentos del URI dentro de su ruta. Puede hacerlo definiendo parámetros de ruta utilizando la sintaxis [FastRoute](https://github.com/nikic/FastRoute#defining-routes): ```php - (new Extend\Routes('forum')) - ->get('/user/{id}', 'acme.user', UserController::class) +(new Extend\Routes('forum'))->get('/user/{id}', 'acme.user', UserController::class); ``` Los valores de estos parámetros se combinarán con los parámetros de consulta de la solicitud, a los que puede acceder en su controlador llamando a `$request->getQueryParams()`: @@ -118,19 +114,19 @@ Luego, inyecta la fábrica en tu controlador y renderiza tu vista en un `HtmlRes ```php class HelloWorldController implements RequestHandlerInterface { - protected $view; - - public function __construct(Factory $view) - { - $this->view = $view; - } - - public function handle(Request $request): Response - { - $view = $this->view->make('acme.hello-world::greeting'); - - return new HtmlResponse($view->render()); - } + protected $view; + + public function __construct(Factory $view) + { + $this->view = $view; + } + + public function handle(Request $request): Response + { + $view = $this->view->make('acme.hello-world::greeting'); + + return new HtmlResponse($view->render()); + } } ``` @@ -145,8 +141,7 @@ Para añadir rutas al frontend es necesario registrarlas _tanto_ en el frontend En el backend, en lugar de añadir tu ruta del frontend a través del extensor `Routes`, debes utilizar el método `route` del extensor `Frontend`. Esto siempre asume `GET` como el método, y acepta una ruta y un nombre como los dos primeros argumentos: ```php - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users') +(new Extend\Frontend('forum'))->route('/users', 'acme.users'); ``` Ahora, cuando se visite `suforo.com/usuarios`, se mostrará el frontend del foro. Sin embargo, dado que el frontend no conoce todavía la ruta `users`, la lista de discusión se seguirá mostrando. @@ -190,6 +185,7 @@ Los parámetros de la ruta se pasarán a los `attrs` del componente de la ruta. Para generar una URL a una ruta en el frontend, utilice el método `app.route`. Este método acepta dos argumentos: el nombre de la ruta y un hash de parámetros. Los parámetros rellenarán los segmentos de URI que coincidan, de lo contrario se añadirán como parámetros de consulta. + ```js const url = app.route('acme.user', { id: 123, foo: 'bar' }); // http://tuforo.com/users/123?foo=bar @@ -224,10 +220,10 @@ import Link from 'flarum/components/Link'; Cada vez que visitas una ruta del frontend, el backend construye un documento HTML con el andamiaje necesario para arrancar la aplicación JavaScript del frontend. Puedes modificar fácilmente este documento para realizar tareas como: -* Cambiar el `` de la página -* Añadir recursos externos de JavaScript y CSS -* Añadir contenido SEO y etiquetas `<meta>`. -* Añadir datos a la carga útil de JavaScript (por ejemplo, para precargar los recursos que se van a renderizar en la página inmediatamente, evitando así una petición innecesaria a la API) +- Cambiar el `<title>` de la página +- Añadir recursos externos de JavaScript y CSS +- Añadir contenido SEO y etiquetas `<meta>`. +- Añadir datos a la carga útil de JavaScript (por ejemplo, para precargar los recursos que se van a renderizar en la página inmediatamente, evitando así una petición innecesaria a la API) Puedes hacer cambios en el frontend usando el método `content` del extensor `Frontend`. Este método acepta un cierre que recibe dos parámetros: un objeto `Flarum\Frontend\Document` que representa el documento HTML que se mostrará, y el objeto `Request`. @@ -236,10 +232,9 @@ use Flarum\Frontend\Document; use Psr\Http\Message\ServerRequestInterface as Request; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document, Request $request) { - $document->head[] = '<script>alert("Hello, world!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document, Request $request) { + $document->head[] = '<script>alert("Hello, world!")</script>'; + }), ]; ``` @@ -247,9 +242,8 @@ También puede añadir contenido en sus registros de ruta de frontend: ```php return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) + (new Extend\Frontend('forum'))->route('/users', 'acme.users', function (Document $document, Request $request) { + $document->title = 'Users'; + }), ]; -``` \ No newline at end of file +``` diff --git a/docs/es/extend/search.md b/docs/es/extend/search.md index 6aaea9fe0..da070d7ff 100644 --- a/docs/es/extend/search.md +++ b/docs/es/extend/search.md @@ -1 +1 @@ -# Search \ No newline at end of file +# Search diff --git a/docs/es/extend/service-provider.md b/docs/es/extend/service-provider.md index 9bd8f088d..b6d3f778b 100644 --- a/docs/es/extend/service-provider.md +++ b/docs/es/extend/service-provider.md @@ -32,15 +32,15 @@ use Flarum\Foundation\AbstractServiceProvider; class CustomServiceProvider extends AbstractServiceProvider { - public function register() - { - // lógica personalizada aquí - } - - public function boot() - { - // lógica personalizada aquí - } + public function register() + { + // lógica personalizada aquí + } + + public function boot() + { + // lógica personalizada aquí + } } ``` @@ -54,9 +54,8 @@ Para registrar tu proveedor de servicios personalizado, puedes usar el extensor use Flarum\Extend; return [ - // Otros extensores - (new Extend\ServiceProvider()) - ->register(CustomServiceProvider::class), - // Otros extensores + // Otros extensores + (new Extend\ServiceProvider())->register(CustomServiceProvider::class), + // Otros extensores ]; ``` diff --git a/docs/es/extend/settings.md b/docs/es/extend/settings.md index 41de1be59..b609bcdbd 100644 --- a/docs/es/extend/settings.md +++ b/docs/es/extend/settings.md @@ -17,15 +17,15 @@ use Flarum\Settings\SettingsRepositoryInterface; class ClassInterfacesWithSettings { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } } ``` @@ -80,15 +80,15 @@ Esto se puede hacer a través del extensor `Settings`. Por ejemplo: use Flarum\Extend; return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // Este tercer argumento es opcional, y nos permite pasar la configuración recuperada a través de alguna lógica personalizada. - // En este ejemplo, le añadiremos una cadena. - - return "My Cool Setting: $retrievedValue"; - }), -] + (new Extend\Settings()) + ->serializeToForum('myCoolSetting', 'my.cool.setting.key') + ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { + // Este tercer argumento es opcional, y nos permite pasar la configuración recuperada a través de alguna lógica personalizada. + // En este ejemplo, le añadiremos una cadena. + + return "My Cool Setting: $retrievedValue"; + }), +]; ``` -Ahora, el ajuste `my.cool.setting.key` será accesible en el frontend como `app.forum.attribute("myCoolSetting")`, y nuestro valor modificado será accesible a través de `app.forum.attribute("myCoolSettingModified")`. \ No newline at end of file +Ahora, el ajuste `my.cool.setting.key` será accesible en el frontend como `app.forum.attribute("myCoolSetting")`, y nuestro valor modificado será accesible a través de `app.forum.attribute("myCoolSettingModified")`. diff --git a/docs/es/extend/start.md b/docs/es/extend/start.md index b054bdc45..2d97249b2 100644 --- a/docs/es/extend/start.md +++ b/docs/es/extend/start.md @@ -10,11 +10,11 @@ Ten en cuenta que Flarum utiliza algunos lenguajes y herramientas _modernas_. Si Flarum se compone de tres capas: -* En primer lugar, está el **backend**. Está escrito en [PHP orientado a objetos](https://laracasts.com/series/object-oriented-bootcamp-in-php), y hace uso de una amplia gama de componentes de [Laravel](https://laravel.com/) y otros paquetes a través de [Composer](https://getcomposer.org/). También querrás familiarizarte con el concepto de [Dependency Injection](https://laravel.com/docs/6.x/container), que se utiliza en todo nuestro backend. +- En primer lugar, está el **backend**. Está escrito en [PHP orientado a objetos](https://laracasts.com/series/object-oriented-bootcamp-in-php), y hace uso de una amplia gama de componentes de [Laravel](https://laravel.com/) y otros paquetes a través de [Composer](https://getcomposer.org/). También querrás familiarizarte con el concepto de [Dependency Injection](https://laravel.com/docs/6.x/container), que se utiliza en todo nuestro backend. -* En segundo lugar, el backend expone una **API pública** que permite a los clientes del frontend interactuar con los datos de tu foro. Está construida de acuerdo con la especificación [JSON:API](https://jsonapi.org/). +- En segundo lugar, el backend expone una **API pública** que permite a los clientes del frontend interactuar con los datos de tu foro. Está construida de acuerdo con la especificación [JSON:API](https://jsonapi.org/). -* Por último, está la interfaz web por defecto que llamamos **frontend**. Esta es una [single-page application](https://en.wikipedia.org/wiki/Single-page_application) que consume la API. Está construida con un sencillo framework tipo React llamado [Mithril.js](https://mithril.js.org). +- Por último, está la interfaz web por defecto que llamamos **frontend**. Esta es una [single-page application](https://en.wikipedia.org/wiki/Single-page_application) que consume la API. Está construida con un sencillo framework tipo React llamado [Mithril.js](https://mithril.js.org). Las extensiones a menudo necesitarán interactuar con estas tres capas para hacer que las cosas sucedan. Por ejemplo, si quieres construir una extensión que añada campos personalizados a los perfiles de los usuarios, tendrías que añadir las estructuras de base de datos apropiadas en el **backend**, exponer esos datos en la **public API**, y luego mostrarlos y permitir a los usuarios editarlos en el **frontend**. @@ -22,15 +22,13 @@ Así que... ¿cómo extendemos estas capas? ## Extensores -Para extender Flarum, usaremos un concepto llamado **extensores**. Los extensores son objetos *declarativos* que describen en términos sencillos los objetivos que se pretenden alcanzar (como añadir una nueva ruta a tu foro, o ejecutar algún código cuando se crea una nueva discusión). +Para extender Flarum, usaremos un concepto llamado **extensores**. Los extensores son objetos _declarativos_ que describen en términos sencillos los objetivos que se pretenden alcanzar (como añadir una nueva ruta a tu foro, o ejecutar algún código cuando se crea una nueva discusión). Cada extensor es diferente. Sin embargo, siempre tendrán un aspecto similar a este: ```php // Registrar un archivo JavaScript y un archivo CSS para ser entregado con el frontend del foro -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') +(new Extend\Frontend('forum'))->js(__DIR__ . '/forum-scripts.js')->css(__DIR__ . '/forum-styles.css'); ``` Primero se crea una instancia del extensor, y luego se llama a los métodos en él para la configuración adicional. Todos estos métodos devuelven el propio extensor, de modo que puedes conseguir toda la configuración simplemente encadenando llamadas a métodos. @@ -50,10 +48,9 @@ use Flarum\Extend; use Flarum\Frontend\Document; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document) { - $document->head[] = '<script>alert("Hello, world!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document) { + $document->head[] = '<script>alert("Hello, world!")</script>'; + }), ]; ``` @@ -85,39 +82,41 @@ Necesitamos decirle a Composer un poco sobre nuestro paquete, y podemos hacerlo ```json { - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } + "name": "acme/flarum-hello-world", + "description": "Say hello to the world!", + "type": "flarum-extension", + "require": { + "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" + }, + "autoload": { + "psr-4": { "Acme\\HelloWorld\\": "src/" } + }, + "extra": { + "flarum-extension": { + "title": "Hello World", + "icon": { + "name": "fas fa-smile", + "backgroundColor": "#238c59", + "color": "#fff" + } } + } } ``` -* **name** es el nombre del paquete de Composer en el formato `vendedor/paquete`. - * Debes elegir un nombre de proveedor que sea único para ti - tu nombre de usuario de GitHub, por ejemplo. Para los propósitos de este tutorial, asumiremos que estás usando `acme` como tu nombre de proveedor. - * Debes anteponer a la parte del `package` el prefijo `flarum-` para indicar que se trata de un paquete específicamente destinado a ser utilizado con Flarum. +- **name** es el nombre del paquete de Composer en el formato `vendedor/paquete`. -* **description** es una breve descripción de una frase de lo que hace la extensión. + - Debes elegir un nombre de proveedor que sea único para ti - tu nombre de usuario de GitHub, por ejemplo. Para los propósitos de este tutorial, asumiremos que estás usando `acme` como tu nombre de proveedor. + - Debes anteponer a la parte del `package` el prefijo `flarum-` para indicar que se trata de un paquete específicamente destinado a ser utilizado con Flarum. -* **type** debe ser establecido como `flarum-extension`. Esto asegura que cuando alguien "requiera" su extensión, será identificada como tal. +- **description** es una breve descripción de una frase de lo que hace la extensión. -* **require** contiene una lista de las dependencias propias de su extensión. - * Querrá especificar la versión de Flarum con la que su extensión es compatible aquí. - * Este es también el lugar para listar otras bibliotecas de Composer que su código necesita para funcionar. +- **type** debe ser establecido como `flarum-extension`. Esto asegura que cuando alguien "requiera" su extensión, será identificada como tal. + +- **require** contiene una lista de las dependencias propias de su extensión. + + - Querrá especificar la versión de Flarum con la que su extensión es compatible aquí. + - Este es también el lugar para listar otras bibliotecas de Composer que su código necesita para funcionar. ::: warning Elige cuidadosamente la versión de Flarum @@ -127,11 +126,11 @@ Necesitamos decirle a Composer un poco sobre nuestro paquete, y podemos hacerlo ::: -* **autoload** indica a Composer dónde encontrar las clases de su extensión. El espacio de nombres aquí debe reflejar el nombre del proveedor y del paquete de su extensión en CamelCase. +- **autoload** indica a Composer dónde encontrar las clases de su extensión. El espacio de nombres aquí debe reflejar el nombre del proveedor y del paquete de su extensión en CamelCase. -* **extra.flarum-extension** contiene alguna información específica de Flarum, como el nombre de su extensión y el aspecto de su icono. - * **title** es el nombre de su extensión. - * **icon** es un objeto que define el icono de tu extensión. La propiedad **name** es un [nombre de clase de icono de Font Awesome](https://fontawesome.com/icons). Todas las demás propiedades se utilizan como el atributo `style` para el icono de su extensión. +- **extra.flarum-extension** contiene alguna información específica de Flarum, como el nombre de su extensión y el aspecto de su icono. + - **title** es el nombre de su extensión. + - **icon** es un objeto que define el icono de tu extensión. La propiedad **name** es un [nombre de clase de icono de Font Awesome](https://fontawesome.com/icons). Todas las demás propiedades se utilizan como el atributo `style` para el icono de su extensión. Consulte [el esquema composer.json](https://getcomposer.org/doc/04-schema.md) para obtener información sobre otras propiedades que puede añadir a `composer.json`. @@ -153,4 +152,4 @@ Una vez hecho esto, sigue adelante y activa la extension en la página de admini ¡Listo! -Estamos haciendo buenos progresos. Hemos aprendido a configurar nuestra extensión y a utilizar los extensores, lo que nos abre muchas puertas. Sigue leyendo para aprender a extender el frontend de Flarum. \ No newline at end of file +Estamos haciendo buenos progresos. Hemos aprendido a configurar nuestra extensión y a utilizar los extensores, lo que nos abre muchas puertas. Sigue leyendo para aprender a extender el frontend de Flarum. diff --git a/docs/es/extend/testing.md b/docs/es/extend/testing.md index a76957c5a..e8c774394 100644 --- a/docs/es/extend/testing.md +++ b/docs/es/extend/testing.md @@ -88,7 +88,7 @@ Este script se ejecutará para configurar una base de datos/estructura de archiv use Flarum\Testing\integration\Setup\SetupScript; -require __DIR__.'/../../vendor/autoload.php'; +require __DIR__ . '/../../vendor/autoload.php'; $setup = new SetupScript(); @@ -181,42 +181,58 @@ class SomeTest extends TestCase { use RetrievesAuthorizedUsers; - public function setUp(): void - { - parent::setUp(); - - // Supongamos que nuestra extensión depende de las etiquetas. - // Ten en cuenta que las etiquetas tendrán que estar en el composer.json de tu extensión `require-dev`. - // Además, asegúrate de incluir el ID de la extensión que se está probando actualmente, a menos que estés - // probando la línea de base sin su extensión. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Tenga en cuenta que esta entrada no está validada: asegúrese de que está rellenando con datos válidos y representativos. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Disponible para su comodidad. + public function setUp(): void + { + parent::setUp(); + + // Supongamos que nuestra extensión depende de las etiquetas. + // Ten en cuenta que las etiquetas tendrán que estar en el composer.json de tu extensión `require-dev`. + // Además, asegúrate de incluir el ID de la extensión que se está probando actualmente, a menos que estés + // probando la línea de base sin su extensión. + $this->extension('flarum-tags', 'my-cool-extension'); + + // Tenga en cuenta que esta entrada no está validada: asegúrese de que está rellenando con datos válidos y representativos. + $this->prepareDatabase([ + 'users' => [ + $this->normalUser(), // Disponible para su comodidad. + ], + 'discussions' => [ + [ + 'id' => 1, + 'title' => 'some title', + 'created_at' => Carbon::now(), + 'last_posted_at' => Carbon::now(), + 'user_id' => 1, + 'first_post_id' => 1, + 'comment_count' => 1, ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] + ], + 'posts' => [ + [ + 'id' => 1, + 'number' => 1, + 'discussion_id' => 1, + 'created_at' => Carbon::now(), + 'user_id' => 1, + 'type' => 'comment', + 'content' => '<t><p>something</p></t>', ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '<t><p>something</p></t>'] - ] - ]); - - // La mayoría de los casos de prueba no necesitarán probar los extensores, pero si quieres, puedes hacerlo. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - + ], + ]); + + // La mayoría de los casos de prueba no necesitarán probar los extensores, pero si quieres, puedes hacerlo. + $this->extend((new CoolExtensionExtender())->doSomething('hello world')); + } + + /** + * @test + */ + public function some_phpunit_test_case() + { // ... + } + + // ... } ``` @@ -254,47 +270,42 @@ use Flarum\Testing\integration\TestCase; class SomeTest extends TestCase { - /** - * @test - */ - public function can_search_users() - { - $response = $this->send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } + /** + * @test + */ + public function can_search_users() + { + $response = $this->send( + $this->request('GET', '/api/users', ['authenticatedAs' => 1])->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) + ); + + $this->assertEquals(200, $response->getStatusCode()); + } + + /** + * @test + */ + public function can_create_user() + { + $response = $this->send( + $this->request('POST', '/api/users', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'attributes' => [ + 'username' => 'test', + 'password' => 'too-obscure', + 'email' => 'test@machine.local', + ], + ], + ], + ]) + ); - // ... + $this->assertEquals(200, $response->getStatusCode()); + } + + // ... } ``` @@ -335,19 +346,19 @@ use Flarum\Tests\integration\ConsoleTestCase; class ConsoleTest extends ConsoleTestCase { - /** - * @test - */ - public function command_works() - { - $input = [ - 'command' => 'some:command', // El nombre del comando, equivalente a `php flarum some:command`. - 'foo' => 'bar', // argumentos - '--lorem' => 'ipsum' // opciones - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } + /** + * @test + */ + public function command_works() + { + $input = [ + 'command' => 'some:command', // El nombre del comando, equivalente a `php flarum some:command`. + 'foo' => 'bar', // argumentos + '--lorem' => 'ipsum', // opciones + ]; + + $this->assertEquals('Some Output.', $this->runCommand($input)); + } } ``` @@ -361,4 +372,4 @@ TODO ## E2E Tests -¡Muy pronto! \ No newline at end of file +¡Muy pronto! diff --git a/docs/es/extend/theme.md b/docs/es/extend/theme.md index c21a76126..5f02affc0 100644 --- a/docs/es/extend/theme.md +++ b/docs/es/extend/theme.md @@ -1 +1 @@ -# Inicio rápido \ No newline at end of file +# Inicio rápido diff --git a/docs/es/extend/translate.md b/docs/es/extend/translate.md index 24ab6380b..a6a6a13fb 100644 --- a/docs/es/extend/translate.md +++ b/docs/es/extend/translate.md @@ -11,11 +11,10 @@ Aquí hay un ejemplo rápido de [Flarum English](https://github.com/flarum/lang- ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` -*Fácil, ¿verdad?* - +_Fácil, ¿verdad?_ ### Paquetes de Idiomas @@ -24,7 +23,7 @@ Sin embargo, el proceso es un poco diferente para los paquetes de idiomas. Con u ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` El `composer.json` también tendrá que ser actualizado. Ahora necesita un objeto informativo `flarum-locale` en `extra`, como `flarum-extension`. Puede simplemente insertar lo siguiente debajo del valor de `flarum-extension` mientras permanece dentro de `extra`: @@ -36,4 +35,4 @@ El `composer.json` también tendrá que ser actualizado. Ahora necesita un objet } ``` -Y eso es todo. Debería funcionar nada más sacarlo de la caja. \ No newline at end of file +Y eso es todo. Debería funcionar nada más sacarlo de la caja. diff --git a/docs/es/extend/update-b16.md b/docs/es/extend/update-b16.md index 1c5aa833a..9fcc78534 100644 --- a/docs/es/extend/update-b16.md +++ b/docs/es/extend/update-b16.md @@ -138,4 +138,4 @@ Un token vinculado a una sesión web ahora se eliminará automáticamente de la - Las políticas ahora pueden devolver `true` y `false` como alias para `$this->allow()` y `$this->deny()`, respectivamente. - El permiso `user.edit` se ha dividido en `user.editGroups`, `user.editCredentials` (para correo electrónico, nombre de usuario y contraseña) y `user.edit` (para otros atributos). - Ahora hay permisos (`bypassTagCounts`) que permiten a los usuarios saltarse los requisitos de recuento de etiquetas. -- Flarum ahora soporta PHP 7.3 - PHP 8.0, con soporte para PHP 7.2 oficialmente eliminado. \ No newline at end of file +- Flarum ahora soporta PHP 7.3 - PHP 8.0, con soporte para PHP 7.2 oficialmente eliminado. diff --git a/docs/es/extensions.md b/docs/es/extensions.md index e2dd34b5f..af9ed3ebc 100644 --- a/docs/es/extensions.md +++ b/docs/es/extensions.md @@ -24,4 +24,4 @@ La página de extensiones del panel de control del administrador proporciona una - Activar o desactivar una extensión - Acceder a la configuración de la extensión (aunque algunas extensiones utilizarán una pestaña en la barra lateral principal para la configuración) -- Revertir las migraciones de una extensión para eliminar cualquier modificación de la base de datos que haya hecho (esto se puede hacer con el botón de desinstalación). Esto eliminará TODOS los datos asociados a la extensión, y es irreversible. Sólo se debe hacer cuando se está eliminando una extensión, y no se planea instalarla de nuevo. Es totalmente opcional. \ No newline at end of file +- Revertir las migraciones de una extensión para eliminar cualquier modificación de la base de datos que haya hecho (esto se puede hacer con el botón de desinstalación). Esto eliminará TODOS los datos asociados a la extensión, y es irreversible. Sólo se debe hacer cuando se está eliminando una extensión, y no se planea instalarla de nuevo. Es totalmente opcional. diff --git a/docs/es/install.md b/docs/es/install.md index 6d7d2025b..16a12a21f 100644 --- a/docs/es/install.md +++ b/docs/es/install.md @@ -4,7 +4,7 @@ Flarum es un **software beta**. ¡Eso significa que todavía tiene algunas características incompletas y errores 🐛🐞, y en algún momento - tarde o temprano - probablemente se romperá! 💥 -La beta consiste en arreglar estos problemas y mejorar Flarum. **Por favor, no uses Flarum en producción a menos que sepas lo que estás haciendo**. No podemos apoyarte si las cosas van mal. La actualización a versiones posteriores será posible, pero podría implicar ensuciarse las manos. +La beta consiste en arreglar estos problemas y mejorar Flarum. **Por favor, no uses Flarum en producción a menos que sepas lo que estás haciendo**. No podemos apoyarte si las cosas van mal. La actualización a versiones posteriores será posible, pero podría implicar ensuciarse las manos. ::: @@ -18,10 +18,10 @@ No dude en probar Flarum en uno de nuestros [foros de demostración](https://dis Antes de instalar Flarum, es importante comprobar que tu servidor cumple los requisitos. Para ejecutar Flarum, necesitarás: -* **Apache** (con mod\_rewrite activado) o **Nginx**. -* **PHP 7.3+** con las siguientes extensiones: curl, dom, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+** o **MariaDB 10.0.5+** -* **Acceso a SSH (línea de comandos)** para ejecutar Composer +- **Apache** (con mod_rewrite activado) o **Nginx**. +- **PHP 7.3+** con las siguientes extensiones: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip +- **MySQL 5.6+** o **MariaDB 10.0.5+** +- **Acceso a SSH (línea de comandos)** para ejecutar Composer ::: tip Alojamiento Compartido (Shared Hosting) @@ -83,6 +83,7 @@ www.ejemplo.com { file_server } ``` + ## Propiedad de la Carpeta Durante la instalación, Flarum puede solicitar que se permita la escritura en ciertos directorios. Para permitir el acceso de escritura a un directorio en Linux, ejecute el siguiente comando: @@ -97,9 +98,9 @@ Si Flarum solicita acceso de escritura tanto al directorio como a su contenido, chmod 775 -R /ruta/al/directorio ``` -Si después de completar estos pasos, Flarum continúa solicitando que cambie los permisos, puede que necesite comprobar que sus archivos son propiedad del grupo y usuario correctos. +Si después de completar estos pasos, Flarum continúa solicitando que cambie los permisos, puede que necesite comprobar que sus archivos son propiedad del grupo y usuario correctos. -Por defecto, en la mayoría de las distribuciones de Linux `www-data` es el grupo y el usuario bajo el que operan tanto PHP como el servidor web. Puede cambiar la propiedad de la carpeta en la mayoría de los sistemas operativos Linux ejecutando `chown -R www-data:www-data nombrecarpeta/`. +Por defecto, en la mayoría de las distribuciones de Linux `www-data` es el grupo y el usuario bajo el que operan tanto PHP como el servidor web. Puede cambiar la propiedad de la carpeta en la mayoría de los sistemas operativos Linux ejecutando `chown -R www-data:www-data nombrecarpeta/`. Para saber más sobre estos comandos, así como sobre los permisos y la propiedad de los archivos en Linux, lea [este tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). Si está configurando Flarum en Windows, puede encontrar útiles las respuestas a [esta pregunta de Super User](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows). @@ -111,7 +112,7 @@ Su entorno puede variar con respecto a la documentación proporcionada, por favo ::: danger Nunca utilice el permiso 777 -Nunca debes establecer ninguna carpeta o archivo con el nivel de permiso `777`, ya que este nivel de permiso permite a cualquiera acceder al contenido de la carpeta y el archivo sin importar el usuario o el grupo. +Nunca debes establecer ninguna carpeta o archivo con el nivel de permiso `777`, ya que este nivel de permiso permite a cualquiera acceder al contenido de la carpeta y el archivo sin importar el usuario o el grupo. ::: @@ -141,9 +142,9 @@ Finalmente, edite el `site.php` y actualice las rutas en las siguientes líneas Si tienes una comunidad existente y no quieres empezar de cero, puedes importar tus datos existentes a Flarum. Aunque todavía no hay importadores oficiales, la comunidad ha hecho varios importadores no oficiales: -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) +- [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) +- [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) +- [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) +- [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) -Estos pueden ser utilizados para otro software de foro también mediante la migración a phpBB primero, y luego a Flarum. Tenga en cuenta que no podemos garantizar que estos funcionen ni podemos ofrecer soporte para ellos. \ No newline at end of file +Estos pueden ser utilizados para otro software de foro también mediante la migración a phpBB primero, y luego a Flarum. Tenga en cuenta que no podemos garantizar que estos funcionen ni podemos ofrecer soporte para ellos. diff --git a/docs/es/languages.md b/docs/es/languages.md index 5bcc2b4c5..2570cb8c4 100644 --- a/docs/es/languages.md +++ b/docs/es/languages.md @@ -27,4 +27,4 @@ Desactivar un idioma puede ser útil si tienes un sitio monolingüe y no quieres Mientras que los paquetes de idiomas descargados desde el sitio de la Comunidad Flarum generalmente incluirán traducciones para todas las extensiones que vienen incluidas en Flarum, _no_ por regla general cubrirán cualquier extensión de la comunidad que pueda tener instalada. Es responsabilidad de los desarrolladores proporcionar y mantener las traducciones de sus extensiones. -Por lo tanto, antes de instalar una extensión comunitaria, debe comprobar que incluye traducciones para cada paquete de idiomas que haya instalado. Si descubre que una extensión no es compatible con un idioma que usted necesita, póngase en contacto directamente con el desarrollador para que le añada las traducciones necesarias. \ No newline at end of file +Por lo tanto, antes de instalar una extensión comunitaria, debe comprobar que incluye traducciones para cada paquete de idiomas que haya instalado. Si descubre que una extensión no es compatible con un idioma que usted necesita, póngase en contacto directamente con el desarrollador para que le añada las traducciones necesarias. diff --git a/docs/es/mail.md b/docs/es/mail.md index e070b0bce..33a61a8f7 100644 --- a/docs/es/mail.md +++ b/docs/es/mail.md @@ -26,4 +26,4 @@ El controlador de correo log NO ENVÍA CORREO, y es utilizado principalmente por ## Probar el Correo Electrónico -Una vez que hayas guardado una configuración de correo electrónico, puedes hacer clic en el botón "Enviar correo de prueba" en la página de correo del panel de administración para asegurarte de que tu configuración funciona. Si ves un error o no recibes un correo electrónico, ajusta la configuración e inténtalo de nuevo. Asegúrate de revisar tu correo no deseado si no hay ningún error, pero no aparece nada en tu bandeja de entrada. \ No newline at end of file +Una vez que hayas guardado una configuración de correo electrónico, puedes hacer clic en el botón "Enviar correo de prueba" en la página de correo del panel de administración para asegurarte de que tu configuración funciona. Si ves un error o no recibes un correo electrónico, ajusta la configuración e inténtalo de nuevo. Asegúrate de revisar tu correo no deseado si no hay ningún error, pero no aparece nada en tu bandeja de entrada. diff --git a/docs/es/themes.md b/docs/es/themes.md index f94e100a9..75c7af460 100644 --- a/docs/es/themes.md +++ b/docs/es/themes.md @@ -30,4 +30,4 @@ Flarum utiliza LESS, que facilita la escritura de CSS al permitir variables, con El flexible [sistema de extensiones](extensions.md) de Flarum te permite añadir, eliminar o modificar prácticamente cualquier parte de Flarum. Si quieres hacer modificaciones temáticas sustanciales más allá de cambiar colores/tamaños/estilos, una extensión personalizada es definitivamente el camino a seguir. -Para aprender cómo hacer una extensión, ¡consulta nuestra [documentación de extensiones](extend/README.md)! \ No newline at end of file +Para aprender cómo hacer una extensión, ¡consulta nuestra [documentación de extensiones](extend/README.md)! diff --git a/docs/es/troubleshoot.md b/docs/es/troubleshoot.md index e6426f5fa..9e28ade82 100644 --- a/docs/es/troubleshoot.md +++ b/docs/es/troubleshoot.md @@ -1,6 +1,6 @@ # Resolución de problemas -Si Flarum no se instala o no funciona como se espera, lo primero que debes hacer es *comprobar de nuevo* si tu entorno cumple los [requisitos del sistema](install.md#server-requirements). Si te falta algo que Flarum necesita para funcionar, tendrás que remediarlo primero. +Si Flarum no se instala o no funciona como se espera, lo primero que debes hacer es _comprobar de nuevo_ si tu entorno cumple los [requisitos del sistema](install.md#server-requirements). Si te falta algo que Flarum necesita para funcionar, tendrás que remediarlo primero. A continuación, deberías tomarte unos minutos para buscar en el [foro de soporte](https://discuss.flarum.org/t/support) y en el [issue tracker](https://github.com/flarum/core/issues). Es posible que alguien ya haya informado del problema y que haya una solución disponible o en camino. Si has buscado a fondo y no puedes encontrar ninguna información sobre el problema, es hora de empezar a solucionar el problema. @@ -14,11 +14,11 @@ Si ha estado viendo páginas en blanco y el cambio anterior no ayuda, intente es Muchos problemas se pueden solucionar con lo siguiente: -* Borrar la caché del navegador -* Borrar la caché del backend con [`php flarum cache:clear`](console.md). -* Asegúrese de que su base de datos está actualizada con [`php flarum migrate`](console.md). -* Asegúrese de que la [configuración de correo electrónico](mail.md) en su panel de administración es correcta: una configuración de correo electrónico no válida causará errores al registrarse, restablecer una contraseña, cambiar correos electrónicos y enviar notificaciones. -* Comprueba que su `config.php` es correcto. Por ejemplo, asegúrate de que se utiliza la "url" correcta. +- Borrar la caché del navegador +- Borrar la caché del backend con [`php flarum cache:clear`](console.md). +- Asegúrese de que su base de datos está actualizada con [`php flarum migrate`](console.md). +- Asegúrese de que la [configuración de correo electrónico](mail.md) en su panel de administración es correcta: una configuración de correo electrónico no válida causará errores al registrarse, restablecer una contraseña, cambiar correos electrónicos y enviar notificaciones. +- Comprueba que su `config.php` es correcto. Por ejemplo, asegúrate de que se utiliza la "url" correcta. También querrás echar un vistazo a la salida de [`php flarum info`](console.md) para asegurarte de que nada importante está fuera de lugar. @@ -34,16 +34,16 @@ En algún momento puedes tener una idea de lo que está causando tu problema, y Si parece que vas a necesitar ayuda para resolver el problema, es hora de ponerse a recopilar datos. Busca mensajes de error u otra información sobre el problema en los siguientes lugares: -* En la propia página -* En la consola del navegador (Chrome: Más herramientas -> Herramientas de desarrollo -> Consola) -* Registrados en el registro de errores del servidor (p. ej. `/var/log/nginx/error.log`) -* Registrado en el registro de errores de PHP-FPM (p. ej. `/var/log/php7.x-fpm.log`) -* Registrados por Flarum (`storage/logs/flarum.log`) +- En la propia página +- En la consola del navegador (Chrome: Más herramientas -> Herramientas de desarrollo -> Consola) +- Registrados en el registro de errores del servidor (p. ej. `/var/log/nginx/error.log`) +- Registrado en el registro de errores de PHP-FPM (p. ej. `/var/log/php7.x-fpm.log`) +- Registrados por Flarum (`storage/logs/flarum.log`) -Copie cualquier mensaje en un archivo de texto y anote algunas notas sobre *cuando* se produjo el error, *qué* estaba haciendo en ese momento, etc. Asegúrate de incluir cualquier información que hayas obtenido sobre las condiciones en las que se produce el problema y en las que no. Añade toda la información posible sobre el entorno de tu servidor: Versión del sistema operativo, versión del servidor web, versión y manejador de PHP, etc. +Copie cualquier mensaje en un archivo de texto y anote algunas notas sobre _cuando_ se produjo el error, _qué_ estaba haciendo en ese momento, etc. Asegúrate de incluir cualquier información que hayas obtenido sobre las condiciones en las que se produce el problema y en las que no. Añade toda la información posible sobre el entorno de tu servidor: Versión del sistema operativo, versión del servidor web, versión y manejador de PHP, etc. ## Paso 4: Preparar un informe Una vez que hayas reunido toda la información que puedas sobre el problema, estás listo para presentar un informe de error. Por favor, sigue las instrucciones en [Reportando Bugs](bugs.md). -Si descubres algo nuevo sobre el problema después de presentar tu informe, por favor, añade esa información al final de tu mensaje original. Es una buena idea presentar un informe incluso si has resuelto el problema por tu cuenta, ya que otros usuarios también pueden beneficiarse de tu solución. Si has encontrado una solución temporal para el problema, asegúrate de mencionarla también. \ No newline at end of file +Si descubres algo nuevo sobre el problema después de presentar tu informe, por favor, añade esa información al final de tu mensaje original. Es una buena idea presentar un informe incluso si has resuelto el problema por tu cuenta, ya que otros usuarios también pueden beneficiarse de tu solución. Si has encontrado una solución temporal para el problema, asegúrate de mencionarla también. diff --git a/docs/es/update.md b/docs/es/update.md index b0834ebfe..0bef8bc91 100644 --- a/docs/es/update.md +++ b/docs/es/update.md @@ -1,3 +1,3 @@ # Actualización -Mientras Flarum esté en fase beta, las instrucciones sobre cómo actualizar se publicarán en cada [anuncio de lanzamiento](https://discuss.flarum.org/t/blog?sort=newest). \ No newline at end of file +Mientras Flarum esté en fase beta, las instrucciones sobre cómo actualizar se publicarán en cada [anuncio de lanzamiento](https://discuss.flarum.org/t/blog?sort=newest). diff --git a/docs/extend/README.md b/docs/extend/README.md index 57d53f7a5..7bb65cb92 100644 --- a/docs/extend/README.md +++ b/docs/extend/README.md @@ -22,7 +22,7 @@ Where do we draw the line between Flarum's core and its extensions? Why are some **Third-party extensions** are features which are made by others and are not officially supported by the Flarum team. They can be built and used to address more specific use-cases. -If you are aiming to address a bug or shortcoming of the core, or of an existing bundled extension, it may be appropriate to *contribute to the respective project* rather than disperse effort on a new third-party extension. It is a good idea to start a discussion on the [Flarum Community](https://discuss.flarum.org/) to get the perspective of the Flarum developers. +If you are aiming to address a bug or shortcoming of the core, or of an existing bundled extension, it may be appropriate to _contribute to the respective project_ rather than disperse effort on a new third-party extension. It is a good idea to start a discussion on the [Flarum Community](https://discuss.flarum.org/) to get the perspective of the Flarum developers. ## Useful Resources diff --git a/docs/extend/admin.md b/docs/extend/admin.md index 39585b09a..c97c7c409 100644 --- a/docs/extend/admin.md +++ b/docs/extend/admin.md @@ -12,22 +12,19 @@ This new API allows you to add settings to your extension with very few lines of ### Telling the API about your extension -Before you can register anything, you need to tell `ExtensionData` what extension it is about to get data for. +Before you can register anything, you need to tell `ExtensionData` what extension it is about to get data for. -Simply run the `for` function on `app.extensionData` passing in the id of your extension. To find you extension id, take the composer name and replace any slashes with dashes (example: 'fof/merge-discussions' becomes 'fof-merge-discussions'). Extensions with the `flarum-` and `flarum-ext-` will omit those from the name (example: 'webbinaro/flarum-calendar' becomes 'webbinaro-calendar'). +Simply run the `for` function on `app.extensionData` passing in the id of your extension. To find you extension id, take the composer name and replace any slashes with dashes (example: 'fof/merge-discussions' becomes 'fof-merge-discussions'). Extensions with the `flarum-` and `flarum-ext-` will omit those from the name (example: 'webbinaro/flarum-calendar' becomes 'webbinaro-calendar'). For the following example, we will use the fictitious extension 'acme/interstellar': ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar'); }); ``` -Once that is done, you can begin adding settings and permissions. +Once that is done, you can begin adding settings and permissions. :::tip Note @@ -39,24 +36,20 @@ All registration functions on `ExtensionData` are chainable, meaning you can cal Adding settings fields in this way is recommended for simple items. As a rule of thumb, if you only need to store things in the settings table, this should be enough for you. -To add a field, call the `registerSetting` function after `for` on `app.extensionData` and pass a 'setting object' as the first argument. Behind the scenes `ExtensionData` actually turns your settings into an [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), you can pass a priority number as the second argument. +To add a field, call the `registerSetting` function after `for` on `app.extensionData` and pass a 'setting object' as the first argument. Behind the scenes `ExtensionData` actually turns your settings into an [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), you can pass a priority number as the second argument. Here's an example with a switch (boolean) item: ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // This is the key the settings will be saved under in the settings table in the database. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // The label to be shown letting the admin know what the setting does. - type: 'boolean', // What type of setting this is, valid options are: boolean, text (or any other <input> tag type), and select. - }, - 30 // Optional: Priority - ) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting( + { + setting: 'acme-interstellar.coordinates', // This is the key the settings will be saved under in the settings table in the database. + label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // The label to be shown letting the admin know what the setting does. + type: 'boolean', // What type of setting this is, valid options are: boolean, text (or any other <input> tag type), and select. + }, + 30 // Optional: Priority + ); }); ``` @@ -75,29 +68,23 @@ If you use `type: 'select'` the setting object looks a little bit different: } ``` - If you want to add something to the settings like some extra text or a more complicated input, you can also pass a callback as the first argument that returns JSX. This callback will be executed in the context of [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) and setting values will not be automatically serialized. ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( - <div className="Form-group"> - <h1> {app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')} </h1> - <label className="checkbox"> - <input type="checkbox" bidi={this.setting('acme-interstellar.rocket_man_setting')}/> - {app.translator.trans('acme-interstellar.admin.rocket_man_setting_label')} - </label> - </div> - ); - } - }) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting(function () { + if (app.session.user.username() === 'RocketMan') { + return ( + <div className="Form-group"> + <h1> {app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')} </h1> + <label className="checkbox"> + <input type="checkbox" bidi={this.setting('acme-interstellar.rocket_man_setting')} /> + {app.translator.trans('acme-interstellar.admin.rocket_man_setting_label')} + </label> + </div> + ); + } + }); }); ``` @@ -105,29 +92,27 @@ app.initializers.add('interstellar', function(app) { New in beta 15, permissions can now be found in 2 places. Now, you can view each extension's individual permissions on their page. All permissions can still be found on the permissions page. -In order for that to happen, permissions must be registered with `ExtensionData`. This is done in a similar way to settings, call `registerPermission`. +In order for that to happen, permissions must be registered with `ExtensionData`. This is done in a similar way to settings, call `registerPermission`. + +Arguments: + +- Permission object +- What type of permission - see [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid)'s functions for types (remove items from the name) +- `ItemList` priority -Arguments: - * Permission object - * What type of permission - see [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid)'s functions for types (remove items from the name) - * `ItemList` priority - Back to our favorite rocket extension: ```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Font-Awesome Icon - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label - permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). - }, - 'start', // Category permission will be added to on the grid - 95 // Optional: Priority - ); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPermission( + { + icon: 'fas fa-rocket', // Font-Awesome Icon + label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label + permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). + }, + 'start', // Category permission will be added to on the grid + 95 // Optional: Priority + ); }); ``` @@ -155,25 +140,18 @@ import ExtensionPage from 'flarum/admin/components/ExtensionPage'; export default class StarPage extends ExtensionPage { content() { - return ( - <h1>Hello from the settings section!</h1> - ) + return <h1>Hello from the settings section!</h1>; } } - ``` Then, simply run `registerPage`: ```js - import StarPage from './components/StarPage'; -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPage(StarPage); }); ``` @@ -187,11 +165,11 @@ In beta 15, extension pages make room for extra info which is pulled from extens For more information, see the [composer.json schema](https://getcomposer.org/doc/04-schema.md). -| Description | Where in composer.json | -| --------------------------------- | -------------------------------------- | -| discuss.flarum.org discussion link | "forum" key inside "support" | -| Documentation | "docs" key inside "support" | -| Support (email) | "email" key inside "support" | -| Website | "homepage" key | -| Donate | "funding" key block (Note: Only the first link will be used) | -| Source | "source" key inside "support" | +| Description | Where in composer.json | +| ---------------------------------- | ------------------------------------------------------------ | +| discuss.flarum.org discussion link | "forum" key inside "support" | +| Documentation | "docs" key inside "support" | +| Support (email) | "email" key inside "support" | +| Website | "homepage" key | +| Donate | "funding" key block (Note: Only the first link will be used) | +| Source | "source" key inside "support" | diff --git a/docs/extend/api-throttling.md b/docs/extend/api-throttling.md index a1caa2650..1cd3d64ce 100644 --- a/docs/extend/api-throttling.md +++ b/docs/extend/api-throttling.md @@ -17,7 +17,7 @@ The format for a custom throttler is extremely simple: all you need is a closure - `false`: This explicitly bypasses throttling for this request, overriding all other throttlers - `true`: This marks the request as to be throttled. - `null`: This means that this throttler doesn't apply. -Any other outputs will be ignored, with the same effect as `null`. + Any other outputs will be ignored, with the same effect as `null`. Throttlers will be run on EVERY request, and are responsible for figuring out whether or not they apply. For example, consider Flarum's post throttler: @@ -25,21 +25,26 @@ Throttlers will be run on EVERY request, and are responsible for figuring out wh use DateTime; use Flarum\Post\Post; -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; +function ($request) +{ + if (!in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { + return; + } + + $actor = $request->getAttribute('actor'); + + if ($actor->can('postWithoutThrottle')) { + return false; + } + + if ( + Post::where('user_id', $actor->id) + ->where('created_at', '>=', new DateTime('-10 seconds')) + ->exists() + ) { + return true; + } +} ``` Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.php`. For example: @@ -50,12 +55,12 @@ Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.p use Flarum\Extend; return [ - // Other extenders - (new Extend\ThrottleApi()) - ->set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders + // Other extenders + (new Extend\ThrottleApi()) + ->set('throttleAll', function () { + return false; + }) + ->remove('bypassThrottlingAttribute'), + // Other extenders ]; ``` diff --git a/docs/extend/api.md b/docs/extend/api.md index 6b12f319a..98cf9a96f 100644 --- a/docs/extend/api.md +++ b/docs/extend/api.md @@ -1,6 +1,6 @@ # API and Data Flow -In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. +In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. ## API Request Lifecycle @@ -20,7 +20,7 @@ Before we go into detail about how to extend Flarum's data API, it's worth think ## API Endpoints We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. -We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. +We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: @@ -33,12 +33,12 @@ As per the JSON:API convention, we'll want to add separate endpoints for each op We'll go over each type of controler shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: ```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) +(new Extend\Routes('api')) + ->get('/tags', 'tags.index', ListTagsController::class) + ->get('/tags/{id}', 'tags.show', ShowTagController::class) + ->post('/tags', 'tags.create', CreateTagController::class) + ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) + ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class); ``` ::: warning @@ -66,12 +66,12 @@ use Tobscure\JsonApi\Document; class ListTagsController extends AbstractListController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + return Tag::all(); + } } ``` @@ -82,7 +82,7 @@ You can allow the number of resources being **listed** to be customized by speci ```php // The number of records included by default. public $limit = 20; - + // The maximum number of records that can be requested. public $maxLimit = 50; ``` @@ -105,7 +105,7 @@ You can allow the sort order of resources being **listed** to be customized by s ```php // The default sort field and order to use. public $sort = ['name' => 'asc']; - + // The fields that are available to be sorted by. public $sortFields = ['firstName', 'lastName']; ``` @@ -117,7 +117,7 @@ $sort = $this->extractSort($request); $query = Tag::query(); foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); + $query->orderBy(snake_case($field), $order); } return $query->get(); @@ -139,14 +139,14 @@ use Tobscure\JsonApi\Document; class ShowTagController extends AbstractShowController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + return Tag::findOrFail($id); + } } ``` @@ -162,16 +162,16 @@ use Tobscure\JsonApi\Document; class CreateTagController extends AbstractCreateController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); + + return Tag::create([ + 'name' => Arr::get($attributes, 'name'), + ]); + } } ``` @@ -189,13 +189,13 @@ use Illuminate\Support\Arr; use Psr\Http\Message\ServerRequestInterface as Request; class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } +{ + protected function delete(Request $request) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + Tag::findOrFail($id)->delete(); + } } ``` @@ -206,7 +206,7 @@ To include relationships when **listing**, **showing**, or **creating** your res ```php // The relationships that are included by default. public $include = ['user']; - + // Other relationships that are available to be included. public $optionalInclude = ['discussions']; ``` @@ -229,19 +229,19 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] + (new Extend\ApiController(ListDiscussionsController::class)) + ->setSerializer(MyDiscussionSerializer::class) + ->addInclude('user') + ->addOptionalInclude('posts') + ->setLimit(20) + ->setMaxLimit(50) + ->setSort(['name' => 'asc']) + ->addSortField('firstName') + ->prepareDataQuery(function ($controller) { + // Add custom logic here to modify the controller + // before data queries are executed. + }), +]; ``` The `ApiController` extender can also be used to adjust data before serialization @@ -252,11 +252,10 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] + (new Extend\ApiController(ListDiscussionsController::class))->prepareDataForSerialization(function ($controller, $data, $request, $document) { + $data->load('myCustomRelation'); + }), +]; ``` ## Serializers @@ -275,14 +274,14 @@ use Flarum\Api\Serializer\UserSerializer; class DiscussionSerializer extends AbstractSerializer { - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } + protected $type = 'discussions'; + + protected function getDefaultAttributes($discussion) + { + return [ + 'title' => $discussion->title, + ]; + } } ``` @@ -328,4 +327,4 @@ return [ ### Non-Model Serializers and `ForumSerializer` Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. -For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. \ No newline at end of file +For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/docs/extend/authorization.md b/docs/extend/authorization.md index 24d0123ce..e356bf26b 100644 --- a/docs/extend/authorization.md +++ b/docs/extend/authorization.md @@ -44,7 +44,6 @@ Finally, as we have exhausted all checks, we will assume that the user is unauth Flarum's authorization system is accessible through public methods of the `Flarum\User\User` class. The most important ones are listed below; others are documented in our [PHP API documentation](https://api.docs.flarum.org/php/master/flarum/user/user). - In this example, we will use `$actor` as an instance of `Flarum\User\User`, `'viewDiscussions'` and `'reply'` as examples of abilities, and `$discussion` (instance of `Flarum\Discussion\Discussion`) as an example argument. ```php @@ -105,27 +104,27 @@ use Flarum\User\User; class TagPolicy extends AbstractPolicy { - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function startDiscussion(User $actor, Tag $tag) - { - if ($tag->is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function startDiscussion(User $actor, Tag $tag) + { + if ($tag->is_restricted) { + return $actor->hasPermission('tag' . $tag->id . '.startDiscussion') ? $this->allow() : $this->deny(); } + } + + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function addToDiscussion(User $actor, Tag $tag) + { + return $this->startDiscussion($actor, $tag); + } } ``` @@ -143,34 +142,34 @@ use Flarum\User\User; class GlobalPolicy extends AbstractPolicy { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } + + /** + * @param Flarum\User\User $actor + * @param string $ability + * @return bool|void + */ + public function can(User $actor, string $ability) + { + if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { + $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); + $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); + + if ($enoughPrimary && $enoughSecondary) { + return $this->allow(); + } else { + return $this->deny(); + } } + } } ``` @@ -185,9 +184,7 @@ use YourNamespace\Access; return [ // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), + (new Extend\Policy())->modelPolicy(Tag::class, Access\TagPolicy::class)->globalPolicy(Access\GlobalPolicy::class), // Other extenders ]; ``` @@ -233,8 +230,6 @@ There are actually two types of scopers: - ability-based scopers will apply to all queries for the query's model run with a given ability (which defaults to `"view"`). Please note this is not related to ability strings from the [policy system](#how-it-works) - "global" scopers will apply to all queries for the query's model. Please note that global scopers will be run on ALL queries for its model, including `view`, which could create infinite loops or errors. Generally, you only want to run these for abilities that don't begin with `view`. You'll see this in the [example below](#custom-visibility-scoper-examples) - - One common use case for this is allowing extensibility inside visibility scoping. Let's take a look at an annotated, simple piece of `Flarum\Post\PostPolicy` as an example: @@ -246,10 +241,9 @@ $query->where('posts.is_private', false); // However, we recognize that some extensions might have valid use cases for showing private posts. // So instead, we include all posts that aren't private, AND all private posts desired by extensions $query->where(function ($query) use ($actor) { - $query->where('posts.is_private', false) - ->orWhere(function ($query) use ($actor) { - $query->whereVisibleTo($actor, 'viewPrivate'); - }); + $query->where('posts.is_private', false)->orWhere(function ($query) use ($actor) { + $query->whereVisibleTo($actor, 'viewPrivate'); + }); }); ``` @@ -264,12 +258,12 @@ use Illuminate\Database\Eloquent\Builder; class ScopePostVisibility { - public function __invoke(User $actor, $query) - { - if ($actor->can('posts.viewPrivate')) { - $query->whereRaw("1=1"); - } + public function __invoke(User $actor, $query) + { + if ($actor->can('posts.viewPrivate')) { + $query->whereRaw('1=1'); } + } } ``` @@ -292,14 +286,14 @@ use Illuminate\Database\Eloquent\Builder; class ScopeTagVisibility { - /** - * @param User $actor - * @param Builder $query - */ - public function __invoke(User $actor, Builder $query) - { - $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); - } + /** + * @param User $actor + * @param Builder $query + */ + public function __invoke(User $actor, Builder $query) + { + $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); + } } ``` @@ -316,26 +310,27 @@ use Illuminate\Database\Eloquent\Builder; class ScopeDiscussionVisibilityForAbility { - /** - * @param User $actor - * @param Builder $query - * @param string $ability - */ - public function __invoke(User $actor, Builder $query, $ability) - { - if (substr($ability, 0, 4) === 'view') { - return; - } - - // If a discussion requires a certain permission in order for it to be - // visible, then we can check if the user has been granted that - // permission for any of the discussion's tags. - $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { - return $query->select('discussion_id') - ->from('discussion_tag') - ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.'.$ability)); - }); + /** + * @param User $actor + * @param Builder $query + * @param string $ability + */ + public function __invoke(User $actor, Builder $query, $ability) + { + if (substr($ability, 0, 4) === 'view') { + return; } + + // If a discussion requires a certain permission in order for it to be + // visible, then we can check if the user has been granted that + // permission for any of the discussion's tags. + $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { + return $query + ->select('discussion_id') + ->from('discussion_tag') + ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.' . $ability)); + }); + } } ``` @@ -343,8 +338,6 @@ Note that, as mentioned above, we don't run this for abilities starting with `vi ### Registering Custom Visibility Scopers - - ```php use Flarum\Extend; use Flarum\Discussion\Discussion; @@ -357,11 +350,9 @@ return [ // 'view' is optional here, since that's the default value for the ability argument. // However, if we were applying this to a different ability, such as `viewPrivate`, // would need to explicitly specify that. - (new Extend\ModelVisibility(Tag::class)) - ->scope(Access\ScopeTagVisibility::class, 'view'), + (new Extend\ModelVisibility(Tag::class))->scope(Access\ScopeTagVisibility::class, 'view'), - (new Extend\ModelVisibility(Discussion::class)) - ->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), + (new Extend\ModelVisibility(Discussion::class))->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), // Other extenders ]; ``` diff --git a/docs/extend/backend-events.md b/docs/extend/backend-events.md index fe8822679..4764acc2a 100644 --- a/docs/extend/backend-events.md +++ b/docs/extend/backend-events.md @@ -19,23 +19,21 @@ use Flarum\Extend; use Flarum\Post\Event\Deleted; use Symfony\Contracts\Translation\TranslatorInterface; - return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) + (new Extend\Event()) + ->listen(Deleted::class, function ($event) { + // do something here + }) + ->listen(Deleted::class, PostDeletedListener::class), ]; - class PostDeletedListener { protected $translator; public function __construct(TranslatorInterface $translator) { - $this->translator = $translator; + $this->translator = $translator; } public function handle(Deleted $event) @@ -55,12 +53,7 @@ use Flarum\Post\Event\Deleted; use Flarum\Post\Event\Saving; use Symfony\Contracts\Translation\TranslatorInterface; - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; - +return [(new Extend\Event())->subscribe(PostEventSubscriber::class)]; class PostEventSubscriber { @@ -68,7 +61,7 @@ class PostEventSubscriber public function __construct(TranslatorInterface $translator) { - $this->translator = $translator; + $this->translator = $translator; } public function subscribe($events) @@ -97,30 +90,27 @@ Dispatching events is very simple. All you need to do is inject `Illuminate\Cont use Flarum\Post\Event\Deleted; use Illuminate\Contracts\Events\Dispatcher; - class SomeClass { - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } + /** + * @var Dispatcher + */ + protected $events; + + /** + * @param Dispatcher $events + */ + public function __construct(Dispatcher $events) + { + $this->events = $events; + } + + public function someMethod() + { + // Logic + $this->events->dispatch(new Deleted($somePost, $someActor)); + // More Logic + } } ``` @@ -147,24 +137,24 @@ use Flarum\User\User; class Deleted { - /** - * @var Post - */ - public $post; - - /** - * @var User - */ - public $actor; - - /** - * @param Post $post - * @param User $user - */ - public function __construct(Post $post, User $actor = null) - { - $this->post = $post; - $this->actor = $actor; - } + /** + * @var Post + */ + public $post; + + /** + * @var User + */ + public $actor; + + /** + * @param Post $post + * @param User $user + */ + public function __construct(Post $post, User $actor = null) + { + $this->post = $post; + $this->actor = $actor; + } } ``` diff --git a/docs/extend/console.md b/docs/extend/console.md index e2f363ea3..24c2967c6 100644 --- a/docs/extend/console.md +++ b/docs/extend/console.md @@ -10,12 +10,11 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -class YourCommand extends AbstractCommand { +class YourCommand extends AbstractCommand +{ protected function configure() { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); + $this->setName('YOUR COMMAND NAME')->setDescription('YOUR COMMAND DESCRIPTION'); } protected function fire() { @@ -34,7 +33,7 @@ use YourNamespace\Console\CustomCommand; return [ // Other extenders - (new Extend\Console())->command(CustomCommand::class) + (new Extend\Console())->command(CustomCommand::class), // Other extenders ]; ``` diff --git a/docs/extend/distribution.md b/docs/extend/distribution.md index 9f5f82566..11f29c239 100644 --- a/docs/extend/distribution.md +++ b/docs/extend/distribution.md @@ -38,4 +38,4 @@ You will most likely want to create a discussion on the Flarum Community in the ```bash composer require vendor/package -``` \ No newline at end of file +``` diff --git a/docs/extend/extending-extensions.md b/docs/extend/extending-extensions.md index 0fc9156ca..e9a549c8d 100644 --- a/docs/extend/extending-extensions.md +++ b/docs/extend/extending-extensions.md @@ -24,9 +24,9 @@ For example, if you were building a new theme for the Flarum Tags extension, you { // ... "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, + "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. + "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. + } // ... } ``` @@ -41,7 +41,7 @@ The first step here is detecting whether extension B is enabled. In the frontend ```js if ('some-extension-id' in flarum.extensions) { - // do something + // do something } ``` @@ -52,18 +52,19 @@ In the backend, you'll need to inject an instance of `Flarum\Extension\Extension use Flarum\Extension\ExtensionManager; -class SomeClass { - public function __construct(ExtensionManager $extensions) - { - $this->extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } +class SomeClass +{ + public function __construct(ExtensionManager $extensions) + { + $this->extensions = $extensions; + } + + public function someMethod() + { + if ($this->extensions->isEnabled('some-extension-id')) { + // do something. } + } } ``` @@ -77,11 +78,9 @@ For instance: // ... "extra": { "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] + "optional-dependencies": ["flarum/tags"] } - }, + } // ... } ``` @@ -97,10 +96,10 @@ use Flarum\Tags\Tag; class SomeClass { - public function someMethod() - { - return new Tag(); // This is not the correct way to instantiate models, it's just here for example of importing. - } + public function someMethod() + { + return new Tag(); // This is not the correct way to instantiate models, it's just here for example of importing. + } } ``` @@ -112,9 +111,9 @@ In the frontend, you can only import things that have been explicitly exported. ```js module.exports = require('flarum-webpack-config')({ - // Provide the extension IDs of all extensions from which your extension will be importing. - // Do this for both full and optional dependencies. - useExtensions: ['flarum-tags'] + // Provide the extension IDs of all extensions from which your extension will be importing. + // Do this for both full and optional dependencies. + useExtensions: ['flarum-tags'], }); ``` diff --git a/docs/extend/extensibility.md b/docs/extend/extensibility.md index 67cf2de80..39d84cb55 100644 --- a/docs/extend/extensibility.md +++ b/docs/extend/extensibility.md @@ -23,8 +23,10 @@ A custom extender could be a good way to accomplish this. The implementation of extenders is actually quite simple. There are 3 main steps: 1. Various methods (and the constructor) allow client code to specify options. For example: - - Which model / API controller / validator should be extended? - - What modifications should be made? + +- Which model / API controller / validator should be extended? +- What modifications should be made? + 2. An `extend` method takes the input from step 1, and applies it by modifying various [container bindings](service-provider.md) and global static variables to achieve the desired effect. This is the "implementation" of the composer. The `extend` methods for all enabled extensions are run as part of Flarum's boot process. 3. Optionally, extenders implementing `Flarum\Extend\LifecycleInterface` can have `onEnable` and `onDisable` methods, which are run when extensions that use the extender are enabled/disabled, and are useful for tasks like clearing various caches. @@ -60,9 +62,8 @@ For example: ```js app.initializers.add('your-extension-id', () => { // Your Extension Code Here -}) +}); -export { - // Put all the stuff you want to export here. -} +export // Put all the stuff you want to export here. + {}; ``` diff --git a/docs/extend/formatting.md b/docs/extend/formatting.md index d4ea23b12..8d907a741 100644 --- a/docs/extend/formatting.md +++ b/docs/extend/formatting.md @@ -16,26 +16,26 @@ use s9e\TextFormatter\Parser; use s9e\TextFormatter\Renderer; return [ - (new Extend\Formatter) - // Add custom text formatter configuration - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modify raw text before it is parsed. - // This callback should return the modified text. - ->parse(function (Parser $parser, $context, $text) { - // custom logic here - return $newText; - }) - // Modify the XML to be rendered before rendering. - // This callback should return the new XML. - // For example, in the mentions extension, this is used to - // provide the username and display name of the user being mentioned. - // Make sure that the last $request argument is nullable (or omitted entirely). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // custom logic here - return $newXml; - }) + (new Extend\Formatter()) + // Add custom text formatter configuration + ->configure(function (Configurator $config) { + $config->BBCodes->addFromRepository('B'); + }) + // Modify raw text before it is parsed. + // This callback should return the modified text. + ->parse(function (Parser $parser, $context, $text) { + // custom logic here + return $newText; + }) + // Modify the XML to be rendered before rendering. + // This callback should return the new XML. + // For example, in the mentions extension, this is used to + // provide the username and display name of the user being mentioned. + // Make sure that the last $request argument is nullable (or omitted entirely). + ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { + // custom logic here + return $newXml; + }), ]; ``` diff --git a/docs/extend/forms.md b/docs/extend/forms.md index 803793b17..52dadc879 100644 --- a/docs/extend/forms.md +++ b/docs/extend/forms.md @@ -21,10 +21,9 @@ import FieldSet from 'flarum/common/components/FieldSet'; import Button from 'flarum/common/components/Button'; import Switch from 'flarum/common/components/Switch'; - class FormComponent extends Component { oninit(vnode) { - this.textInput = ""; + this.textInput = ''; this.booleanInput = false; } @@ -32,14 +31,12 @@ class FormComponent extends Component { return ( <form onsubmit={this.onsubmit.bind(this)}> <FieldSet label={app.translator.trans('fake-extension.form.fieldset_label')}> - <input className="FormControl" value={this.textInput} oninput={e => this.textInput = e.target.value}> - </input> - <Switch state={this.booleanInput} onchange={val => this.booleanInput = val}> - </Switch> + <input className="FormControl" value={this.textInput} oninput={(e) => (this.textInput = e.target.value)}></input> + <Switch state={this.booleanInput} onchange={(val) => (this.booleanInput = val)}></Switch> </FieldSet> <Button type="submit">{app.translator.trans('core.admin.basics.submit_button')}</Button> </form> - ) + ); } onsubmit() { @@ -50,7 +47,6 @@ class FormComponent extends Component { Don't forget to use [translations](translate.md)! - ## Streams, bidi, and withAttr Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/common/util/Stream`. @@ -60,11 +56,10 @@ Its basic usage is: ```js import Stream from 'flarum/common/utils/Stream'; - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true +const value = Stream('hello!'); +value() === 'hello!'; // true +value('world!'); +value() === 'world!'; // true ``` In Flarum forms, streams are frequently used together with the bidi attr. diff --git a/docs/extend/frontend-pages.md b/docs/extend/frontend-pages.md index 33ac5f472..5c61f9cbe 100644 --- a/docs/extend/frontend-pages.md +++ b/docs/extend/frontend-pages.md @@ -18,10 +18,9 @@ Page components work just like any other inherited component. For a (very simple ```js import Page from 'flarum/common/components/Page'; - export default class CustomPage extends Page { view() { - return <p>Hello!</p> + return <p>Hello!</p>; } } ``` @@ -37,11 +36,11 @@ An example from the [Tags extension](https://github.com/flarum/tags/blob/master/ import { extend } from 'flarum/common/extend'; import BasicsPage from 'flarum/common/components/BasicsPage'; -export default function() { - extend(BasicsPage.prototype, 'homePageItems', items => { +export default function () { + extend(BasicsPage.prototype, 'homePageItems', (items) => { items.add('tags', { path: '/tags', - label: app.translator.trans('flarum-tags.admin.basics.tags_label') + label: app.translator.trans('flarum-tags.admin.basics.tags_label'), }); }); } @@ -61,12 +60,11 @@ For example: ```js import Page from 'flarum/common/components/Page'; - export default class CustomPage extends Page { oncreate(vnode) { super.oncreate(vnode); - app.setTitle("Cool Page"); + app.setTitle('Cool Page'); app.setTitleCount(0); } @@ -79,10 +77,10 @@ export default class CustomPageLoadsData extends Page { oninit(vnode) { super.oninit(vnode); - app.store.find("users", 1).then(user => { + app.store.find('users', 1).then((user) => { app.setTitle(user.displayName()); app.setTitleCount(0); - }) + }); } view() { @@ -122,7 +120,7 @@ import DiscussionPage from 'flarum/forum/components/DiscussionPage'; app.current.matches(DiscussionPage); // To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); +app.current.matches(IndexPage, { routeName: 'following' }); ``` ## Admin Pages @@ -154,19 +152,22 @@ import CustomPage from './components/CustomPage'; import CustomPageResolver from './resolvers/CustomPageResolver'; // Use a route resolver instance -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; +app.routes['resolverInstance'] = { + path: '/custom/path/1', + resolver: { + onmatch: function (args) { + if (!app.session.user) return m.route.SKIP; - return CustomPage; - } -}}; + return CustomPage; + }, + }, +}; // Use a custom route resolver class -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage }; // Use the default resolver class (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', component: CustomPage }; ``` ### Custom Resolvers diff --git a/docs/extend/frontend.md b/docs/extend/frontend.md index 7bf3ec7e5..41a4d7c90 100644 --- a/docs/extend/frontend.md +++ b/docs/extend/frontend.md @@ -6,8 +6,8 @@ This page describes how to make changes to Flarum's user interface. How to add b Flarum has two separate frontend applications: -* `forum`, the public side of your forum where users create discussions and posts. -* `admin`, the private side of your forum where, as an administrator of your forum, you configure your Flarum installation. +- `forum`, the public side of your forum where users create discussions and posts. +- `admin`, the private side of your forum where, as an administrator of your forum, you configure your Flarum installation. They share the same foundational code, so once you know how to extend one, you know how to extend both. @@ -25,8 +25,8 @@ Before we can write any JavaScript, we need to set up a **transpiler**. This all In order to do this transpilation, you need to be working in a capable environment. No, not the home/office kind of environment – you can work in the bathroom for all I care! I'm talking about the tools that are installed on your system. You'll need: -* Node.js and npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) +- Node.js and npm ([Download](https://nodejs.org/en/download/)) +- Webpack (`npm install -g webpack`) This can be tricky because everyone's system is different. From the OS you're using, to the program versions you have installed, to the user access permissions – I get chills just thinking about it! If you run into trouble, ~~tell him I said hi~~ use [Google](https://google.com) to see if someone has encountered the same error as you and found a solution. If not, ask for help from the [Flarum Community](https://discuss.flarum.org) or on the [Discord chat](https://flarum.org/discord/). @@ -56,7 +56,7 @@ js "webpack-cli": "^3.0.7" }, "dev-dependencies": { - "flarum": "0.1.0-beta.16", + "flarum": "0.1.0-beta.16" }, "scripts": { "dev": "webpack --mode development --watch", @@ -114,13 +114,13 @@ Please note that this is all simply a recommendation: there's nothing forcing yo The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: ```js -import {extend, override} from 'flarum/common/extend'; +import { extend, override } from 'flarum/common/extend'; // We provide our extension code in the form of an "initializer". // This is a callback that will run after the core has booted. -app.initializers.add('our-extension', function(app) { +app.initializers.add('our-extension', function (app) { // Your Extension Code Here - console.log("EXTENSION NAME is working!"); + console.log('EXTENSION NAME is working!'); }); ``` @@ -130,13 +130,13 @@ We'll go over tools available for extensions below. You should familiarize yourself with proper syntax for [importing js modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), as most extensions larger than a few lines will split their js into multiple files. -Pretty much every Flarum extension will need to import *something* from Flarum Core. +Pretty much every Flarum extension will need to import _something_ from Flarum Core. Like most extensions, core's JS source code is split up into `admin`, `common`, and `forum` folders. You can import the file by prefixing its path in the Flarum core source code with `flarum`. So `admin/components/AdminLinkButton` is available as `flarum/admin/components/AdminLinkButton`, `common/Component` is available as `flarum/common/Component`, and `forum/states/PostStreamState` is available as `flarum/forum/states/PostStreamState`. In some cases, an extension may want to extend code from another flarum extension. This is only possible for extensions which explicitly export their contents. -* `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. +- `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). +- The process for extending each community extension is different; you should consult documentation for each individual extension. ### Transpilation @@ -162,10 +162,7 @@ In order for your extension's JavaScript to be loaded into the frontend, we need use Flarum\Extend; -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') -]; +return [(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')]; ``` Flarum will make anything you `export` from `forum.js` available in the global `flarum.extensions['acme-hello-world']` object. Thus, you may choose to expose your own public API for other extensions to interact with. @@ -181,9 +178,7 @@ Only one main JavaScript file per extension is permitted. If you need to include You can also add CSS and [LESS](https://lesscss.org/features/) assets to the frontend using the `Frontend` extender's `css` method: ```php - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') +(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')->css(__DIR__ . '/less/forum.less'); ``` ::: tip @@ -200,11 +195,11 @@ The crux of it is that Flarum generates virtual DOM elements which are a JavaScr Because the interface is built with JavaScript, it's really easy to hook in and make changes. All you need to do is find the right extender for the part of the interface you want to change, and then add your own virtual DOM into the mix. -Most mutable parts of the interface are really just *lists of items*. For example: +Most mutable parts of the interface are really just _lists of items_. For example: -* The controls that appear on each post (Reply, Like, Edit, Delete) -* The index sidebar navigation items (All Discussions, Following, Tags) -* The items in the header (Search, Notifications, User menu) +- The controls that appear on each post (Reply, Like, Edit, Delete) +- The index sidebar navigation items (All Discussions, Following, Tags) +- The items in the header (Search, Notifications, User menu) Each item in these lists is given a **name** so you can easily add, remove, and rearrange the items. Simply find the appropriate component for the part of the interface you want to change, and monkey-patch its methods to modify the item list contents. For example, to add a link to Google in the header: @@ -212,7 +207,7 @@ Each item in these lists is given a **name** so you can easily add, remove, and import { extend } from 'flarum/common/extend'; import HeaderPrimary from 'flarum/forum/components/HeaderPrimary'; -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add('google', <a href="https://google.com">Google</a>); }); ``` @@ -240,13 +235,13 @@ DiscussionPage You should familiarize yourself with [Mithril's component API](https://mithril.js.org/components.html) and [redraw system](https://mithril.js.org/autoredraw.html). Flarum wraps components in the `flarum/common/Component` class, which extends Mithril's [class components](https://mithril.js.org/components.html#classes). It provides the following benefits: -* Attributes passed to components are available throughout the class via `this.attrs`. -* The static `initAttrs` method mutates `this.attrs` before setting them, and allows you to set defaults or otherwise modify them before using them in your class. Please note that this doesn't affect the initial `vnode.attrs`. -* The `$` method returns a jQuery object for the component's root DOM element. You can optionally pass a selector to get DOM children. -* the `component` static method can be used as an alternative to JSX and the `m` hyperscript. The following are equivalent: - * `m(CustomComponentClass, attrs, children)` - * `CustomComponentClass.component(attrs, children)` - * `<CustomComponentClass {...attrs}>{children}</CustomComponentClass>` +- Attributes passed to components are available throughout the class via `this.attrs`. +- The static `initAttrs` method mutates `this.attrs` before setting them, and allows you to set defaults or otherwise modify them before using them in your class. Please note that this doesn't affect the initial `vnode.attrs`. +- The `$` method returns a jQuery object for the component's root DOM element. You can optionally pass a selector to get DOM children. +- the `component` static method can be used as an alternative to JSX and the `m` hyperscript. The following are equivalent: + - `m(CustomComponentClass, attrs, children)` + - `CustomComponentClass.component(attrs, children)` + - `<CustomComponentClass {...attrs}>{children}</CustomComponentClass>` However, component classes extending `Component` must call `super` when using the `oninit`, `oncreate`, and `onbeforeupdate` methods. @@ -269,9 +264,7 @@ class Counter extends Component { return ( <div> Count: {this.count} - <button onclick={e => this.count++}> - {this.attrs.buttonLabel} - </button> + <button onclick={(e) => this.count++}>{this.attrs.buttonLabel}</button> </div> ); } @@ -304,14 +297,14 @@ Pretty much all frontend extensions use [monkey patching](https://en.wikipedia.o ```jsx // This adds an attribute to the `app` global. -app.googleUrl = "https://google.com"; +app.googleUrl = 'https://google.com'; // This replaces the output of the discussion page with "Hello World" import DiscussionPage from 'flarum/forum/components/DiscussionPage'; -DiscussionPage.prototype.view = function() { +DiscussionPage.prototype.view = function () { return <p>Hello World</p>; -} +}; ``` ...will turn Flarum's discussion pages into proclamations of "Hello World". How creative! @@ -329,7 +322,9 @@ In most cases, we don't actually want to completely replace the methods we are m With `extend` and `override`, you can also pass an array of multiple methods that you want to patch. This will apply the same modifications to all of the methods you provide: ```jsx -extend(IndexPage.prototype, ['oncreate', 'onupdate'], () => { /* your logic */ }); +extend(IndexPage.prototype, ['oncreate', 'onupdate'], () => { + /* your logic */ +}); ``` ::: @@ -349,7 +344,7 @@ import CustomComponentClass from './components/CustomComponentClass'; // Here, we add an item to the returned ItemList. We are using a custom component // as discussed above. We've also specified a priority as the third argument, // which will be used to order these items. Note that we don't need to return anything. -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add( 'google', <CustomComponentClass> @@ -362,7 +357,7 @@ extend(HeaderPrimary.prototype, 'items', function(items) { // Here, we conditionally use the original output of a method, // or create our own ItemList, and then add an item to it. // Note that we MUST return our custom output. -override(HeaderPrimary.prototype, 'items', function(original) { +override(HeaderPrimary.prototype, 'items', function (original) { let items; if (someArbitraryCondition) { @@ -380,8 +375,8 @@ override(HeaderPrimary.prototype, 'items', function(original) { Since all Flarum components and utils are represented by classes, `extend`, `override`, and regular old JS mean that we can hook into, or replace, ANY method in any part of Flarum. Some potential "advanced" uses include: -* Extending or overriding `view` to change (or completely redefine) the html structure of Flarum components. This opens Flarum up to unlimited theming -* Hooking into Mithril component methods to add JS event listeners, or otherwise redefine business logic. +- Extending or overriding `view` to change (or completely redefine) the html structure of Flarum components. This opens Flarum up to unlimited theming +- Hooking into Mithril component methods to add JS event listeners, or otherwise redefine business logic. ### Flarum Utils diff --git a/docs/extend/i18n.md b/docs/extend/i18n.md index c926d705e..6a30d413a 100644 --- a/docs/extend/i18n.md +++ b/docs/extend/i18n.md @@ -23,7 +23,7 @@ Since English translations could be the only thing standing between forum users ## Locale File -Flarum's language resources use the [YAML](https://en.wikipedia.org/wiki/YAML) file format. The locale files for a third-party extension need to be stored in the extension's `locale` folder. Each locale file should be named using the [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for the language it contains. For example, a file containing French translations should be named "`fr.yml`". +Flarum's language resources use the [YAML](https://en.wikipedia.org/wiki/YAML) file format. The locale files for a third-party extension need to be stored in the extension's `locale` folder. Each locale file should be named using the [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for the language it contains. For example, a file containing French translations should be named "`fr.yml`". ::: tip @@ -48,15 +48,16 @@ Additional keys can be used to divide the extension namespace into groups. This Each namespacing key should also be followed by a colon. Keys should be nested according to the YAML outline format, adding two spaces of indentation for each level in the hierarchy. Put this all together, and the locale file for the [Quick Start tutorial](start.md) might look something like this: ```yaml -acme-hello-world: # Namespacing for the extension; unindented. - alert: # Namespacing for alerts; indented 2 spaces. - hello_text: "Hello, world!" # Identifier/translation; indented 4 spaces. +acme-hello-world: # Namespacing for the extension; unindented. + alert: # Namespacing for alerts; indented 2 spaces. + hello_text: 'Hello, world!' # Identifier/translation; indented 4 spaces. ``` Once you have this information in place, you can form the **full translation key** that you will use to access a translation by listing its keys in order from extension namespace to an identifier, with periods as delimiters. For example, the full translation key for the "Hello, world!" translation would be: ```javascript -'acme-hello-world.alert.hello_text' +'acme-hello-world.alert.hello_text'; + ``` That's really all you need to know about the mechanics of key creation. Please be aware, however, that there is a standard format that developers need to follow when creating language resources for Flarum. The rules for [namespacing translations](#namespacing-translations) and [naming ID keys](#naming-id-keys) may be found in Appendix A. @@ -75,7 +76,7 @@ You may have noticed that only one of the two sample translations in the previou Since Flarum uses curly brackets and angle brackets to denote placeholders for [variables](#including-variables) and [HTML tags](#html-tags), respectively, it goes without saying that any translation that includes such placeholders will also need to be enclosed in double quotes. -Furthermore, you should use **single quotes** to enclose any translation that includes one or more double quote (`"`) or backslash (`\`) characters. This rule takes precedence! So if a translation were to include both double quotes and one or more characters from the list above — as does [this example](#including-variables), in which a variable placeholder is set off by quotation marks — you would need to enclose it in *single quotes*. +Furthermore, you should use **single quotes** to enclose any translation that includes one or more double quote (`"`) or backslash (`\`) characters. This rule takes precedence! So if a translation were to include both double quotes and one or more characters from the list above — as does [this example](#including-variables), in which a variable placeholder is set off by quotation marks — you would need to enclose it in _single quotes_. ::: @@ -91,6 +92,7 @@ literal_block_text: | Quote marks are unnecessary, even when the block contains special characters. ``` + The literal block ends with the last line to be indented at least two spaces more than the ID key. Quotation marks are not needed because the block is effectively delimited by this extra two spaces of indentation. Flarum's core language resources employ literal blocks mainly for email body content. @@ -102,13 +104,13 @@ It's not uncommon to use the same bit of text in more than one location or conte - As a **button** that users can click when they want to edit some stuff - As the **title** of a dialog box displayed when users click that button -Your instinct might be to add a single translation — let's call it "`edit_stuff`" — and use that ID key twice in your code. This approach is efficient, but it lacks flexibility: in some languages, it may not be possible to use the same phrase for both the button and the dialog title! A better way would be to define *two* keys for use in your code, then set them both to reference the same translation, like so: +Your instinct might be to add a single translation — let's call it "`edit_stuff`" — and use that ID key twice in your code. This approach is efficient, but it lacks flexibility: in some languages, it may not be possible to use the same phrase for both the button and the dialog title! A better way would be to define _two_ keys for use in your code, then set them both to reference the same translation, like so: ```yaml -edit_stuff_button: => edit_stuff # Used in the code that creates the button. -edit_stuff_title: => edit_stuff # Used in the code that creates the dialog. +edit_stuff_button: => edit_stuff # Used in the code that creates the button. +edit_stuff_title: => edit_stuff # Used in the code that creates the dialog. -edit_stuff: Edit Stuff # Not used in the code. +edit_stuff: Edit Stuff # Not used in the code. ``` You can set one key to reference another by replacing its translation with an equal sign (`=`), a greater-than sign (`>`), and a space, followed by the full translation key to be referenced. When the extension is installed, Flarum's compiler will resolve these references to create a complete set of translations it can use. @@ -120,7 +122,7 @@ There's more to be said about referencing — for one thing, we've totally i Once you've added a translation to your locale file, with appropriate namespacing and identifier keys, you can use the `app.translator.trans()` method to reference that translation in your code. For instance, the `js/forum/src/index.js` file for the [Quick Start tutorial](start.md) might end up looking like this: ```javascript -app.initializers.add('acme-hello-world', function() { +app.initializers.add('acme-hello-world', function () { alert(app.translator.trans('acme-hello-world.alert.hello_text')); }); ``` @@ -132,11 +134,13 @@ This shows the basic translation method, with no bells or whistles attached. Bel You can include variables in translations. As an example, let's look at the code that creates the first item in Flarum's [search results dropdown](https://github.com/flarum/core/blob/master/js/src/forum/components/DiscussionsSearchSource.js). This button quotes the search query entered by the user — information that is passed to the translator along with the translation key, as an additional parameter: ```jsx harmony -{LinkButton.component({ - icon: 'search', - children: app.translator.trans('all_discussions_button', {query}), - href: app.route('index', {q: query}) -})} +{ + LinkButton.component({ + icon: 'search', + children: app.translator.trans('all_discussions_button', { query }), + href: app.route('index', { q: query }), + }); +} ``` A matching placeholder in the translation lets the translator know where it should insert the variable: @@ -156,7 +160,7 @@ You begin by adding a key to the parameters argument for each element that you w ```jsx harmony <div className="helpText"> {app.translator.trans('icon_text', { - a: <a href="https://fortawesome.github.io/Font-Awesome/icons/" tabindex="-1"/> + a: <a href="https://fortawesome.github.io/Font-Awesome/icons/" tabindex="-1" />, })} </div> ``` @@ -165,7 +169,7 @@ Note that each parameter is defined using a single HTML tag, with a slash added You can see that not all tags are passed as an argument, only those who have attributes. ```yaml -icon_text: "Enter the name of any <a>FontAwesome</a> icon class, <em>without</em> the <code>fa-</code> prefix." +icon_text: 'Enter the name of any <a>FontAwesome</a> icon class, <em>without</em> the <code>fa-</code> prefix.' ``` Of course, you can give a parameter any name you like — you could use `<fred>` and `</fred>` to enclose your link text if you really wanted to! But we recommend sticking as close as possible to the actual HTML tags being represented, so your localizers will be able to understand what's going on. @@ -178,11 +182,7 @@ On occasion, you may need to provide alternate versions of a translation to acco ```js const remaining = this.minPrimary - primaryCount; -return app.translator.transChoice( - 'choose_primary_placeholder', - remaining, - { count: remaining } -); +return app.translator.transChoice('choose_primary_placeholder', remaining, { count: remaining }); ``` This example is from the [Choose Tags modal](https://github.com/flarum/tags/blob/master/js/src/forum/components/TagDiscussionModal.js) of the Tags extension, where it tells the user how many more primary tags can be selected. Note that the `remaining` variable is passed to the translator **twice**. First, it appears as itself, to condition the pluralization of the word "tags". Then it appears again as the value of the `count` parameter, which the translator can use to insert that value in the translation. @@ -190,7 +190,7 @@ This example is from the [Choose Tags modal](https://github.com/flarum/tags/blob When the `app.translator.transChoice()` method is called, the translator scans the translation for a variant that matches the sort of pluralization required by the value of the variable. These variants need to be listed serially — singular form first, then plural forms in order of increasing magnitude — and separated using the vertical line (`|`) character. Here's the English translation for the above code: ```yaml -choose_primary_placeholder: "Choose a primary tag|Choose {count} primary tags" +choose_primary_placeholder: 'Choose a primary tag|Choose {count} primary tags' ``` Of course English has only two variants: singular or plural. You'll need to provide additional variants when creating translations for a language that has more than one plural form. If you need detailed information about the number of variants required for a language — or the order in which they should be listed — you can refer directly to the [pluralization rules](https://github.com/symfony/symfony/blob/3.3/src/Symfony/Component/Translation/PluralizationRules.php) that Flarum uses to map the variable to plural forms. @@ -230,43 +230,44 @@ Developers who wish to contribute to the development of Flarum are expected to f ### Namespacing Translations -All translations are to be organized in categories, using namespacing keys arranged in up to **three** levels. Each level provides localizers with an important bit of information about *where the translation is used:* +All translations are to be organized in categories, using namespacing keys arranged in up to **three** levels. Each level provides localizers with an important bit of information about _where the translation is used:_ -#### ➡ The top-level key indicates *which component uses the translation*. +#### ➡ The top-level key indicates _which component uses the translation_. The namespacing for translation keys used in official Flarum components, including bundled extensions, should match the name of the language pack locale file for the component in question. The namespaces for Flarum's non-extension components are fixed as shown below: ```yaml -core: # Translations used by the Flarum core -validation: # Translations used by Laravel's validator +core: # Translations used by the Flarum core +validation: # Translations used by Laravel's validator ``` Translation keys used in an extension — including any third-party extension — need to be namespaced using the extension's name in `vendor-package` format where the `flarum-` and `flarum-ext-` prefixes are stripped from the `package` (e.g, `flarum-tags` for the Tags extension and `foo-bar` for a `foo/flarum-ext-bar` extension). There should be only **one** first-level prefix in any locale file; it should be the first line in the locale file. -#### ➡ The second-level key indicates *which interface uses the translation*. +#### ➡ The second-level key indicates _which interface uses the translation_. Since Flarum doesn't have all that many interfaces, we've come up with a short list of second-level keys for you to choose from. We've included the more frequently used ones in the locale file template created with the extension skeleton. Below you will find the complete list, with explanations: ```yaml -admin: # Translations used by the admin interface. -forum: # Translations used by the forum user interface. -lib: # Translations used by either of the above. -views: # Translations used outside the normal JS client. -api: # Translations used in messages output by the API. -email: # Translations used in emails sent by Flarum. +admin: # Translations used by the admin interface. +forum: # Translations used by the forum user interface. +lib: # Translations used by either of the above. +views: # Translations used outside the normal JS client. +api: # Translations used in messages output by the API. +email: # Translations used in emails sent by Flarum. ``` + The first four keys correspond roughly to the directories containing the code where the translations in that namespace will be used. (Most of your keys will probably go in `admin` or `forum`.) The remaining two keys are a bit different: the `api` namespace is for translations used in messages output by the API, while the `email` namespace contains the resources for all emails sent by the forum. ```yaml -ref: # Translations referenced by more than one key. -group: # Translations used as default group names. +ref: # Translations referenced by more than one key. +group: # Translations used as default group names. ``` These two keys don't correspond to interfaces; they're for translations that require special handling. We'll explain how to use the `ref` namespace when we talk about [reusing translations](#reusing-translations). The `group` namespace holds the default group names, which are translated by the server rather than at the front end. -#### ➡ The third-level key indicates *which part of the UI uses the translation*. +#### ➡ The third-level key indicates _which part of the UI uses the translation_. The keys in this level are not so rigidly defined. Their main purpose is to chop the UI up into manageable chunks, so localizers can find the translations and see for themselves how they are used by the software. (Third-level keys aren't used in the `ref` and `group` namespaces, which don't need chopping.) @@ -280,42 +281,42 @@ As a general rule, third-level keys should be short — no more than one or Like the third-level namespacing keys, identifier keys should be expressed in `snake_case`. ID keys should be arranged in alphabetical order within each namespace, so they'll be easy for developers to find. (There is one exception to this rule! ID keys in the `email` namespace should be listed just as they appear in your mail client: `subject` first, then `body`.) -The typical ID key consists of two parts — a **root** and a **suffix** — each of which may be omitted in certain circumstances. Just as the namespacing keys tell localizers *where the translation is used*, each part of the ID key provides a further bit of information about the translation: +The typical ID key consists of two parts — a **root** and a **suffix** — each of which may be omitted in certain circumstances. Just as the namespacing keys tell localizers _where the translation is used_, each part of the ID key provides a further bit of information about the translation: -#### ➡ The suffix indicates *how the translation is used*. +#### ➡ The suffix indicates _how the translation is used_. We'll start with the suffix because it's the most important part of the key name. It tells localizers what sort of object they should look for when trying to find the translation in the interface. For example, the suffixes in the following list are used for GUI objects more or less related to user operations: ```yaml -_button: # Used for buttons (including dropdown menu items). -_link: # Used for links that are not shown graphically as buttons. -_heading: # Used for headings in tables and lists. -_label: # Used for the names of data fields, checkbox settings, etc. -_placeholder: # Used for placeholder text displayed in fields. +_button: # Used for buttons (including dropdown menu items). +_link: # Used for links that are not shown graphically as buttons. +_heading: # Used for headings in tables and lists. +_label: # Used for the names of data fields, checkbox settings, etc. +_placeholder: # Used for placeholder text displayed in fields. ``` These suffixes are used for informative or descriptive text elements: ```yaml -_confirmation: # Used for messages displayed to confirm an operation. -_message: # Used for messages that show the result of an operation. -_text: # Used for any text that is not a message, title, or tooltip. -_title: # Used for text displayed as the title of a page or modal. -_tooltip: # Used for text displayed when the user hovers over something. +_confirmation: # Used for messages displayed to confirm an operation. +_message: # Used for messages that show the result of an operation. +_text: # Used for any text that is not a message, title, or tooltip. +_title: # Used for text displayed as the title of a page or modal. +_tooltip: # Used for text displayed when the user hovers over something. ``` And there are two suffixes that are used only in the `email` namespace: ```yaml -_body: # Used for the content of the email message. -_subject: # Used for the subject line of the email message. +_body: # Used for the content of the email message. +_subject: # Used for the subject line of the email message. ``` The above is a complete listing of the suffixes available for use in locale files. You should take care to use them consistently, as doing so will make life easier for localizers. If you feel something is missing from the list, please file an issue with the developers; we'll consider adding a new suffix if the situation warrants it. -Suffixes should be **omitted** from ID keys for [reused translations](#reusing-translations) in the `ref:` namespace. This is because you can't be sure these translations will always be used in the same context. Adding a new context would mean changing the key name *everywhere it's referenced* … so it's best to keep these translations generic. +Suffixes should be **omitted** from ID keys for [reused translations](#reusing-translations) in the `ref:` namespace. This is because you can't be sure these translations will always be used in the same context. Adding a new context would mean changing the key name _everywhere it's referenced_ … so it's best to keep these translations generic. -#### ➡ The root indicates *what the translation says*. +#### ➡ The root indicates _what the translation says_. In other words, it should be a brief summation of the translation's content. If the translation is a very short phrase — no more than a few words long — you may want to use it verbatim (in `snake_case`, of course). If it's very long, on the other hand, you should try to boil it down to as few words as possible. @@ -331,7 +332,6 @@ Flarum's unique [key references](#key-references) fulfill the same role as YAML ```yaml core: - forum: header: log_in_link: => core.ref.log_in @@ -352,14 +352,13 @@ The `ref` namespace also makes it easy to track translation reuse. Imagine what ```yaml core: - forum: header: log_in_link: => Log In log_in: - submit_button: => core.forum.header.log_in_link # Never reference keys - title: => core.forum.header.log_in_link # that aren't in "ref"! + submit_button: => core.forum.header.log_in_link # Never reference keys + title: => core.forum.header.log_in_link # that aren't in "ref"! ``` It would very easy to change the translation for the header link without realizing that you're also changing things in the Log In modal — to say nothing of any extensions that might also be referencing that key! This sort of thing will be less likely to occur if you keep your reused translations in the `ref` namespace. @@ -400,7 +399,7 @@ This probably goes without saying. After all, if you're going to go to the troub Even tiny bits of text can cause problems for localizers. A comma here, a colon there … perhaps a pair of brackets inserted to make the page more legible: such things can and do cause issues for localizers. After all, not all languages use the same glyphs for these things! Just one hardcoded space can be a problem for someone trying to translate the interface into a language that doesn't use spaces to separate words. -Generally speaking, any displayed text that isn't supplied by a variable or the result of a calculation *must* be included in the locale files. That's easily said, but actually doing it takes a bit of perseverance. +Generally speaking, any displayed text that isn't supplied by a variable or the result of a calculation _must_ be included in the locale files. That's easily said, but actually doing it takes a bit of perseverance. ### Avoid Hardcoded Syntax! @@ -456,16 +455,16 @@ In English, the simple past tense is not affected by pluralization. Since the ve This is the sort of situation where the humdrum chore of language abstraction requires a bit of extra care and attention. Remember to ask yourself whether each noun (or pronoun) can be pluralized. If it can, then be sure to use the `app.translator.transChoice()` method and pass an appropriate variable to the translator. Of course, you don't need to provide any variant translations in the English resources … ```yaml -mentioned_by_text: "{users} replied to this." # Can be pluralized ... -mentioned_by_self_text: "{users} replied to this." # Can be pluralized ... +mentioned_by_text: '{users} replied to this.' # Can be pluralized ... +mentioned_by_self_text: '{users} replied to this.' # Can be pluralized ... ``` … but it would be a very good idea to add a comment after the translations in question, to alert localizers to the fact that the code will support the addition of such variants, should they be necessary. ### Reuse Translations, Not Keys! -If the namespacing keys combine to form a complete specification of where a translation is used, and the ID key specifies exactly how the translation is used and what it says, then it stands to reason that every full translation key must be unique. In other words: *you should never use the same key more than once!* +If the namespacing keys combine to form a complete specification of where a translation is used, and the ID key specifies exactly how the translation is used and what it says, then it stands to reason that every full translation key must be unique. In other words: _you should never use the same key more than once!_ Although this may sound inefficient, there's a good reason for doing things this way: it's the easiest way to ensure that localizers will have the flexibility they need. If you reuse keys in your code, you'll eventually hit a snag. Your localizers will be unable to find a single expression that fits every context where you've used some key or other … and then they'll start bugging you to fix your code. -Fortunately, you can avoid many such issues if you simply take care to [namespace translations](#namespacing-translations) correctly, [name your ID keys](#naming-identifier-keys) appropriately, and always [reuse translations](#reusing-translations) instead of keys. Though it may seem like a bother, in the long run, the [standard format](#appendix-a:-standard-key-format) will make localization much easier for *everyone*. +Fortunately, you can avoid many such issues if you simply take care to [namespace translations](#namespacing-translations) correctly, [name your ID keys](#naming-identifier-keys) appropriately, and always [reuse translations](#reusing-translations) instead of keys. Though it may seem like a bother, in the long run, the [standard format](#appendix-a:-standard-key-format) will make localization much easier for _everyone_. diff --git a/docs/extend/mail.md b/docs/extend/mail.md index 2e3f050d4..ad1a08e45 100644 --- a/docs/extend/mail.md +++ b/docs/extend/mail.md @@ -13,35 +13,37 @@ use Swift_Transport; class MailgunDriver implements DriverInterface { - public function availableSettings(): array - { - return [ - 'setting_one' => '', - 'setting_two' => 'defaultValue', - 'dropdown_setting' => [ - 'option_one_val' => 'Option One Display', - 'option_two_val' => 'Option Two Display', - ], - ]; - } - - public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag - { - $validator->make($settings->all(), [ - 'setting_one' => 'required', - 'setting_two' => 'nullable|integer', - ])->errors(); - } - - public function canSend(): bool - { - return true; - } - - public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport - { - // Return a mail transport that implements Swift Transport - } + public function availableSettings(): array + { + return [ + 'setting_one' => '', + 'setting_two' => 'defaultValue', + 'dropdown_setting' => [ + 'option_one_val' => 'Option One Display', + 'option_two_val' => 'Option Two Display', + ], + ]; + } + + public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag + { + $validator + ->make($settings->all(), [ + 'setting_one' => 'required', + 'setting_two' => 'nullable|integer', + ]) + ->errors(); + } + + public function canSend(): bool + { + return true; + } + + public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport + { + // Return a mail transport that implements Swift Transport + } } ``` @@ -53,7 +55,7 @@ use YourNamespace\Mail\CustomDriver; return [ // Other extenders - (new Extend\Mail())->driver(CustomDriver::class) + (new Extend\Mail())->driver(CustomDriver::class), // Other extenders ]; ``` diff --git a/docs/extend/middleware.md b/docs/extend/middleware.md index 09300e96a..0c897895b 100644 --- a/docs/extend/middleware.md +++ b/docs/extend/middleware.md @@ -6,7 +6,6 @@ Flarum maintains a middleware "Pipe" through which all requests pass. Each of th A request passes through the middleware layers in order. When the request is handled (a middleware returns something instead of passing the request to the next layer, or throws an exception), the response will move back up the middleware layers in reverse order, before finally being returned to the user. Everything from Flarum's error handler to its authentication logic is implemented as middleware, and so can be supplemented, replaced, reordered, or removed by extensions. - ```php use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -33,22 +32,22 @@ use Flarum\Extend; // use Flarum\Http\Middleware\CheckCsrfToken; return [ - // Add middleware to forum frontend - (new Extend\Middleware('forum'))->add(YourMiddleware::class), - // Admin frontend - (new Extend\Middleware('admin'))->add(YourMiddleware::class), - // API frontend - (new Extend\Middleware('api'))->add(YourMiddleware::class), - - (new Extend\Middleware('frontend')) - // remove a middleware (e.g. remove CSRF token check 😱) - ->remove(CheckCsrfToken::class) - // insert before another middleware (e.g. before a CSRF token check) - ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) - // insert after another middleware (e.g. after a CSRF token check) - ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) - // replace a middleware (e.g. replace the CSRF check with your own implementation) - ->replace(CheckCsrfToken::class, YourMiddleware::class) + // Add middleware to forum frontend + (new Extend\Middleware('forum'))->add(YourMiddleware::class), + // Admin frontend + (new Extend\Middleware('admin'))->add(YourMiddleware::class), + // API frontend + (new Extend\Middleware('api'))->add(YourMiddleware::class), + + (new Extend\Middleware('frontend')) + // remove a middleware (e.g. remove CSRF token check 😱) + ->remove(CheckCsrfToken::class) + // insert before another middleware (e.g. before a CSRF token check) + ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) + // insert after another middleware (e.g. after a CSRF token check) + ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) + // replace a middleware (e.g. replace the CSRF check with your own implementation) + ->replace(CheckCsrfToken::class, YourMiddleware::class), ]; ``` @@ -115,7 +114,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface ]); $document = new Document(); $document->setErrors($error->getErrors()); - + return new JsonApiResponse($document, $error->getStatus()); } diff --git a/docs/extend/models.md b/docs/extend/models.md index dde8c092e..437f77bf4 100644 --- a/docs/extend/models.md +++ b/docs/extend/models.md @@ -18,7 +18,7 @@ If we want to use a custom model, or add attributes to an existing one, we will Migrations are like version control for your database, allowing you to easily modify Flarum's database schema in a safe way. Flarum's migrations are very similar to [Laravel's](https://laravel.com/docs/migrations), although there are some differences. -Migrations live inside a folder suitably named `migrations` in your extension's directory. Migrations should be named in the format `YYYY_MM_DD_HHMMSS_snake_case_description` so that they are listed and run in order of creation. +Migrations live inside a folder suitably named `migrations` in your extension's directory. Migrations should be named in the format `YYYY_MM_DD_HHMMSS_snake_case_description` so that they are listed and run in order of creation. ### Migration Structure @@ -30,12 +30,12 @@ In Flarum, migration files should **return an array** with two functions: `up` a use Illuminate\Database\Schema\Builder; return [ - 'up' => function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } + 'up' => function (Builder $schema) { + // up migration + }, + 'down' => function (Builder $schema) { + // down migration + }, ]; ``` @@ -43,7 +43,7 @@ For common tasks like creating a table, or adding columns to an existing table, ### Migration Lifecycle -Migrations are applied when the extension is enabled for the first time or when it's enabled and there are some outstanding migrations. The executed migrations are logged in the database, and when some are found in the migrations folder of an extension that aren't logged as completed yet, they will be executed. +Migrations are applied when the extension is enabled for the first time or when it's enabled and there are some outstanding migrations. The executed migrations are logged in the database, and when some are found in the migrations folder of an extension that aren't logged as completed yet, they will be executed. Migrations can also be manually applied with `php flarum migrate` which is also needed to update the migrations of an already enabled extension. To undo the changes applied by migrations, you need to click "Uninstall" next to an extension in the Admin UI, or you need to use the `php flarum migrate:reset` command. Nothing can break by running `php flarum migrate` again if you've already migrated - executed migrations will not run again. @@ -58,7 +58,7 @@ use Flarum\Database\Migration; use Illuminate\Database\Schema\Blueprint; return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); + $table->increments('id'); }); ``` @@ -78,8 +78,8 @@ To add columns to an existing table, use the `Migration::addColumns` helper. The ```php return Migration::addColumns('users', [ - 'email' => ['string', 'length' => 255, 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] + 'email' => ['string', 'length' => 255, 'nullable' => true], + 'discussion_count' => ['integer', 'unsigned' => true], ]); ``` @@ -99,7 +99,7 @@ Data migrations are the recommended way to specify default settings and permissi ```php return Migration::addSettings([ - 'foo' => 'bar', + 'foo' => 'bar', ]); ``` @@ -109,7 +109,7 @@ and use Flarum\Group\Group; return Migration::addPermissions([ - 'some.permission' => Group::MODERATOR_ID + 'some.permission' => Group::MODERATOR_ID, ]); ``` @@ -155,7 +155,7 @@ return [ ### Relationships -You can also add [relationships](https://laravel.com/docs/8.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: +You can also add [relationships](https://laravel.com/docs/8.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: ```php new Extend\Model(User::class) @@ -190,7 +190,7 @@ Flarum's frontend contains a local data `store` which provides an interface to i ```js // GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); +app.store.find('discussions', { sort: 'createdAt' }).then(console.log); // GET /api/discussions/123 app.store.find('discussions', 123).then(console.log); @@ -274,12 +274,9 @@ You can also save relationships by passing them in a `relationships` key. For ha ```js user.save({ relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) + groups: [store.getById('groups', 1), store.getById('groups', 2)], + }, +}); ``` ### Creating New Resources diff --git a/docs/extend/notifications.md b/docs/extend/notifications.md index 79b2caaf5..d0b34991a 100644 --- a/docs/extend/notifications.md +++ b/docs/extend/notifications.md @@ -8,11 +8,11 @@ Flarum includes a powerful notification system to alert users to new activity. To define a notification type, you will need to create a new class which implements `Flarum\Notification\Blueprint\BlueprintInterface`. This class will define your notification's content and behaviour through the following methods: -* `getSubject()` The model that the notification is about (eg. the `Post` that was liked). -* `getSender()` The `User` model for the user that triggered the notification. -* `getData()` Any other data you might wish to include for access on the frontend (eg. the old discussion title when renamed). -* `getType()` This is where you name your notification, this will be important for later steps. -* `getSubjectModal()`: Specify the type of model the subject is (from `getSubject`). +- `getSubject()` The model that the notification is about (eg. the `Post` that was liked). +- `getSender()` The `User` model for the user that triggered the notification. +- `getData()` Any other data you might wish to include for access on the frontend (eg. the old discussion title when renamed). +- `getType()` This is where you name your notification, this will be important for later steps. +- `getSubjectModal()`: Specify the type of model the subject is (from `getSubject`). Lets take a look at an example from [Flarum Likes](https://github.com/flarum/likes/blob/master/src/Notification/PostLikedBlueprint.php): @@ -27,39 +27,39 @@ use Flarum\User\User; class PostLikedBlueprint implements BlueprintInterface { - public $post; + public $post; - public $user; + public $user; - public function __construct(Post $post, User $user) - { - $this->post = $post; - $this->user = $user; - } + public function __construct(Post $post, User $user) + { + $this->post = $post; + $this->user = $user; + } - public function getSubject() - { - return $this->post; - } + public function getSubject() + { + return $this->post; + } - public function getSender() - { - return $this->user; - } + public function getSender() + { + return $this->user; + } - public function getData() - { - } + public function getData() + { + } - public static function getType() - { - return 'postLiked'; - } + public static function getType() + { + return 'postLiked'; + } - public static function getSubjectModel() - { - return Post::class; - } + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -70,9 +70,9 @@ Take a look at [`DiscussionRenamedBlueprint`](https://github.com/flarum/core/blo Next, let's register your notification so Flarum knows about it. This will allow users to be able to change how they want to be notified of your notification. We can do this with the `type` method of the `Notification` extender -* `$blueprint`: Your class static (example: `PostLikedBlueprint::class`) -* `$serializer`: The serializer of your subject model (example: `PostSerializer::class`) -* `$enabledByDefault`: This is where you set which notification methods will be enabled by default. It accepts an array of strings, include 'alert' to have forum notifications (the bell icon), include 'email' for email notifications. You can use, one both, or none! (example: `['alert']` would set only in-forum notifications on by default) +- `$blueprint`: Your class static (example: `PostLikedBlueprint::class`) +- `$serializer`: The serializer of your subject model (example: `PostSerializer::class`) +- `$enabledByDefault`: This is where you set which notification methods will be enabled by default. It accepts an array of strings, include 'alert' to have forum notifications (the bell icon), include 'email' for email notifications. You can use, one both, or none! (example: `['alert']` would set only in-forum notifications on by default) Lets look at an example from [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/extend.php): @@ -116,84 +116,84 @@ use Symfony\Contracts\Translation\TranslatorInterface; class PostMentionedBlueprint implements BlueprintInterface, MailableInterface { - /** - * @var Post - */ - public $post; - - /** - * @var Post - */ - public $reply; - - /** - * @param Post $post - * @param Post $reply - */ - public function __construct(Post $post, Post $reply) - { - $this->post = $post; - $this->reply = $reply; - } + /** + * @var Post + */ + public $post; + + /** + * @var Post + */ + public $reply; + + /** + * @param Post $post + * @param Post $reply + */ + public function __construct(Post $post, Post $reply) + { + $this->post = $post; + $this->reply = $reply; + } - /** - * {@inheritdoc} - */ - public function getSubject() - { - return $this->post; - } + /** + * {@inheritdoc} + */ + public function getSubject() + { + return $this->post; + } - /** - * {@inheritdoc} - */ - public function getFromUser() - { - return $this->reply->user; - } + /** + * {@inheritdoc} + */ + public function getFromUser() + { + return $this->reply->user; + } - /** - * {@inheritdoc} - */ - public function getData() - { - return ['replyNumber' => (int) $this->reply->number]; - } + /** + * {@inheritdoc} + */ + public function getData() + { + return ['replyNumber' => (int) $this->reply->number]; + } - /** - * {@inheritdoc} - */ - public function getEmailView() - { - return ['text' => 'flarum-mentions::emails.postMentioned']; - } + /** + * {@inheritdoc} + */ + public function getEmailView() + { + return ['text' => 'flarum-mentions::emails.postMentioned']; + } - /** - * {@inheritdoc} - */ - public function getEmailSubject(TranslatorInterface $translator) - { - return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ - '{replier_display_name}' => $this->post->user->display_name, - '{title}' => $this->post->discussion->title - ]); - } + /** + * {@inheritdoc} + */ + public function getEmailSubject(TranslatorInterface $translator) + { + return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ + '{replier_display_name}' => $this->post->user->display_name, + '{title}' => $this->post->discussion->title, + ]); + } - /** - * {@inheritdoc} - */ - public static function getType() - { - return 'postMentioned'; - } + /** + * {@inheritdoc} + */ + public static function getType() + { + return 'postMentioned'; + } - /** - * {@inheritdoc} - */ - public static function getSubjectModel() - { - return Post::class; - } + /** + * {@inheritdoc} + */ + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -213,45 +213,45 @@ use Illuminate\Contracts\Queue\Queue; class PusherNotificationDriver implements NotificationDriverInterface { - /** - * @var Queue - */ - protected $queue; - - public function __construct(Queue $queue) - { - $this->queue = $queue; - } + /** + * @var Queue + */ + protected $queue; + + public function __construct(Queue $queue) + { + $this->queue = $queue; + } - /** - * {@inheritDoc} - */ - public function send(BlueprintInterface $blueprint, array $users): void - { - // The `send` method is responsible for determining any notifications need to be sent. - // If not (for example, if there are no users to send to), there's no point in scheduling a job. - // We HIGHLY recommend that notifications are sent via a queue job for performance reasons. - if (count($users)) { - $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); - } + /** + * {@inheritDoc} + */ + public function send(BlueprintInterface $blueprint, array $users): void + { + // The `send` method is responsible for determining any notifications need to be sent. + // If not (for example, if there are no users to send to), there's no point in scheduling a job. + // We HIGHLY recommend that notifications are sent via a queue job for performance reasons. + if (count($users)) { + $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); } + } - /** - * {@inheritDoc} - */ - public function registerType(string $blueprintClass, array $driversEnabledByDefault): void - { - // This method is generally used to register a user preference for this notification. - // In the case of pusher, there's no need for this. - } + /** + * {@inheritDoc} + */ + public function registerType(string $blueprintClass, array $driversEnabledByDefault): void + { + // This method is generally used to register a user preference for this notification. + // In the case of pusher, there's no need for this. + } } ``` Notification drivers are also registered via the `Notification` extender, using the `driver` method. The following arguments are provided -* `$driverName`: A unique, human readable name for the driver -* `$driverClass`: The class static of the driver (example: `PostSerializer::class`) -* `$typesEnabledByDefault`: An array of types for which this driver should be enabled by default. This will be used in calculating `$driversEnabledByDefault`, which is provided to the `registerType` method of the driver. +- `$driverName`: A unique, human readable name for the driver +- `$driverClass`: The class static of the driver (example: `PostSerializer::class`) +- `$typesEnabledByDefault`: An array of types for which this driver should be enabled by default. This will be used in calculating `$driversEnabledByDefault`, which is provided to the `registerType` method of the driver. Another example from [Flarum Pusher](https://github.com/flarum/pusher/blob/master/extend.php): @@ -277,12 +277,12 @@ Similar to the notification blueprint, we need tell Flarum how we want our notif First, create a class that extends the notification component. Then, there are 4 functions to add: -* `icon()`: The [Font Awesome](https://fontawesome.com/) icon that will appear next to the notification text (example: `fas fa-code-branch`). -* `href()`: The link that should be opened when the notification is clicked (example: `app.route.post(this.attrs.notification.subject())`). -* `content()`: What the notification itself should show. It should say the username and then the action. It will be followed by when the notification was sent (make sure to use translations). -* `exerpt()`: (optional) A little excerpt that is shown below the notification (commonly an excerpt of a post). +- `icon()`: The [Font Awesome](https://fontawesome.com/) icon that will appear next to the notification text (example: `fas fa-code-branch`). +- `href()`: The link that should be opened when the notification is clicked (example: `app.route.post(this.attrs.notification.subject())`). +- `content()`: What the notification itself should show. It should say the username and then the action. It will be followed by when the notification was sent (make sure to use translations). +- `exerpt()`: (optional) A little excerpt that is shown below the notification (commonly an excerpt of a post). -*Let take a look at our example shall we?* +_Let take a look at our example shall we?_ From [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/js/src/forum/components/NewPostNotification.js), when a new post is posted on a followed discussion: @@ -304,7 +304,7 @@ export default class NewPostNotification extends Notification { } content() { - return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', {user: this.attrs.notification.sender()}); + return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', { user: this.attrs.notification.sender() }); } } ``` @@ -337,25 +337,26 @@ app.initializers.add('flarum-likes', () => { items.add('postLiked', { name: 'postLiked', icon: 'far fa-thumbs-up', - label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'), }); }); }); ``` + Simply add the name of your notification (from the blueprint), an icon you want to show, and a description of the notification and you are all set! ## Sending Notifications -*Data doesn't just appear in the database magically* +_Data doesn't just appear in the database magically_ Now that you have your notification all setup, it's time to actually send the notification to the user! Thankfully, this is the easiest part, simply use[`NotificationSyncer`](https://github.com/flarum/core/blob/master/src/Notification/NotificationSyncer.php)'s sync function. It accepts 2 arguments: -* `BlueprintInterface`: This is the blueprint to be instantiated we made in the first step, you must include all variables that are used on the blueprint (example: if a user likes a post you must include the `user` model that liked the post). -* `$users`: This accepts an array of `user` modals that should receive the notification +- `BlueprintInterface`: This is the blueprint to be instantiated we made in the first step, you must include all variables that are used on the blueprint (example: if a user likes a post you must include the `user` model that liked the post). +- `$users`: This accepts an array of `user` modals that should receive the notification -*Whats that? You want to be able to delete notifications too?* The easiest way to remove a notification is to pass the exact same data as sending a notification, except with an empty array of recipients. +_Whats that? You want to be able to delete notifications too?_ The easiest way to remove a notification is to pass the exact same data as sending a notification, except with an empty array of recipients. Lets take a look at our **final** example for today: @@ -377,41 +378,38 @@ use Illuminate\Contracts\Events\Dispatcher; class SendNotificationWhenPostIsLiked { - protected $notifications; + protected $notifications; - public function __construct(NotificationSyncer $notifications) - { - $this->notifications = $notifications; - } + public function __construct(NotificationSyncer $notifications) + { + $this->notifications = $notifications; + } - public function subscribe(Dispatcher $events) - { - $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); - $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); - } + public function subscribe(Dispatcher $events) + { + $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); + $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); + } - public function whenPostWasLiked(PostWasLiked $event) - { - $this->syncNotification($event->post, $event->user, [$event->post->user]); - } + public function whenPostWasLiked(PostWasLiked $event) + { + $this->syncNotification($event->post, $event->user, [$event->post->user]); + } - public function whenPostWasUnliked(PostWasUnliked $event) - { - $this->syncNotification($event->post, $event->user, []); - } + public function whenPostWasUnliked(PostWasUnliked $event) + { + $this->syncNotification($event->post, $event->user, []); + } - public function syncNotification(Post $post, User $user, array $recipients) - { - if ($post->user->id != $user->id) { - $this->notifications->sync( - new PostLikedBlueprint($post, $user), - $recipients - ); - } + public function syncNotification(Post $post, User $user, array $recipients) + { + if ($post->user->id != $user->id) { + $this->notifications->sync(new PostLikedBlueprint($post, $user), $recipients); } + } } ``` **Awesome!** Now you can spam users with updates on happenings around the forum! -*Tried everything?* Well if you've tried everything then I guess... Kidding. Feel free to post in the [Flarum Community](https://discuss.flarum.org/t/extensibility) or in the [Discord](https://flarum.org/discord/) and someone will be around to lend a hand! +_Tried everything?_ Well if you've tried everything then I guess... Kidding. Feel free to post in the [Flarum Community](https://discuss.flarum.org/t/extensibility) or in the [Discord](https://flarum.org/discord/) and someone will be around to lend a hand! diff --git a/docs/extend/post-types.md b/docs/extend/post-types.md index 2126282d8..021a8738e 100644 --- a/docs/extend/post-types.md +++ b/docs/extend/post-types.md @@ -1 +1 @@ -# Post Types \ No newline at end of file +# Post Types diff --git a/docs/extend/routes.md b/docs/extend/routes.md index e295dee8a..af6f3c78c 100644 --- a/docs/extend/routes.md +++ b/docs/extend/routes.md @@ -8,11 +8,11 @@ Routing happens on both the PHP backend and the JavaScript frontend. On the backend, Flarum has three collections of routes: -* `forum` These routes are accessible under `yourforum.com/`. They include routes that show pages in the frontend (like `yourforum.com/d/123-title`) and other utility routes (like the reset password route). +- `forum` These routes are accessible under `yourforum.com/`. They include routes that show pages in the frontend (like `yourforum.com/d/123-title`) and other utility routes (like the reset password route). -* `admin` These routes are accessible under `yourforum.com/admin/`. By default, there is only one `admin` route on the backend; the rest of the admin routing happens on the frontend. +- `admin` These routes are accessible under `yourforum.com/admin/`. By default, there is only one `admin` route on the backend; the rest of the admin routing happens on the frontend. -* `api` These routes are accessible under `yourforum.com/api/` and make up Flarum's JSON:API. +- `api` These routes are accessible under `yourforum.com/api/` and make up Flarum's JSON:API. ### Defining Routes @@ -20,9 +20,9 @@ You can add routes to any of these collections using the `Routes` extender. Pass There are methods to register routes for any HTTP request method: `get`, `post`, `put`, `patch`, and `delete`. All of these methods accept three arguments: -* `$path` The route path using [FastRoute](https://github.com/nikic/FastRoute#defining-routes) syntax. -* `$name` A unique name for the route, used for generating URLs. To avoid conflicts with other extensions, you should use your vendor name as a namespace. -* `$handler` The name of the controller class that will handle the request. This will be resolved through the container. +- `$path` The route path using [FastRoute](https://github.com/nikic/FastRoute#defining-routes) syntax. +- `$name` A unique name for the route, used for generating URLs. To avoid conflicts with other extensions, you should use your vendor name as a namespace. +- `$handler` The name of the controller class that will handle the request. This will be resolved through the container. ```php <?php @@ -30,10 +30,7 @@ There are methods to register routes for any HTTP request method: `get`, `post`, use Flarum\Extend; use Acme\HelloWorld\HelloWorldController; -return [ - (new Extend\Routes('forum')) - ->get('/hello-world', 'acme.hello-world', HelloWorldController::class) -]; +return [(new Extend\Routes('forum'))->get('/hello-world', 'acme.hello-world', HelloWorldController::class)]; ``` ### Controllers @@ -52,10 +49,10 @@ use Psr\Http\Server\RequestHandlerInterface; class HelloWorldController implements RequestHandlerInterface { - public function handle(Request $request): Response - { - return new HtmlResponse('<h1>Hello, world!</h1>'); - } + public function handle(Request $request): Response + { + return new HtmlResponse('<h1>Hello, world!</h1>'); + } } ``` @@ -76,8 +73,7 @@ The `handle` method of a Controller is the code that runs when someone visits yo Sometimes you will need to capture segments of the URI within your route. You may do so by defining route parameters using the [FastRoute](https://github.com/nikic/FastRoute#defining-routes) syntax: ```php - (new Extend\Routes('forum')) - ->get('/user/{id}', 'acme.user', UserController::class) +(new Extend\Routes('forum'))->get('/user/{id}', 'acme.user', UserController::class); ``` The values of these parameters will be merged with the request's query params, which you can access in your controller by calling `$request->getQueryParams()`: @@ -118,19 +114,19 @@ Then, inject the factory into your controller and render your view into an `Html ```php class HelloWorldController implements RequestHandlerInterface { - protected $view; - - public function __construct(Factory $view) - { - $this->view = $view; - } - - public function handle(Request $request): Response - { - $view = $this->view->make('acme.hello-world::greeting'); - - return new HtmlResponse($view->render()); - } + protected $view; + + public function __construct(Factory $view) + { + $this->view = $view; + } + + public function handle(Request $request): Response + { + $view = $this->view->make('acme.hello-world::greeting'); + + return new HtmlResponse($view->render()); + } } ``` @@ -145,8 +141,7 @@ Adding routes to the frontend actually requires you to register them on _both_ t On the backend, instead of adding your frontend route via the `Routes` extender, you should use the `Frontend` extender's `route` method. This always assumes `GET` as the method, and accepts a route path and name as the first two arguments: ```php - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users') +(new Extend\Frontend('forum'))->route('/users', 'acme.users'); ``` Now when `yourforum.com/users` is visited, the forum frontend will be displayed. However, since the frontend doesn't yet know about the `users` route, the discussion list will still be rendered. @@ -223,10 +218,10 @@ import Link from 'flarum/common/components/Link'; Whenever you visit a frontend route, the backend constructs a HTML document with the scaffolding necessary to boot up the frontend JavaScript application. You can easily modify this document to perform tasks like: -* Changing the `<title>` of the page -* Adding external JavaScript and CSS resources -* Adding SEO content and `<meta>` tags -* Adding data to the JavaScript payload (eg. to preload resources which are going to be rendered on the page immediately, thereby preventing an unnecessary request to the API) +- Changing the `<title>` of the page +- Adding external JavaScript and CSS resources +- Adding SEO content and `<meta>` tags +- Adding data to the JavaScript payload (eg. to preload resources which are going to be rendered on the page immediately, thereby preventing an unnecessary request to the API) You can make blanket changes to the frontend using the `Frontend` extender's `content` method. This accepts a closure which receives two parameters: a `Flarum\Frontend\Document` object which represents the HTML document that will be displayed, and the `Request` object. @@ -235,10 +230,9 @@ use Flarum\Frontend\Document; use Psr\Http\Message\ServerRequestInterface as Request; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document, Request $request) { - $document->head[] = '<script>alert("Hello, world!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document, Request $request) { + $document->head[] = '<script>alert("Hello, world!")</script>'; + }), ]; ``` @@ -246,9 +240,8 @@ You can also add content onto your frontend route registrations: ```php return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) + (new Extend\Frontend('forum'))->route('/users', 'acme.users', function (Document $document, Request $request) { + $document->title = 'Users'; + }), ]; ``` diff --git a/docs/extend/search.md b/docs/extend/search.md index 6687f0222..3c28a3239 100644 --- a/docs/extend/search.md +++ b/docs/extend/search.md @@ -5,7 +5,7 @@ Flarum treats searching and filtering as parallel but distinct processes. Which - Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. - Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. +This distinction is important because searches and filters have very different use cases: filters represent _browsing_: that is, the user is passively looking through some category of content. In contrast, searches represent, well, _searching_: the user is actively looking for content based on some criteria. Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. @@ -22,7 +22,7 @@ Your classes can implement both interface; see Flarum core's [`UnreadFilterGambi :::tip Query Builder vs Eloquent Builder -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps +`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps ::: @@ -52,17 +52,17 @@ use Flarum\Filter\FilterState; class CountryFilter implements FilterInterface { - public function getFilterKey(): string - { - return 'country'; - } + public function getFilterKey(): string + { + return 'country'; + } - public function filter(FilterState $filterState, string $filterValue, bool $negate) - { - $country = trim($filterValue, '"'); + public function filter(FilterState $filterState, string $filterValue, bool $negate) + { + $country = trim($filterValue, '"'); - $filterState->getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } + $filterState->getQuery()->where('users.country', $negate ? '!=' : '=', $country); + } } ``` @@ -81,10 +81,10 @@ use Flarum\Query\QueryCriteria; class OnlySameCountryFilterMutator { - public function __invoke(FilterState $filterState, QueryCriteria $queryCriteria) - { - $filterState->getQuery()->where('users.country', $filterState->getActor()->country); - } + public function __invoke(FilterState $filterState, QueryCriteria $queryCriteria) + { + $filterState->getQuery()->where('users.country', $filterState->getActor()->country); + } } ``` @@ -132,17 +132,17 @@ use Flarum\Search\SearchState; class CountryGambit extends AbstractRegexGambit { - public function getGambitPattern(): string - { - return 'country:(.+)'; - } + public function getGambitPattern(): string + { + return 'country:(.+)'; + } - public function conditions(SearchState $search, array $matches, bool $negate) - { - $country = trim($matches[1], '"'); + public function conditions(SearchState $search, array $matches, bool $negate) + { + $country = trim($matches[1], '"'); - $search->getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } + $search->getQuery()->where('users.country', $negate ? '!=' : '=', $country); + } } ``` @@ -176,10 +176,10 @@ use Flarum\Search\SearchState; class OnlySameCountrySearchMutator { - public function __invoke(SearchState $searchState, QueryCriteria $queryCriteria) - { - $searchState->getQuery()->where('users.country', $filterState->getActor()->country); - } + public function __invoke(SearchState $searchState, QueryCriteria $queryCriteria) + { + $searchState->getQuery()->where('users.country', $filterState->getActor()->country); + } } ``` diff --git a/docs/extend/service-provider.md b/docs/extend/service-provider.md index ff09a6a61..964ece669 100644 --- a/docs/extend/service-provider.md +++ b/docs/extend/service-provider.md @@ -32,15 +32,15 @@ use Flarum\Foundation\AbstractServiceProvider; class CustomServiceProvider extends AbstractServiceProvider { - public function register() - { - // custom logic here - } - - public function boot() - { - // custom logic here - } + public function register() + { + // custom logic here + } + + public function boot() + { + // custom logic here + } } ``` @@ -54,9 +54,8 @@ To actually register your custom service provider, you can use the `ServiceProvi use Flarum\Extend; return [ - // Other extenders - (new Extend\ServiceProvider()) - ->register(CustomServiceProvider::class), - // Other extenders + // Other extenders + (new Extend\ServiceProvider())->register(CustomServiceProvider::class), + // Other extenders ]; ``` diff --git a/docs/extend/settings.md b/docs/extend/settings.md index 5e0f1b492..6385c318a 100644 --- a/docs/extend/settings.md +++ b/docs/extend/settings.md @@ -17,15 +17,15 @@ use Flarum\Settings\SettingsRepositoryInterface; class ClassInterfacesWithSettings { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } } ``` @@ -64,6 +64,7 @@ The `delete($name)` function lets you remove a named setting. ### Editing Settings To learn more about adding settings through the admin dashboard, see the [relevant documentation](admin.md). + ### Accessing Settings All settings are available in the `admin` frontend via the `app.data.settings` global. @@ -79,15 +80,18 @@ This can be done via the `Settings` extender. For example: use Flarum\Extend; return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }, "default value!"), -] + (new Extend\Settings())->serializeToForum('myCoolSetting', 'my.cool.setting.key')->serializeToForum( + 'myCoolSettingModified', + 'my.cool.setting.key', + function ($retrievedValue) { + // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. + // In this example, we'll append a string to it. + + return "My Cool Setting: $retrievedValue"; + }, + 'default value!' + ), +]; ``` Now, the `my.cool.setting.key` setting will be accessible in the frontend as `app.forum.attribute("myCoolSetting")`, and our modified value will be accessible via `app.forum.attribute("myCoolSettingModified")`. diff --git a/docs/extend/start.md b/docs/extend/start.md index 81dd8318e..8d48c3964 100644 --- a/docs/extend/start.md +++ b/docs/extend/start.md @@ -10,11 +10,11 @@ Be aware that Flarum uses some _modern_ languages and tools. If you've only ever Flarum is made up of three layers: -* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/8.x/container), which is used throughout our backend. +- First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/8.x/container), which is used throughout our backend. -* Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). +- Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). -* Finally, there is the default web interface which we call the **frontend**. This is a [single-page application](https://en.wikipedia.org/wiki/Single-page_application) which consumes the API. It's built with a simple React-like framework called [Mithril.js](https://mithril.js.org). +- Finally, there is the default web interface which we call the **frontend**. This is a [single-page application](https://en.wikipedia.org/wiki/Single-page_application) which consumes the API. It's built with a simple React-like framework called [Mithril.js](https://mithril.js.org). Extensions will often need to interact with all three of these layers to make things happen. For example, if you wanted to build an extension that adds custom fields to user profiles, you would need to add the appropriate database structures in the **backend**, expose that data in the **public API**, and then display it and allow users to edit it on the **frontend**. @@ -22,15 +22,13 @@ So... how do we extend these layers? ## Extenders -In order to extend Flarum, we will be using a concept called **extenders**. Extenders are *declarative* objects that describe in plain terms the goals you are trying to achieve (such as adding a new route to your forum, or executing some code when a new discussion was created). +In order to extend Flarum, we will be using a concept called **extenders**. Extenders are _declarative_ objects that describe in plain terms the goals you are trying to achieve (such as adding a new route to your forum, or executing some code when a new discussion was created). Every extender is different. However, they will always look somewhat similar to this: ```php // Register a JavaScript and a CSS file to be delivered with the forum frontend -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') +(new Extend\Frontend('forum'))->js(__DIR__ . '/forum-scripts.js')->css(__DIR__ . '/forum-styles.css'); ``` You first create an instance of the extender, and then call methods on it for further configuration. All of these methods return the extender itself, so that you can achieve your entire configuration just by chaining method calls. @@ -50,10 +48,9 @@ use Flarum\Extend; use Flarum\Frontend\Document; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document) { - $document->head[] = '<script>alert("Hello, world!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document) { + $document->head[] = '<script>alert("Hello, world!")</script>'; + }), ]; ``` @@ -85,39 +82,41 @@ We need to tell Composer a bit about our package, and we can do this by creating ```json { - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.16 <=0.1.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } + "name": "acme/flarum-hello-world", + "description": "Say hello to the world!", + "type": "flarum-extension", + "require": { + "flarum/core": ">=0.1.0-beta.16 <=0.1.0" + }, + "autoload": { + "psr-4": { "Acme\\HelloWorld\\": "src/" } + }, + "extra": { + "flarum-extension": { + "title": "Hello World", + "icon": { + "name": "fas fa-smile", + "backgroundColor": "#238c59", + "color": "#fff" + } } + } } ``` -* **name** is the name of the Composer package in the format `vendor/package`. - * You should choose a vendor name that’s unique to you — your GitHub username, for example. For the purposes of this tutorial, we’ll assume you’re using `acme` as your vendor name. - * You should prefix the `package` part with `flarum-` to indicate that it’s a package specifically intended for use with Flarum. +- **name** is the name of the Composer package in the format `vendor/package`. -* **description** is a short one-sentence description of what the extension does. + - You should choose a vendor name that’s unique to you — your GitHub username, for example. For the purposes of this tutorial, we’ll assume you’re using `acme` as your vendor name. + - You should prefix the `package` part with `flarum-` to indicate that it’s a package specifically intended for use with Flarum. -* **type** MUST be set to `flarum-extension`. This ensures that when someone "requires" your extension, it will be identified as such. +- **description** is a short one-sentence description of what the extension does. -* **require** contains a list of your extension's own dependencies. - * You'll want to specify the version of Flarum that your extension is compatible with here. - * This is also the place to list other Composer libraries your code needs to work. +- **type** MUST be set to `flarum-extension`. This ensures that when someone "requires" your extension, it will be identified as such. + +- **require** contains a list of your extension's own dependencies. + + - You'll want to specify the version of Flarum that your extension is compatible with here. + - This is also the place to list other Composer libraries your code needs to work. ::: warning Carefully choose the Flarum version @@ -127,11 +126,11 @@ We need to tell Composer a bit about our package, and we can do this by creating ::: -* **autoload** tells Composer where to find your extension's classes. The namespace in here should reflect your extensions' vendor and package name in CamelCase. +- **autoload** tells Composer where to find your extension's classes. The namespace in here should reflect your extensions' vendor and package name in CamelCase. -* **extra.flarum-extension** contains some Flarum-specific information, like your extension's display name and how its icon should look. - * **title** is the display name of your extension. - * **icon** is an object which defines your extension's icon. The **name** property is a [Font Awesome icon class name](https://fontawesome.com/icons). All other properties are used as the `style` attribute for your extension's icon. +- **extra.flarum-extension** contains some Flarum-specific information, like your extension's display name and how its icon should look. + - **title** is the display name of your extension. + - **icon** is an object which defines your extension's icon. The **name** property is a [Font Awesome icon class name](https://fontawesome.com/icons). All other properties are used as the `style` attribute for your extension's icon. See [the composer.json schema](https://getcomposer.org/doc/04-schema.md) documentation for information about other properties you can add to `composer.json`. @@ -151,7 +150,7 @@ composer require acme/flarum-hello-world *@dev Once that's done, go ahead and fire 'er up on your forum's Administration page, then navigate back to your forum. -*whizzing, whirring, metal clunking* +_whizzing, whirring, metal clunking_ Woop! Hello to you too, extension! diff --git a/docs/extend/testing.md b/docs/extend/testing.md index b870672b3..3715f9ef2 100644 --- a/docs/extend/testing.md +++ b/docs/extend/testing.md @@ -88,7 +88,7 @@ This script will be run to set up a testing database / file structure. use Flarum\Testing\integration\Setup\SetupScript; -require __DIR__.'/../../vendor/autoload.php'; +require __DIR__ . '/../../vendor/autoload.php'; $setup = new SetupScript(); @@ -182,44 +182,60 @@ class SomeTest extends TestCase { use RetrievesAuthorizedUsers; - public function setUp(): void - { - parent::setUp(); - - $this->setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. + public function setUp(): void + { + parent::setUp(); + + $this->setting('my.custom.setting', true); + + // Let's assume our extension depends on tags. + // Note that tags will need to be in your extension's composer.json's `require-dev`. + // Also, make sure you include the ID of the extension currently being tested, unless you're + // testing the baseline without your extension. + $this->extension('flarum-tags', 'my-cool-extension'); + + // Note that this input isn't validated: make sure you're populating with valid, representative data. + $this->prepareDatabase([ + 'users' => [ + $this->normalUser(), // Available for convenience. + ], + 'discussions' => [ + [ + 'id' => 1, + 'title' => 'some title', + 'created_at' => Carbon::now(), + 'last_posted_at' => Carbon::now(), + 'user_id' => 1, + 'first_post_id' => 1, + 'comment_count' => 1, ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] + ], + 'posts' => [ + [ + 'id' => 1, + 'number' => 1, + 'discussion_id' => 1, + 'created_at' => Carbon::now(), + 'user_id' => 1, + 'type' => 'comment', + 'content' => '<t><p>something</p></t>', ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '<t><p>something</p></t>'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - + ], + ]); + + // Most test cases won't need to test extenders, but if you want to, you can. + $this->extend((new CoolExtensionExtender())->doSomething('hello world')); + } + + /** + * @test + */ + public function some_phpunit_test_case() + { // ... + } + + // ... } ``` @@ -241,8 +257,6 @@ You can use this to ensure that: For example: - - ```php <?php @@ -259,47 +273,42 @@ use Flarum\Testing\integration\TestCase; class SomeTest extends TestCase { - /** - * @test - */ - public function can_search_users() - { - $response = $this->send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } + /** + * @test + */ + public function can_search_users() + { + $response = $this->send( + $this->request('GET', '/api/users', ['authenticatedAs' => 1])->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) + ); + + $this->assertEquals(200, $response->getStatusCode()); + } + + /** + * @test + */ + public function can_create_user() + { + $response = $this->send( + $this->request('POST', '/api/users', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'attributes' => [ + 'username' => 'test', + 'password' => 'too-obscure', + 'email' => 'test@machine.local', + ], + ], + ], + ]) + ); - // ... + $this->assertEquals(200, $response->getStatusCode()); + } + + // ... } ``` @@ -340,19 +349,19 @@ use Flarum\Tests\integration\ConsoleTestCase; class ConsoleTest extends ConsoleTestCase { - /** - * @test - */ - public function command_works() - { - $input = [ - 'command' => 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } + /** + * @test + */ + public function command_works() + { + $input = [ + 'command' => 'some:command', // The command name, equivalent of `php flarum some:command` + 'foo' => 'bar', // arguments + '--lorem' => 'ipsum', // options + ]; + + $this->assertEquals('Some Output.', $this->runCommand($input)); + } } ``` diff --git a/docs/extend/theme.md b/docs/extend/theme.md index bd5071d96..011c541b0 100644 --- a/docs/extend/theme.md +++ b/docs/extend/theme.md @@ -21,7 +21,7 @@ All this will do is show your extension in the "theme" section in the admin dash ## Less Variable Customization -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. +You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. ## Switching Between Themes diff --git a/docs/extend/translate.md b/docs/extend/translate.md index 9f551027c..f3eb3f3ca 100644 --- a/docs/extend/translate.md +++ b/docs/extend/translate.md @@ -11,11 +11,10 @@ Here's a quick example from [Flarum English](https://github.com/flarum/lang-engl ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` -*Easy, right?* - +_Easy, right?_ ### Language Packs @@ -24,7 +23,7 @@ However, the process is a bit different for language packs. With a language pack ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` The `composer.json` will also need to be updated. It now needs a `flarum-locale` info object in `extra`, like `flarum-extension`. You can simply insert the following underneath the value of `flarum-extension` while remaining inside `extra`: @@ -36,4 +35,4 @@ The `composer.json` will also need to be updated. It now needs a `flarum-locale` } ``` -And that's it! It should work out of the box. \ No newline at end of file +And that's it! It should work out of the box. diff --git a/docs/extend/update-b12.md b/docs/extend/update-b12.md index 6cbcdba03..4f4755542 100644 --- a/docs/extend/update-b12.md +++ b/docs/extend/update-b12.md @@ -1,7 +1,7 @@ # Updating For Beta 12 Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether - your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). +your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). ::: tip @@ -32,4 +32,4 @@ If you need help applying these changes or using new features, please start a di ## Other changes / Recommendations - The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. +- The JS `slug()` helper from the `flarum/utils/string` module should only be used to _suggest_ slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/docs/extend/update-b14.md b/docs/extend/update-b14.md index aea7a88e8..26b1222c3 100644 --- a/docs/extend/update-b14.md +++ b/docs/extend/update-b14.md @@ -49,7 +49,6 @@ In mithril 0.2, we had 2 "lifecycle hooks": `config`, which ran when components were created, and on every redraw. - Mithril 2 has the following hooks; each of which take `vnode` as an argument: - `oninit` @@ -80,7 +79,7 @@ class OldMithrilComponent extends Component { context.onunload = () => { console.log('Code to run when the component is removed from the DOM'); - } + }; } view() { @@ -133,7 +132,7 @@ class NewMithrilComponent extends Component { } onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); + console.log('Code to run when the component is removed from the DOM'); } } ``` @@ -156,22 +155,24 @@ For example: ```js // Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } +app.routes.new_page = { path: '/new', component: NewPage.component() }; // Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } +app.routes.new_page = { path: '/new', component: NewPage }; ``` Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. ```js // Mithril 0.2 -<a href="/path" config={m.route}>Link Content</a> +<a href="/path" config={m.route}> + Link Content +</a>; // Mithril 2 import Link from 'flarum/components/Link'; -<Link href="/path">Link Content</Link> +<Link href="/path">Link Content</Link>; ``` You can also use `Link` to define external links, which will just render as plain `<a href="url">Children</a>` html links. @@ -219,7 +220,7 @@ For examples and other AJAX changes, see [the mithril documentation](https://mit // Mithril 0.2 const deferred = m.deferred(); -app.store.find('posts').then(result => deferred.resolve(result)); +app.store.find('posts').then((result) => deferred.resolve(result)); return deferred.promise; @@ -253,10 +254,10 @@ class ParentComponent extends Component { view() { return ( <div> - <button onclick={() => this.child.counter += 1}></button> + <button onclick={() => (this.child.counter += 1)}></button> {this.child.render()} </div> - ) + ); } } ``` @@ -281,10 +282,10 @@ class ParentComponent extends Component { view() { return ( <div> - <button onclick={() => this.counter += 1}></button> + <button onclick={() => (this.counter += 1)}></button> <ChildComponent counter={this.counter}></ChildComponent> </div> - ) + ); } } ``` @@ -309,21 +310,23 @@ class Counter { app.counter = new Counter(); -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', +extend(HeaderSecondary.prototype, 'items', function (items) { + items.add( + 'counterDisplay', <div> <p>Counter: {app.counter.getCount()}</p> </div> ); -}) +}); -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', +extend(HeaderPrimary.prototype, 'items', function (items) { + items.add( + 'counterButton', <div> <button onclick={() => app.counter.increaseCounter()}>Increase Counter</button> </div> ); -}) +}); ``` This "state pattern" can be found throughout core. Some non-trivial examples are: @@ -340,13 +343,13 @@ This "state pattern" can be found throughout core. Some non-trivial examples are Previously, modals could be opened by providing a `Modal` component instance: ```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); +app.modal.show(new LoginModal((identification: 'prefilledUsername'))); ``` Since we don't store component instances anymore, we pass in the component class and any attrs separately. ```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); +app.modal.show(LoginModal, { identification: 'prefilledUsername' }); ``` The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. @@ -357,15 +360,15 @@ Any modifications by extensions should accordingly be done to `ModalManagerState Previously, alerts could be opened by providing an `Alert` component instance: ```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); +app.alerts.show(new Alert((type: 'success'), (children: 'Hello, this is a success alert!'))); ``` Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: ```js app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); +app.alerts.show({ type: 'success' }, 'Hello, this is a success alert!'); +app.alerts.show(Alert, { type: 'success' }, 'Hello, this is a success alert!'); ``` Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. @@ -398,10 +401,10 @@ Similarly to Modals and Alerts, `app.composer.load` no longer accepts a componen ```js // Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); +app.composer.load(new DiscussionComposer({ user: app.session.user })); // Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) +app.composer.load(DiscussionComposer, { user: app.session.user }); ``` Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. @@ -435,7 +438,7 @@ Switch.component({ this.user.pushAttributes({ lastSeenAt: null }); this.preferenceSaver('discloseOnline')(value, component); }, -}) +}); // Without preferenceSaver Switch.component({ @@ -450,7 +453,7 @@ Switch.component({ }); }, loading: this.discloseOnlineLoading, -}) +}); ``` A replacement will eventually be introduced. @@ -480,7 +483,7 @@ Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStr #### SearchState and GlobalSearchState -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. +As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. At the minimum, `SearchState` contains the following methods: @@ -517,9 +520,7 @@ class CustomComponent extends Component { this.showContent = false; - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) + this.subtree = new SubtreeRetainer(() => this.showContent); } onbeforeupdate() { @@ -529,10 +530,12 @@ class CustomComponent extends Component { } view(vnode) { - return <div> - <button onclick={() => this.showContent = !this.showContent}>Toggle Extra Content</button> - <p>Hello World!{this.showContent ? ' Extra Content!' : ''}</p> - </div>; + return ( + <div> + <button onclick={() => (this.showContent = !this.showContent)}>Toggle Extra Content</button> + <p>Hello World!{this.showContent ? ' Extra Content!' : ''}</p> + </div> + ); } } ``` @@ -544,7 +547,11 @@ Previously, some components would have an attrs() method, which provided an exte ```js class CustomComponent extends Component { view() { - return <div {...this.attrs()}><p>Hello World!</p></div>; + return ( + <div {...this.attrs()}> + <p>Hello World!</p> + </div> + ); } attrs() { @@ -565,22 +572,25 @@ Previously, an element could be created with child elements by passing those in ```js Button.component({ className: 'Button Button--primary', - children: 'Button Text' + children: 'Button Text', }); ``` This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: ```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); +Button.component( + { + className: 'Button Button--primary', + }, + 'Button Text' +); ``` Children can still be passed in through JSX: ```js -<Button className='Button Button--primary'>Button Text</Button> +<Button className="Button Button--primary">Button Text</Button> ``` #### Tag attr @@ -595,33 +605,37 @@ The `affixSidebar` util has been removed. Instead, if you want to affix a sideba ```js class OldWay extends Component { view() { - return <div> - <div className="container"> - <div className="sideNavContainer"> - <nav className="sideNav" config={affixSidebar}> - <p>Affixed Sidebar</p> - </nav> - <div className="sideNavOffset">Actual Page Content</div> + return ( + <div> + <div className="container"> + <div className="sideNavContainer"> + <nav className="sideNav" config={affixSidebar}> + <p>Affixed Sidebar</p> + </nav> + <div className="sideNavOffset">Actual Page Content</div> + </div> </div> </div> - </div>; + ); } } class NewWay extends Component { view() { - return <div> - <div className="container"> - <div className="sideNavContainer"> - <AffixedSidebar> - <nav className="sideNav"> - <p>Affixed Sidebar</p> - </nav> - </AffixedSidebar> - <div className="sideNavOffset">Actual Page Content</div> + return ( + <div> + <div className="container"> + <div className="sideNavContainer"> + <AffixedSidebar> + <nav className="sideNav"> + <p>Affixed Sidebar</p> + </nav> + </AffixedSidebar> + <div className="sideNavOffset">Actual Page Content</div> + </div> </div> </div> - </div>; + ); } } ``` @@ -702,8 +716,8 @@ So, how do we specify dependencies for an extension? Well, all you need to do is "license": "MIT", "require": { "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency + "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency + "flarum/mentions": "^0.1.0-beta.14" // Will mark mentions as a dependency } // other config } diff --git a/docs/extend/update-b15.md b/docs/extend/update-b15.md index 6606a9e57..00b0d9258 100644 --- a/docs/extend/update-b15.md +++ b/docs/extend/update-b15.md @@ -20,11 +20,12 @@ If you need help applying these changes or using new features, please start a di - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level - `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead - `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. +- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/\*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. - `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead - `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: + - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. diff --git a/docs/extend/update-b8.md b/docs/extend/update-b8.md index 27ae779cb..69a46553a 100644 --- a/docs/extend/update-b8.md +++ b/docs/extend/update-b8.md @@ -28,28 +28,28 @@ Beta 8 introduces a new concept called **extenders** that replace the most commo use Flarum\Extend; return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] + (new Extend\Frontend('forum')) + ->js(__DIR__ . '/js/dist/forum.js') + ->css(__DIR__ . '/less/forum.less') + ->route('/t/{slug}', 'tag') + ->route('/tags', 'tags'), + + function (Dispatcher $events) { + $events->subscribe(Listener\AddForumTagsRelationship::class); + }, +]; ``` If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. -| Event | Extender | -| ----------------------------------- | ------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | +| Event | Extender | +| ------------------------------------ | ------------------------- | +| `Flarum\Event\ConfigureFormatter`\* | `Flarum\Extend\Formatter` | +| `Flarum\Event\ConfigureWebApp`\* | `Flarum\Extend\Frontend` | +| `Flarum\Event\ConfigureClientView`\* | `Flarum\Extend\Frontend` | +| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | +| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | +| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | _\* class no longer exists_ @@ -81,9 +81,9 @@ You'll need to make the following changes: 1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.html#transpilation). -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. +2. Inside your `admin` and `forum` _folders_, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. +3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` _folders_ into it. 4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. diff --git a/docs/faq.md b/docs/faq.md index 37dff33ea..2c3851a4b 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -42,4 +42,4 @@ Yes, but not for a while. Our focus right now is on getting Flarum stable and fe The real answer is that we generally keep an eye on our community for stand-out members who would make good staff. Honestly, for most of our current staff, what they did before becoming staff wasn't much different from what they do now. -Find a passion and contribute however you feel is best. Then let it take its course. You don't have to have a badge to be respected here. \ No newline at end of file +Find a passion and contribute however you feel is best. Then let it take its course. You don't have to have a badge to be respected here. diff --git a/docs/install.md b/docs/install.md index 55db7040e..a6afc1c54 100644 --- a/docs/install.md +++ b/docs/install.md @@ -4,7 +4,7 @@ Flarum is **beta software**. That means it still has some incomplete features and bugs 🐛🐞, and at some point – sooner or later – it will probably break! 💥 -Beta is all about fixing these issues and improving Flarum. **Please don't use Flarum in production unless you know what you're doing**. We can’t support you if things go awry. Upgrading to subsequent versions will be possible, but might involve getting your hands dirty. +Beta is all about fixing these issues and improving Flarum. **Please don't use Flarum in production unless you know what you're doing**. We can’t support you if things go awry. Upgrading to subsequent versions will be possible, but might involve getting your hands dirty. ::: @@ -18,10 +18,10 @@ Feel free to give Flarum a spin on one of our [demonstration forums](https://dis Before you install Flarum, it's important to check that your server meets the requirements. To run Flarum, you will need: -* **Apache** (with mod\_rewrite enabled) or **Nginx** -* **PHP 7.3+** with the following extensions: curl, dom, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+** or **MariaDB 10.0.5+** -* **SSH (command-line) access** to run Composer +- **Apache** (with mod_rewrite enabled) or **Nginx** +- **PHP 7.3+** with the following extensions: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip +- **MySQL 5.6+** or **MariaDB 10.0.5+** +- **SSH (command-line) access** to run Composer ::: tip Shared Hosting @@ -83,6 +83,7 @@ www.example.com { file_server } ``` + ## Folder Ownership During installation, Flarum may request that you make certain directories writable. To allow write access to a directory on Linux, execute the following command: @@ -97,9 +98,9 @@ If Flarum requests write access to both the directory and its contents, you need chmod 775 -R /path/to/directory ``` -If after completing these steps, Flarum continues to request that you change the permissions you may need to check that your files are owned by the correct group and user. +If after completing these steps, Flarum continues to request that you change the permissions you may need to check that your files are owned by the correct group and user. -By default, in most Linux distributions `www-data` is the group and user that both PHP and the web server operate under. You can change the folder ownership in most Linux operating systems by running `chown -R www-data:www-data foldername/`. +By default, in most Linux distributions `www-data` is the group and user that both PHP and the web server operate under. You can change the folder ownership in most Linux operating systems by running `chown -R www-data:www-data foldername/`. To find out more about these commands as well as file permissions and ownership on Linux, read [this tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). If you are setting up Flarum on Windows, you may find the answers to [this Super User question](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) useful. @@ -111,7 +112,7 @@ Your environment may vary from the documentation provided, please consult your w ::: danger Never use permission 777 -You should never set any folder or file to permission level `777`, as this permission level allows anyone to access the content of the folder and file regardless of user or group. +You should never set any folder or file to permission level `777`, as this permission level allows anyone to access the content of the folder and file regardless of user or group. ::: @@ -129,7 +130,7 @@ You will also need to edit the `index.php` file and change the following line: $site = require './site.php'; ``` - Finally, edit the `site.php` and update the paths in the following lines to reflect your new directory structure: +Finally, edit the `site.php` and update the paths in the following lines to reflect your new directory structure: ```php 'base' => __DIR__, @@ -141,9 +142,9 @@ $site = require './site.php'; If you have an existing community and don't want to start from scratch, you may be able to import your existing data into Flarum. While there are no official importers yet, the community has made several unofficial importers: -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) +- [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) +- [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) +- [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) +- [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) These can be used for other forum software as well by migrating to phpBB first, then to Flarum. Be aware that we can't guarantee that these will work nor can we offer support for them. diff --git a/docs/it/README.md b/docs/it/README.md index f4d43ffeb..46382121c 100644 --- a/docs/it/README.md +++ b/docs/it/README.md @@ -8,10 +8,10 @@ Questa pagina contiene le guide necessarie ad installare e gestire Flarum e ti i Flarum è la potente evoluzione di [esoTalk](https://github.com/esotalk/esoTalk) e [FluxBB](https://fluxbb.org). Progettato per essere: -* **Veloce e semplice.** Nessun disordine e niente dipendenze complesse. Flarum è progettato in PHP per essere facile e veloce da distribuire. L'interfaccia è basata su [Mithril](https://mithril.js.org), un potente e performante framework JavaScript dall'ingombro minimo. +- **Veloce e semplice.** Nessun disordine e niente dipendenze complesse. Flarum è progettato in PHP per essere facile e veloce da distribuire. L'interfaccia è basata su [Mithril](https://mithril.js.org), un potente e performante framework JavaScript dall'ingombro minimo. -* **Bello e responsive.** Il suo design si adatta a dispositivi fissi, mobili e tablet in maniera responsive. Flarum è progettato con cura per essere coerente e intuitivo su tutte le piattaforme.. +- **Bello e responsive.** Il suo design si adatta a dispositivi fissi, mobili e tablet in maniera responsive. Flarum è progettato con cura per essere coerente e intuitivo su tutte le piattaforme.. -* **Potente ed estendibile.** Personalizza, estendi e integra Flarum per creare la tua community unica. L'architettura di Flarum è molto flessibile grazie alle sue [potenti API per le estensioni](/extend/). +- **Potente ed estendibile.** Personalizza, estendi e integra Flarum per creare la tua community unica. L'architettura di Flarum è molto flessibile grazie alle sue [potenti API per le estensioni](/extend/). -* **Gratuito e aperto.** Flarum è totalmente gratuito e rilasciato sotto [Licenza MIT](https://github.com/flarum/flarum/blob/master/LICENSE). +- **Gratuito e aperto.** Flarum è totalmente gratuito e rilasciato sotto [Licenza MIT](https://github.com/flarum/flarum/blob/master/LICENSE). diff --git a/docs/it/bugs.md b/docs/it/bugs.md index 06d33cd12..da67c6b43 100644 --- a/docs/it/bugs.md +++ b/docs/it/bugs.md @@ -13,13 +13,13 @@ Grazie per averci aiutato a testare Flarum. Siamo felici di averti nella squadra Hai già trovato un bug? Meraviglioso Ci piacerebbe saperlo, ma prima dovresti controllare per assicurarti di non sprecare il tuo tempo su un problema già noto: - Cerca sul [forum di supporto](https://discuss.flarum.org/t/support) per vedere se il bug è stato già segnalato. -- Potremmo essere già al lavoro su una soluzione, quindi cerca anche sul nostro [sistema di gestione degli *issue*](https://github.com/flarum/core/issues). +- Potremmo essere già al lavoro su una soluzione, quindi cerca anche sul nostro [sistema di gestione degli _issue_](https://github.com/flarum/core/issues). -Se hai cercato a fondo e ne sei uscito a mani vuote, saremo lieti di ricevere il tuo rapporto. Se si tratta solo di un problema semplice (ad esempio una parola con errori di ortografia o un problema grafico), passa al paragrafo successivo. Ma se vedi errori o qualcosa è chiaramente un errore, avremo bisogno che tu raccolga prima alcune informazioni. Per favore leggi la guida alla [Risoluzione dei problemi](troubleshoot.md) e seguine le istruzioni. Raccogli più informzioni possibili! +Se hai cercato a fondo e ne sei uscito a mani vuote, saremo lieti di ricevere il tuo rapporto. Se si tratta solo di un problema semplice (ad esempio una parola con errori di ortografia o un problema grafico), passa al paragrafo successivo. Ma se vedi errori o qualcosa è chiaramente un errore, avremo bisogno che tu raccolga prima alcune informazioni. Per favore leggi la guida alla [Risoluzione dei problemi](troubleshoot.md) e seguine le istruzioni. Raccogli più informzioni possibili! ## Segnalare il problema -Monitoriamo i problemi su GitHub. Assicurati di aprire il problema nella [repository corretta](https://github.com/flarum), e inserisci tutte le informazioni nel modello di segnalazione bug. +Monitoriamo i problemi su GitHub. Assicurati di aprire il problema nella [repository corretta](https://github.com/flarum), e inserisci tutte le informazioni nel modello di segnalazione bug. Se puoi, controlla se il problema è riproducibile con l'ultima versione di Flarum. Se stai utilizzando una versione pre-rilascio o di sviluppo, indica la versione specifica che stai utilizzando. diff --git a/docs/it/code-of-conduct.md b/docs/it/code-of-conduct.md index cce30f8ba..ea852ed27 100644 --- a/docs/it/code-of-conduct.md +++ b/docs/it/code-of-conduct.md @@ -16,9 +16,9 @@ Siamo tutti qui per parlare di Flarum, e lavorare insieme per renderlo un'applic - Spam, messaggi di phishing e qualsiasi azione intesa a deturpare questo sito - Discussione sulla pirateria del software e argomenti simili -*Tutte queste azioni sono passibili di azione da parte dei moderatori. Se hai un problema con un altro membro, ti chiediamo di non affrontarlo da solo. Se è sul forum, utilizza il comando Segnala sul post in questione, quindi lascia che sia lo staff a occuparsi della situazione. [admin@flarum.org](mailto:admin@flarum.org). +\*Tutte queste azioni sono passibili di azione da parte dei moderatori. Se hai un problema con un altro membro, ti chiediamo di non affrontarlo da solo. Se è sul forum, utilizza il comando Segnala sul post in questione, quindi lascia che sia lo staff a occuparsi della situazione. [admin@flarum.org](mailto:admin@flarum.org). -I nostri moderatori possono modificare o eliminare qualsiasi contenuto offensivo o di disturbo al flusso di comunicazione. Reati gravi o ripetuti possono portare alla sospensione dell'account dell'utente offensivo. Detto ci, sii sempre gentile e calmo. 😎 +I nostri moderatori possono modificare o eliminare qualsiasi contenuto offensivo o di disturbo al flusso di comunicazione. Reati gravi o ripetuti possono portare alla sospensione dell'account dell'utente offensivo. Detto ci�, sii sempre gentile e calmo. 😎 ### Fatti sentire! @@ -27,25 +27,25 @@ Vuoi iniziare una nuova discussione? Innanzitutto, assicurati di leggere le [nos Quando sei sicuro di essere pronto per iniziare una discussione, tieni presente i seguenti punti: - Dagli un buon titolo! Otterrai i migliori risultati se il tuo titolo chiarisce di cosa vuoi parlare. -- Scegli i tag giusti. Ci aumenter le probabilit che il tuo post venga letto e riceva risposte più in fretta. -- Non postare ripetutamente sullo stesso argomento, perch cos facendo potresti ottenere l'effetto opposto. +- Scegli i tag giusti. Ci� aumenter� le probabilit� che il tuo post venga letto e riceva risposte più in fretta. +- Non postare ripetutamente sullo stesso argomento, perch� cos� facendo potresti ottenere l'effetto opposto. - Se non utilizzi un tag riservato per l'uso multilingue, pubblica solo in italiano. Non possiamo aiutarti se non possiamo leggerti! - Ricorda, non è necessario firmare i tuoi post. Abbiamo il tuo profilo per farci sapere chi sei. -Per favore, sforzati di aiutarci a mantenere le cose organizzate. Il tempo speso a riordinare tempo che non possiamo dedicare a conoscerti, discutere i tuoi problemi e parlare di Flarum. Che dopotutto il nostro scopo principale. +Per favore, sforzati di aiutarci a mantenere le cose organizzate. Il tempo speso a riordinare � tempo che non possiamo dedicare a conoscerti, discutere i tuoi problemi e parlare di Flarum. Che dopotutto � il nostro scopo principale. ### Le tue risposte sono importanti - + Ti stai prendendo il tempo per partecipare a una discussione, nella speranza che gli altri leggano le tue idee e le tengano in considerazione. Allora perch� non fare lo sforzo di rendere la tua risposta degna di essere letta? - Non rispondere al titolo. Prenditi un po di tempo per leggere tutto attentamente, ed esamina per bene tutta la conversazione. - Chiediti se la tua risposta aggiunge davvero qualcosa alla discussione. In caso contrario, pensaci ancora prima di pubblicare. - Evita di rispondere con una sola parola come "grazie" o "ok"; puoi usare il tasto "Mi piace" per questo. -- Evita di creare pi post di seguito quando uno sarebbe sufficiente. Questo è un forum, non una chat room. +- Evita di creare pi�� post di seguito quando uno sarebbe sufficiente. Questo è un forum, non una chat room. - Se è probabile che la tua risposta possa deviare il corso della discussione, valuta invece di iniziare una nuova discussione. - Se vuoi solo pubblicare un po' di sciocchezze come test, fallo nel apposita sezione di test del forum. -- Assicurati che le tue risposte forniscano feedback e supporto costruttivi per consentire una comunit inclusiva. +- Assicurati che le tue risposte forniscano feedback e supporto costruttivi per consentire una comunit� inclusiva. -Nessuno si lamenter dello scherzo occasionale o dell'osservazione intelligente. Ci piace mantenere l'atmosfera leggera! Ma anche per mantenere le cose produttive, ti chiediamo di cercare di evitare di far deragliare del tutto una discussione. +Nessuno si lamenter� dello scherzo occasionale o dell'osservazione intelligente. Ci piace mantenere l'atmosfera leggera! Ma anche per mantenere le cose produttive, ti chiediamo di cercare di evitare di far deragliare del tutto una discussione. > Grazie a Dominion per il suo aiuto nella stesura delle linee guida. diff --git a/docs/it/config.md b/docs/it/config.md index 564640e33..5c2ea9a48 100644 --- a/docs/it/config.md +++ b/docs/it/config.md @@ -10,10 +10,9 @@ Fornisce inoltre a Flarum informazioni importanti sul database e altro ancora. Ecco una rapida panoramica di cosa significa con un file di esempio: ```php -<?php return array ( +<?php return [ 'debug' => false, // abilita o disabilita il debug mode, utilizzato per la risoluzione dei problemi - 'database' => - array ( + 'database' => [ 'driver' => 'mysql', // il driver del database, es. MySQL, MariaDB... 'host' => 'localhost', // l'host della connessione, localhost nella maggior parte dei casi a meno di non utilizzare un servizio esterno 'database' => 'flarum', // il nome del database nell'istanza @@ -24,12 +23,11 @@ Ecco una rapida panoramica di cosa significa con un file di esempio: 'prefix' => '', // il prefisso delle tabelle, utile se condividi lo stesso database con altri servizi 'port' => '3306', // la porta di connessione, di default 3306 con MySQL 'strict' => false, - ), + ], 'url' => 'https://flarum.localhost', // l'URL di installazione, vorrai cambiarlo se cambi domini - 'paths' => - array ( + 'paths' => [ 'api' => 'api', // /api punta alle API 'admin' => 'admin', // /admin punta al pannello di amministrazione - ), -); + ], +]; ``` diff --git a/docs/it/contributing.md b/docs/it/contributing.md index f29e41190..c031dab83 100644 --- a/docs/it/contributing.md +++ b/docs/it/contributing.md @@ -4,7 +4,7 @@ Interessato a contribuire allo sviluppo di Flarum? È fantastico! Dalla [segnala Prima di contribuire, leggi il [codice di condotta](code-of-conduct.md). -Questo documento è una guida per gli sviluppatori che vogliono contribuire con codice a Flarum. Se hai appena iniziato, ti consigliamo di leggere la documentazione [Per iniziare](/extend/start.md) (per ora in inglese) sul funzionamento di Flarum. +Questo documento è una guida per gli sviluppatori che vogliono contribuire con codice a Flarum. Se hai appena iniziato, ti consigliamo di leggere la documentazione [Per iniziare](/extend/start.md) (per ora in inglese) sul funzionamento di Flarum. ## Su cosa lavorare @@ -54,33 +54,38 @@ npm run dev Un esempio tipico di flusso di lavoro può essere questo: 1. 🌳 **Crea un branch** per le funzionalità partendo da un branch appropriato. - * * Le correzioni di bug* dovrebbero essere inviate all'ultimo branch stabile. - * *Funzionalità minori* che sono completamente retrocompatibili con l'attuale versione di Flarum possono essere inviate all'ultimo branch stabile. - * *Funzionalità importanti* devono essere sempre inviate al branch `master` che contiene la successiva versione di Flarum. - * Internamente usiamo lo schema di denominazione `<iniziali>/<breve-descrizione>` (es. `tz/refactor-frontend`). + + - - Le correzioni di bug\* dovrebbero essere inviate all'ultimo branch stabile. + - _Funzionalità minori_ che sono completamente retrocompatibili con l'attuale versione di Flarum possono essere inviate all'ultimo branch stabile. + - _Funzionalità importanti_ devono essere sempre inviate al branch `master` che contiene la successiva versione di Flarum. + - Internamente usiamo lo schema di denominazione `<iniziali>/<breve-descrizione>` (es. `tz/refactor-frontend`). 2. 🔨 **Scrivi** un po' di codice. - * Vedi sotto per lo [stile del codice](#stile-del-codice). -1. 🚦 **Testa** il tuo codice. - * Aggiungi unit test in base alle esigenze durante la correzione di bug o l'aggiunta di funzionalità. - * Lancia la suite di test con `vendor/bin/phpunit` nella cartella del pacchetto pertinente. + - Vedi sotto per lo [stile del codice](#stile-del-codice). + +3. 🚦 **Testa** il tuo codice. +_ Aggiungi unit test in base alle esigenze durante la correzione di bug o l'aggiunta di funzionalità. +_ Lancia la suite di test con `vendor/bin/phpunit` nella cartella del pacchetto pertinente. <!-- * Vedi [qui](link-to-core/tests/README.md) per maggiori informazioni su come testare Flarum. --> 4. 💾 **Crea dei commit** per il tuo codice con un messaggio descrittivo. - * Se la modifica risolve un problema esistente (di solito, dovrebbe) includere "Fixes #123" in una nuova riga, dove 123 è il numero dell'issue GitHub. - * Scrivi un [buon messaggio accompagnatorio](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + + - Se la modifica risolve un problema esistente (di solito, dovrebbe) includere "Fixes #123" in una nuova riga, dove 123 è il numero dell'issue GitHub. + - Scrivi un [buon messaggio accompagnatorio](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 5. 🎁 **Invia** una Pull Request su GitHub. - * Riempi i campi della richiesta. - * Se la modifica è visiva, includi uno screenshot o una GIF che dimostri la modifica. - * NON eseguire il check-in di JavaScript nei file `dist` Verra fatto automaticamente una volta uniti. + + - Riempi i campi della richiesta. + - Se la modifica è visiva, includi uno screenshot o una GIF che dimostri la modifica. + - NON eseguire il check-in di JavaScript nei file `dist` Verra fatto automaticamente una volta uniti. 6. 🤝 **Coinvolgi il team** di Flarum per l'approvazione. - * I membri del team esamineranno il tuo codice. Potremmo suggerire alcune modifiche o miglioramenti o alternative, ma per piccoli cambiamenti la tua richiesta pull dovrebbe essere accettata rapidamente. - * Quando lasci un feedback, aggiungi commenti invece di sovrascriverli o eliminarli (li uniremo noi). + + - I membri del team esamineranno il tuo codice. Potremmo suggerire alcune modifiche o miglioramenti o alternative, ma per piccoli cambiamenti la tua richiesta pull dovrebbe essere accettata rapidamente. + - Quando lasci un feedback, aggiungi commenti invece di sovrascriverli o eliminarli (li uniremo noi). 7. 🕺 **Festeggia** per aver contribuito a Flarum! @@ -94,10 +99,10 @@ Non preoccuparti se lo stile del tuo codice non è perfetto! StyleCI unirà auto Flarum segue gli standard di codice [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) e [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md). Inoltre, ci conformiamo a una serie di [altre regole di stile](https://github.com/flarum/core/blob/master/.styleci.yml). Usiamo il type hinting di PHP 7 dove possibile, e [PHPDoc](https://docs.phpdoc.org/) per la documentazione inline. Prova a rispettare lo stile utilizzato dal resto del codice nei tuoi contributi. -* Gli spazi dei nomi dovrebbero essere in singolare (es. `Flarum\Discussion`, non `Flarum\Discussions`) -* Le interfacce dovrebbero avere il suffisso `Interface` (es. `MailableInterface`) -* Le classi astratte dovrebbero essere precedute da `Abstract` (es. `AbstractModel`) -* I tratti dovrebbero essere suffissi con `Trait` (es. `ScopeVisibilityTrait`) +- Gli spazi dei nomi dovrebbero essere in singolare (es. `Flarum\Discussion`, non `Flarum\Discussions`) +- Le interfacce dovrebbero avere il suffisso `Interface` (es. `MailableInterface`) +- Le classi astratte dovrebbero essere precedute da `Abstract` (es. `AbstractModel`) +- I tratti dovrebbero essere suffissi con `Trait` (es. `ScopeVisibilityTrait`) ### JavaScript @@ -106,20 +111,22 @@ JavaScript di Flarum segue principalmente la [Airbnb Style Guide](https://github ### Database **Le colonne** dovrebbero essere denominate in base al tipo di dati: -* DATETIME o TIMESTAMP: `{verbed}_at` (es. created_at, read_at) o `{verbed}_until` (eg. suspended_until) -* INT considerato come conteggio: `{noun}_count` (es. comment_count, word_count) -* Chiave esterna: `{verbed}_{entity}_id` (es. hidden_user_id) - * Il verbo può essere omesso per la relazione primaria (es. autore del post � semplicemente `user_id`) -* BOOL: `is_{adjective}` (es. is_locked) + +- DATETIME o TIMESTAMP: `{verbed}_at` (es. created_at, read_at) o `{verbed}_until` (eg. suspended_until) +- INT considerato come conteggio: `{noun}_count` (es. comment_count, word_count) +- Chiave esterna: `{verbed}_{entity}_id` (es. hidden_user_id) + - Il verbo può essere omesso per la relazione primaria (es. autore del post � semplicemente `user_id`) +- BOOL: `is_{adjective}` (es. is_locked) **Le Tabelle** dovrebbero chiamarsi in questo modo: -* Usa la forma plurale (`discussions`) -* Separa più parole con il trattino basso (`access_tokens`) -* Per le tabelle delle relazioni, unisci i due nomi di tabella in forma singolare con un trattino basso in ordine alfabetico (es. `discussion_user`) + +- Usa la forma plurale (`discussions`) +- Separa più parole con il trattino basso (`access_tokens`) +- Per le tabelle delle relazioni, unisci i due nomi di tabella in forma singolare con un trattino basso in ordine alfabetico (es. `discussion_user`) ### CSS -Le classi CSS di Flarum seguono più o meno il [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) con il formato `.ComponentName-descendentName--modifierName`. +Le classi CSS di Flarum seguono più o meno il [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) con il formato `.ComponentName-descendentName--modifierName`. ### Traduzioni diff --git a/docs/it/extend/README.md b/docs/it/extend/README.md index 18f6d8ed1..fb3549400 100644 --- a/docs/it/extend/README.md +++ b/docs/it/extend/README.md @@ -22,7 +22,7 @@ Le ** estensioni in bundle ** sono funzionalità incluse in Flarum e abilitate p ** Le estensioni di terze parti ** sono funzionalità create da altri e non sono ufficialmente supportate dal team di Flarum. Possono essere costruite e utilizzate per affrontare casi d'uso più specifici. -Se stai cercando di risolvere un bug o un difetto del core, o di un'estensione in bundle esistente, potrebbe essere appropriato * contribuire al rispettivo progetto * piuttosto che disperdere gli sforzi su una nuova estensione di terze parti. È una buona idea iniziare una discussione sulla [Community di Flarum](https://discuss.flarum.org/) per avere opinioni anche dagli sviluppatori di Flarum. +Se stai cercando di risolvere un bug o un difetto del core, o di un'estensione in bundle esistente, potrebbe essere appropriato _ contribuire al rispettivo progetto _ piuttosto che disperdere gli sforzi su una nuova estensione di terze parti. È una buona idea iniziare una discussione sulla [Community di Flarum](https://discuss.flarum.org/) per avere opinioni anche dagli sviluppatori di Flarum. ## Risorse utili diff --git a/docs/it/extend/admin.md b/docs/it/extend/admin.md index a50db6a8c..9e390a784 100644 --- a/docs/it/extend/admin.md +++ b/docs/it/extend/admin.md @@ -18,18 +18,15 @@ Questa nuova API ti consente di aggiungere impostazioni alla tua estensione con ### Raccontare all'API la tua estensione -Prima di poter registrare qualsiasi cosa, è necessario dire a `ExtensionData` per quale estensione si vogliono ottenere i dati. +Prima di poter registrare qualsiasi cosa, è necessario dire a `ExtensionData` per quale estensione si vogliono ottenere i dati. Semplicemente lancia la funzione `for` su `app.extensionData` passando l'ID della tua estensione. Per trovare l'ID estensione, prendi il nome del composer e sostituisci eventuali barre con trattini (esempio: 'fof/merge-discussions' diventa 'fof-merge-discussions'). Per il seguente esempio, useremo l'estensione fittizia 'acme/interstellar': ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar'); }); ``` @@ -50,19 +47,15 @@ Per aggiungere un campo, richiama la funzione `registerSetting` dopo `for` su `a Ecco un esempio con un elemento switch (booleano): ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // Questa è la chiave con cui verranno salvate le impostazioni nella tabella delle impostazioni nel database. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // L'etichetta da mostrare che consente all'amministratore di sapere cosa fa l'impostazione. - type: 'boolean', // Di che tipo di impostazione si tratta, le opzioni valide sono: boolean, text (o qualsiasi altro tipo di tag <input>) e select. - }, - 30 // Opzionale: Priorità - ) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting( + { + setting: 'acme-interstellar.coordinates', // Questa è la chiave con cui verranno salvate le impostazioni nella tabella delle impostazioni nel database. + label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // L'etichetta da mostrare che consente all'amministratore di sapere cosa fa l'impostazione. + type: 'boolean', // Di che tipo di impostazione si tratta, le opzioni valide sono: boolean, text (o qualsiasi altro tipo di tag <input>) e select. + }, + 30 // Opzionale: Priorità + ); }); ``` @@ -81,29 +74,23 @@ Se utilizzi `type: 'select'` l'oggetto ha un aspetto leggermente diverso: } ``` - Se vuoi aggiungere qualcosa alle impostazioni come del testo extra o un input più complicato, puoi anche passare un callback come primo argomento che restituisce JSX. Questo callback verrà eseguito nel contesto di [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) e i valori di impostazione non verranno serializzati automaticamente. ```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( - <div className="Form-group"> - <h1> {app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')} </h1> - <label className="checkbox"> - <input type="checkbox" bidi={this.setting('acme-interstellar.rocket_man_setting')}/> - {app.translator.trans('acme-interstellar.admin.rocket_man_setting_label')} - </label> - </div> - ); - } - }) +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerSetting(function () { + if (app.session.user.username() === 'RocketMan') { + return ( + <div className="Form-group"> + <h1> {app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')} </h1> + <label className="checkbox"> + <input type="checkbox" bidi={this.setting('acme-interstellar.rocket_man_setting')} /> + {app.translator.trans('acme-interstellar.admin.rocket_man_setting_label')} + </label> + </div> + ); + } + }); }); ``` @@ -111,29 +98,27 @@ app.initializers.add('interstellar', function(app) { Novità nella beta 15, le autorizzazioni ora possono essere trovate in 2 posizioni. Ora puoi visualizzare le autorizzazioni individuali di ciascuna estensione sulla loro pagina. Tutte le autorizzazioni possono ancora essere trovate nella pagina delle autorizzazioni. -Affinché ciò avvenga, i permessi devono essere registrati con `ExtensionData`. Questo viene fatto in modo simile alle impostazioni, richiama `registerPermission`. +Affinché ciò avvenga, i permessi devono essere registrati con `ExtensionData`. Questo viene fatto in modo simile alle impostazioni, richiama `registerPermission`. + +Argomenti: + +- Oggetto autorizzazione +- Che tipo di autorizzazione - vedere le funzioni di [`PermissionGrid`] (https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) per i tipi (rimuovi elementi dal nome) +- Priorità di `ItemList` -Argomenti: - * Oggetto autorizzazione - * Che tipo di autorizzazione - vedere le funzioni di [`PermissionGrid`] (https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) per i tipi (rimuovi elementi dal nome) - * Priorità di `ItemList` - Torniamo alla nostra estensione missilistica preferita: ```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Icone Font-Awesome - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etichetta di autorizzazione - permission: 'discussion.rocket_fly', // Nome effettivo dell'autorizzazione memorizzato nel database (e utilizzato durante il controllo dell'autorizzazione). - }, - 'start', // Il permesso di categoria verrà aggiunto alla griglia - 95 // Opzional: Priorità - ); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPermission( + { + icon: 'fas fa-rocket', // Icone Font-Awesome + label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etichetta di autorizzazione + permission: 'discussion.rocket_fly', // Nome effettivo dell'autorizzazione memorizzato nel database (e utilizzato durante il controllo dell'autorizzazione). + }, + 'start', // Il permesso di categoria verrà aggiunto alla griglia + 95 // Opzional: Priorità + ); }); ``` @@ -161,25 +146,18 @@ import ExtensionPage from 'flarum/components/ExtensionPage'; export default class StarPage extends ExtensionPage { content() { - return ( - <h1>Ciao dalla sezione impostazioni!</h1> - ) + return <h1>Ciao dalla sezione impostazioni!</h1>; } } - ``` Quindi lancia `registerPage`: ```js - import StarPage from './components/StarPage'; -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); +app.initializers.add('interstellar', function (app) { + app.extensionData.for('acme-interstellar').registerPage(StarPage); }); ``` @@ -193,11 +171,11 @@ Nella beta 15, le pagine di estensione lasciano spazio a informazioni aggiuntive Per maggiori informationi, guarda [composer.json schema](https://getcomposer.org/doc/04-schema.md). -| Descrizione | dovein composer.json | -| --------------------------------- | -------------------------------------- | -| discuss.flarum.org discussion link | "forum" all'interno di "support" | -| Documentation | "docs" all'interno di "support" | -| Support (email) | "email" all'interno di "support" | -| Website | "homepage" chiave | +| Descrizione | dovein composer.json | +| ---------------------------------- | ----------------------------------------------------------------------- | +| discuss.flarum.org discussion link | "forum" all'interno di "support" | +| Documentation | "docs" all'interno di "support" | +| Support (email) | "email" all'interno di "support" | +| Website | "homepage" chiave | | Donate | "funding" key block (Nota: verrà utilizzato solo il primo collegamento) | -| Source | "source" all'interno di "support" | +| Source | "source" all'interno di "support" | diff --git a/docs/it/extend/api-throttling.md b/docs/it/extend/api-throttling.md index 7deb05557..90816cab4 100644 --- a/docs/it/extend/api-throttling.md +++ b/docs/it/extend/api-throttling.md @@ -17,7 +17,7 @@ Il formato per un limitatore personalizzato è estremamente semplice: tutto ciò - `false`: Questo ignora esplicitamente la limitazione per questa richiesta, ignorando tutti gli altri limitatori - `true`: Questo contrassegna la richiesta come da limitare. - `null`: Significa che la limitazione non viene applicata. -Qualsiasi altra uscita verrà ignorata, con lo stesso effetto di `null`. + Qualsiasi altra uscita verrà ignorata, con lo stesso effetto di `null`. Le limitazioni si applicano a OGNI richiesta. Ad esempio, considera le limitazioni ai post di Flarum: @@ -25,21 +25,26 @@ Le limitazioni si applicano a OGNI richiesta. Ad esempio, considera le limitazio use DateTime; use Flarum\Post\Post; -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; +function ($request) +{ + if (!in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { + return; + } + + $actor = $request->getAttribute('actor'); + + if ($actor->can('postWithoutThrottle')) { + return false; + } + + if ( + Post::where('user_id', $actor->id) + ->where('created_at', '>=', new DateTime('-10 seconds')) + ->exists() + ) { + return true; + } +} ``` Le limitazioni possono essere aggiunte o rimosse tramite `ThrottleApi` in `extend.php`. Per esempio: @@ -50,12 +55,12 @@ Le limitazioni possono essere aggiunte o rimosse tramite `ThrottleApi` in `exten use Flarum\Extend; return [ - // Other extenders - (new Extend\ThrottleApi()) - ->set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders + // Other extenders + (new Extend\ThrottleApi()) + ->set('throttleAll', function () { + return false; + }) + ->remove('bypassThrottlingAttribute'), + // Other extenders ]; ``` diff --git a/docs/it/extend/authorization.md b/docs/it/extend/authorization.md index 2195aa1f4..272743496 100644 --- a/docs/it/extend/authorization.md +++ b/docs/it/extend/authorization.md @@ -31,7 +31,7 @@ Per prima cosa, eseguiamo l'intera richiesta (tutti e tre i parametri) attravers - `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (tramite `$this->forceAllow()`) - `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (tramite `$this->forceDeny()`) -I risultati delle policy sono considerati prioritari `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. Ad esempio, se viene restituita una singola policy `FORCE_DENY`, tutte le altre policy verranno ignorate. Se una policy restituisce `DENY` e altre 10 restituiscono `ALLOW`, la richiesta verrà rifiutata. Ciò consente di prendere decisioni indipendentemente dall'ordine in cui le estensioni vengono avviate. Le policy sono estremamente potenti: +I risultati delle policy sono considerati prioritari `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. Ad esempio, se viene restituita una singola policy `FORCE_DENY`, tutte le altre policy verranno ignorate. Se una policy restituisce `DENY` e altre 10 restituiscono `ALLOW`, la richiesta verrà rifiutata. Ciò consente di prendere decisioni indipendentemente dall'ordine in cui le estensioni vengono avviate. Le policy sono estremamente potenti: se l'accesso viene negato in fase di policy, questo sovrascriverà i permessi dei gruppi e i privilegi di amministratore. In secondo luogo, se tutte le policy restituiscono null (o non restituiscono nulla), controlliamo se l'utente è in un gruppo che ha un permesso che consenta l'azione (nota che sia i permessi che le azioni sono rappresentati sotto forma di stringhe). In tal caso, autorizziamo l'azione. @@ -45,8 +45,6 @@ Infine, poiché abbiamo esaurito tutti i controlli, daremo per scontato che l'ut Il sistema di autorizzazione di Flarum è accessibile attraverso metodi pubblici delle classi `Flarum\User\User`. I più importanti sono elencati di seguito; altri sono documentati nelle [documentazioni PHP API](https://api.docs.flarum.org/php/master/flarum/user/user). - - In questo esempio, useremo `$actor` come istanza di `Flarum\User\User`, `'viewDiscussions'` e `'reply'` come esempi di abilità, e `$discussion` (istanza di `Flarum\Discussion\Discussion`) come esempio di argomento. ```php @@ -107,27 +105,27 @@ use Flarum\User\User; class TagPolicy extends AbstractPolicy { - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function startDiscussion(User $actor, Tag $tag) - { - if ($tag->is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function startDiscussion(User $actor, Tag $tag) + { + if ($tag->is_restricted) { + return $actor->hasPermission('tag' . $tag->id . '.startDiscussion') ? $this->allow() : $this->deny(); } + } + + /** + * @param User $actor + * @param Tag $tag + * @return bool|null + */ + public function addToDiscussion(User $actor, Tag $tag) + { + return $this->startDiscussion($actor, $tag); + } } ``` @@ -145,34 +143,34 @@ use Flarum\User\User; class GlobalPolicy extends AbstractPolicy { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } + + /** + * @param Flarum\User\User $actor + * @param string $ability + * @return bool|void + */ + public function can(User $actor, string $ability) + { + if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { + $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); + $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); + + if ($enoughPrimary && $enoughSecondary) { + return $this->allow(); + } else { + return $this->deny(); + } } + } } ``` @@ -187,9 +185,7 @@ use YourNamespace\Access; return [ // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), + (new Extend\Policy())->modelPolicy(Tag::class, Access\TagPolicy::class)->globalPolicy(Access\GlobalPolicy::class), // Other extenders ]; ``` @@ -235,8 +231,6 @@ Esistono in realtà due tipi di scoper: - Gli scopers basati sulle azioni verranno applicati a tutte le query per il modello eseguito con una determinata capacità (che per impostazione predefinita è `"view"`). Si prega di notare che questo non è correlato alle stringhe di abilità del [policy system](#how-it-works) - Tieni presente che gli scopers globali verranno eseguiti su TUTTE le query per il relativo modello, inclusi `view`, che potrebbe creare loop infiniti o errori. Generalmente, vengono eseguiti solo per abilità che non iniziano con "view". Puoi vedere qualcosa nell' [esempio sottostante](#custom-visibility-scoper-examples) - - Un caso d'uso comune per questo è consentire l'estensibilità all'interno dell'ambito della visibilità. Diamo un'occhiata a un semplice pezzo di `Flarum\Post\PostPolicy`: @@ -248,10 +242,9 @@ $query->where('posts.is_private', false); // Tuttavia, riconosciamo che alcune estensioni potrebbero avere casi d'uso validi per la visualizzazione di post privati. // Quindi, invece, includiamo tutti i post che non sono privati E tutti i post privati desiderati dalle estensioni $query->where(function ($query) use ($actor) { - $query->where('posts.is_private', false) - ->orWhere(function ($query) use ($actor) { - $query->whereVisibleTo($actor, 'viewPrivate'); - }); + $query->where('posts.is_private', false)->orWhere(function ($query) use ($actor) { + $query->whereVisibleTo($actor, 'viewPrivate'); + }); }); ``` @@ -266,12 +259,12 @@ use Illuminate\Database\Eloquent\Builder; class ScopePostVisibility { - public function __invoke(User $actor, $query) - { - if ($actor->can('posts.viewPrivate')) { - $query->whereRaw("1=1"); - } + public function __invoke(User $actor, $query) + { + if ($actor->can('posts.viewPrivate')) { + $query->whereRaw('1=1'); } + } } ``` @@ -294,14 +287,14 @@ use Illuminate\Database\Eloquent\Builder; class ScopeTagVisibility { - /** - * @param User $actor - * @param Builder $query - */ - public function __invoke(User $actor, Builder $query) - { - $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); - } + /** + * @param User $actor + * @param Builder $query + */ + public function __invoke(User $actor, Builder $query) + { + $query->whereNotIn('id', Tag::getIdsWhereCannot($actor, 'viewDiscussions')); + } } ``` @@ -318,26 +311,27 @@ use Illuminate\Database\Eloquent\Builder; class ScopeDiscussionVisibilityForAbility { - /** - * @param User $actor - * @param Builder $query - * @param string $ability - */ - public function __invoke(User $actor, Builder $query, $ability) - { - if (substr($ability, 0, 4) === 'view') { - return; - } - - // If a discussion requires a certain permission in order for it to be - // visible, then we can check if the user has been granted that - // permission for any of the discussion's tags. - $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { - return $query->select('discussion_id') - ->from('discussion_tag') - ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.'.$ability)); - }); + /** + * @param User $actor + * @param Builder $query + * @param string $ability + */ + public function __invoke(User $actor, Builder $query, $ability) + { + if (substr($ability, 0, 4) === 'view') { + return; } + + // If a discussion requires a certain permission in order for it to be + // visible, then we can check if the user has been granted that + // permission for any of the discussion's tags. + $query->whereIn('discussions.id', function ($query) use ($actor, $ability) { + return $query + ->select('discussion_id') + ->from('discussion_tag') + ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.' . $ability)); + }); + } } ``` @@ -345,8 +339,6 @@ Nota che, come accennato in precedenza, non lo eseguiamo per le abilità che ini ### Registrazione di scopers personalizzati - - ```php use Flarum\Extend; use Flarum\Discussion\Discussion; @@ -359,11 +351,9 @@ return [ // 'view' is optional here, since that's the default value for the ability argument. // However, if we were applying this to a different ability, such as `viewPrivate`, // would need to explicitly specify that. - (new Extend\ModelVisibility(Tag::class)) - ->scope(Access\ScopeTagVisibility::class, 'view'), + (new Extend\ModelVisibility(Tag::class))->scope(Access\ScopeTagVisibility::class, 'view'), - (new Extend\ModelVisibility(Discussion::class)) - ->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), + (new Extend\ModelVisibility(Discussion::class))->scopeAll(Access\ScopeDiscussionVisibilityForAbility::class), // Other extenders ]; ``` diff --git a/docs/it/extend/backend-events.md b/docs/it/extend/backend-events.md index 64489a544..21ade4c89 100644 --- a/docs/it/extend/backend-events.md +++ b/docs/it/extend/backend-events.md @@ -4,7 +4,7 @@ Spesso, un'estensione vorrà reagire ad alcuni eventi che si verificano da qualc :::warning Precedente Event API -Storicamente, Flarum ha utilizzato eventi per le sue estensioni API, come `GetDisplayName` o `ConfigureApiRoutes` per consentire alle estensioni di inserire logica in varie parti di Flarum. Questi eventi vengono gradualmente eliminati a favore del dichiarativo [extender system](start.md#extenders), e verrà rimosso prima di una versione stabile. Gli eventi di dominio non verranno rimossi. +Storicamente, Flarum ha utilizzato eventi per le sue estensioni API, come `GetDisplayName` o `ConfigureApiRoutes` per consentire alle estensioni di inserire logica in varie parti di Flarum. Questi eventi vengono gradualmente eliminati a favore del dichiarativo [extender system](start.md#extenders), e verrà rimosso prima di una versione stabile. Gli eventi di dominio non verranno rimossi. ::: @@ -19,23 +19,21 @@ use Flarum\Extend; use Flarum\Post\Event\Deleted; use Symfony\Contracts\Translation\TranslatorInterface; - return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) + (new Extend\Event()) + ->listen(Deleted::class, function ($event) { + // do something here + }) + ->listen(Deleted::class, PostDeletedListener::class), ]; - class PostDeletedListener { protected $translator; public function __construct(TranslatorInterface $translator) { - $this->translator = $translator; + $this->translator = $translator; } public function handle(Deleted $event) @@ -55,30 +53,27 @@ L'invio di eventi è molto semplice. Tutto quello che devi fare è iniettare `Il use Flarum\Post\Event\Deleted; use Illuminate\Contracts\Events\Dispatcher; - class SomeClass { - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } + /** + * @var Dispatcher + */ + protected $events; + + /** + * @param Dispatcher $events + */ + public function __construct(Dispatcher $events) + { + $this->events = $events; + } + + public function someMethod() + { + // Logic + $this->events->dispatch(new Deleted($somePost, $someActor)); + // More Logic + } } ``` @@ -105,24 +100,24 @@ use Flarum\User\User; class Deleted { - /** - * @var Post - */ - public $post; - - /** - * @var User - */ - public $actor; - - /** - * @param Post $post - * @param User $user - */ - public function __construct(Post $post, User $actor = null) - { - $this->post = $post; - $this->actor = $actor; - } + /** + * @var Post + */ + public $post; + + /** + * @var User + */ + public $actor; + + /** + * @param Post $post + * @param User $user + */ + public function __construct(Post $post, User $actor = null) + { + $this->post = $post; + $this->actor = $actor; + } } ``` diff --git a/docs/it/extend/console.md b/docs/it/extend/console.md index 60039377b..eaa35941c 100644 --- a/docs/it/extend/console.md +++ b/docs/it/extend/console.md @@ -10,12 +10,11 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -class YourCommand implements AbstractCommand { +class YourCommand implements AbstractCommand +{ protected function configure() { - $this - ->setName('IL TUO COMANDO QUI') - ->setDescription('LA DESCRIZIONE DLE TUO COMANDO'); + $this->setName('IL TUO COMANDO QUI')->setDescription('LA DESCRIZIONE DLE TUO COMANDO'); } protected function fire() { @@ -34,7 +33,7 @@ use YourNamespace\Console\CustomCommand; return [ // Other extenders - (new Extend\Console())->command(CustomCommand::class) + (new Extend\Console())->command(CustomCommand::class), // Other extenders ]; ``` diff --git a/docs/it/extend/data.md b/docs/it/extend/data.md index faa5d5e86..4630b4642 100644 --- a/docs/it/extend/data.md +++ b/docs/it/extend/data.md @@ -4,7 +4,6 @@ I dati sono la base di qualsiasi forum, quindi dovrai giocarci bene se vuoi che Flarum fa uso di [componenti Database Laravel](https://laravel.com/docs/database). È necessario familiarizzare con questi componenti prima di procedere, poiché si presume che la conoscenza di questi sia assodata. - ## Ciclo di vita delle richieste API Prima di entrare nei dettagli su come estendere l'API di dati di Flarum, vale la pena pensare al ciclo di vita di una tipica richiesta di dati: @@ -36,12 +35,12 @@ In Flarum, i file di migrazione dovrebbero ** restituire un array ** con due fun use Illuminate\Database\Schema\Builder; return [ - 'up' => function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } + 'up' => function (Builder $schema) { + // up migration + }, + 'down' => function (Builder $schema) { + // down migration + }, ]; ``` @@ -49,7 +48,7 @@ Per attività comuni come la creazione di una tabella o l'aggiunta di colonne a ### Ciclo di vita delle migrazioni -Le migrazioni vengono applicate quando l'estensione viene abilitata per la prima volta o quando è abilitata e ci sono alcune migrazioni in sospeso. Le migrazioni eseguite vengono registrate nel database, e se ne vengono trovate alcune nella cartella migrazioni di un estensione, non ancora espletate, vengono eseguite. +Le migrazioni vengono applicate quando l'estensione viene abilitata per la prima volta o quando è abilitata e ci sono alcune migrazioni in sospeso. Le migrazioni eseguite vengono registrate nel database, e se ne vengono trovate alcune nella cartella migrazioni di un estensione, non ancora espletate, vengono eseguite. Le migrazioni possono anche essere applicate manualmente con il comando `php flarum migrate` necessario anche per aggiornare le migrazioni di un'estensione già abilitata. Per annullare le modifiche applicate dalle migrazioni, è necessario fare clic su "Disinstalla" accanto a un'estensione nel pannello di amministrazione, o utilizzare in alternativa il comando `php flarum migrate:reset`. Non può rompersi nulla eseguento il comando `php flarum migrate` anche se è stato appena eseguito - le migrazioni infatti non verranno reiterate. @@ -64,11 +63,11 @@ use Flarum\Database\Migration; use Illuminate\Database\Schema\Blueprint; return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); + $table->increments('id'); }); ``` -Quando si crea la tabella, è possibile utilizzare uno qualsiasi dei generatori di schemi [column methods](https://laravel.com/docs/6.x/migrations#creating-columns) +Quando si crea la tabella, è possibile utilizzare uno qualsiasi dei generatori di schemi [column methods](https://laravel.com/docs/6.x/migrations#creating-columns) per definire le colonne della tabella. ### Rinominare tabelle @@ -85,8 +84,8 @@ Per aggiungere colonne ad una tabella esistente, utilizza l'helper `Migration::a ```php return Migration::addColumns('users', [ - 'email' => ['string', 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] + 'email' => ['string', 'nullable' => true], + 'discussion_count' => ['integer', 'unsigned' => true], ]); ``` @@ -142,7 +141,7 @@ return [ ### Relazioni -Puoi aggiungere anche [relazioni](https://laravel.com/docs/6.x/eloquent-relationships) a modelli esistenti utilizzando i metodi `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`e `relationship` sull'estensore `Model`. Il primo argomento è il nome della relazione; il resto degli argomenti viene passato al metodo equivalente sul modello, quindi è possibile specificare il nome del modello correlato e, facoltativamente, sostituire i nomi di tabella e chiave: +Puoi aggiungere anche [relazioni](https://laravel.com/docs/6.x/eloquent-relationships) a modelli esistenti utilizzando i metodi `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`e `relationship` sull'estensore `Model`. Il primo argomento è il nome della relazione; il resto degli argomenti viene passato al metodo equivalente sul modello, quindi è possibile specificare il nome del modello correlato e, facoltativamente, sostituire i nomi di tabella e chiave: ```php new Extend\Model(User::class) @@ -164,7 +163,6 @@ Questi 4 dovrebbero coprire la maggior parte delle relazioni, ma a volte è nece }) ``` - ## Serializzatori Il passaggio successivo consiste nell'esposizione dei nuovi dati nella JSON: API di Flarum in modo che possano essere utilizzati dal frontend. Dovresti acquisire familiarità con le [specifiche JSON:API](https://jsonapi.org/format/). JSON: API di Flarum è alimentato dalla libreria [tobscure/json-api](https://github.com/tobscure/json-api). @@ -177,14 +175,14 @@ use Flarum\Api\Serializer\UserSerializer; class DiscussionSerializer extends AbstractSerializer { - protected $type = 'discussions'; + protected $type = 'discussions'; - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } + protected function getDefaultAttributes($discussion) + { + return [ + 'title' => $discussion->title, + ]; + } } ``` @@ -232,12 +230,12 @@ Dopo aver definito le risorse nei serializzatori, sarà necessario esporle come Seguendo le convenzioni dell'API JSON, puoi aggiungere cinque itinerari standard per il tuo tipo di risorsa utilizzando l'estensore `Routes`: ```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) +(new Extend\Routes('api')) + ->get('/tags', 'tags.index', ListTagsController::class) + ->get('/tags/{id}', 'tags.show', ShowTagController::class) + ->post('/tags', 'tags.create', CreateTagController::class) + ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) + ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class); ``` Lo spazio dei nomi `Flarum\Api\Controller` contiene un numero di classi astratte che puoi estendere per implementare facilmente le tue risorse JSON-API. @@ -253,12 +251,12 @@ use Tobscure\JsonApi\Document; class ListTagsController extends AbstractListController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + return Tag::all(); + } } ``` @@ -274,14 +272,14 @@ use Tobscure\JsonApi\Document; class ShowTagController extends AbstractShowController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + return Tag::findOrFail($id); + } } ``` @@ -297,22 +295,21 @@ use Tobscure\JsonApi\Document; class CreateTagController extends AbstractCreateController { - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); + + return Tag::create([ + 'name' => Arr::get($attributes, 'name'), + ]); + } } ``` ### Aggiornare una risorsa - Per il controller che aggiorna una risorsa, estendi `Flarum\Api\Controller\AbstractShowController`. Come per il controller di creazione, puoi accedere al corpo del documento JSON:API in entrata tramite `$request->getParsedBody()`. ### Cancellare una risorsa @@ -325,13 +322,13 @@ use Illuminate\Support\Arr; use Psr\Http\Message\ServerRequestInterface as Request; class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } +{ + protected function delete(Request $request) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + Tag::findOrFail($id)->delete(); + } } ``` @@ -342,7 +339,7 @@ Per includere relazioni quando ** elenchi **, ** mostri ** o ** crei ** la tua r ```php // The relationships that are included by default. public $include = ['user']; - + // Other relationships that are available to be included. public $optionalInclude = ['discussions']; ``` @@ -362,7 +359,7 @@ Puoi consentire la personalizzazione del numero di risorse ** elencate ** specif ```php // Il numero di record inclusi per impostazione predefinita. public $limit = 20; - + // Il numero massimo di record che possono essere richiesti. public $maxLimit = 50; ``` @@ -385,7 +382,7 @@ Per aggiungere collegamenti di impaginazione al documento JSON:API, utilizzare i ```php // Il campo di ordinamento predefinito e l'ordine da utilizzare. public $sort = ['name' => 'asc']; - + // I campi disponibili per essere ordinati. public $sortFields = ['firstName', 'lastName']; ``` @@ -397,7 +394,7 @@ $sort = $this->extractSort($request); $query = Tag::query(); foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); + $query->orderBy(snake_case($field), $order); } return $query->get(); @@ -413,19 +410,19 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] + (new Extend\ApiController(ListDiscussionsController::class)) + ->setSerializer(MyDiscussionSerializer::class) + ->addInclude('user') + ->addOptionalInclude('posts') + ->setLimit(20) + ->setMaxLimit(50) + ->setSort(['name' => 'asc']) + ->addSortField('firstName') + ->prepareDataQuery(function ($controller) { + // Add custom logic here to modify the controller + // before data queries are executed. + }), +]; ``` `ApiController` può essere utilizzato anche per regolare i dati prima della serializzazione: @@ -436,11 +433,10 @@ use Flarum\Api\Controller\ListDiscussionsController; use Illuminate\Contracts\Events\Dispatcher; return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] + (new Extend\ApiController(ListDiscussionsController::class))->prepareDataForSerialization(function ($controller, $data, $request, $document) { + $data->load('myCustomRelation'); + }), +]; ``` ## Modelli frontend @@ -452,9 +448,10 @@ Ora che hai esposto i tuoi dati nella JSON:API di Flarum, è finalmente giunto i Il frontend di Flarum contiene dati locali in `store` che fornisce un'interfaccia per interagire con JSON:API. Puoi recuperare le risorse dall'API utilizzando `find`, che restituisce sempre: <!-- import { store } from '@flarum/core/forum'; --> + ```js // GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); +app.store.find('discussions', { sort: 'createdAt' }).then(console.log); // GET /api/discussions/123 app.store.find('discussions', 123).then(console.log); @@ -482,6 +479,7 @@ Puoi saperne di più su "store" nella nostra [Documentazione API](https://api.do Se hai aggiunto un nuovo tipo di risorsa, dovrai definirne un nuovo modello. I modelli devono estendere la classe `Model` e ridefinire gli attributi e le relazioni delle risorse: <!-- import { Model } from '@flarum/core/forum'; --> + ```js import Model from 'flarum/Model'; @@ -505,7 +503,7 @@ app.store.models.tags = Tag; export const extend = [ new Extend.Model('tags', Tag) ]; -``` +``` --> ### Modelli estensibili @@ -525,7 +523,7 @@ Discussion.prototype.slug = Model.attribute('slug'); .attribute('slug') .hasOne('user') .hasMany('posts') -``` +``` --> ### Risparmio di risorse @@ -541,12 +539,9 @@ Puoi anche salvare le relazioni passandole in `relationships`. Per le relazioni ```js user.save({ relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) + groups: [store.getById('groups', 1), store.getById('groups', 2)], + }, +}); ``` ### Creazione di nuove risorse diff --git a/docs/it/extend/distribution.md b/docs/it/extend/distribution.md index a5561fdbf..179758e7d 100644 --- a/docs/it/extend/distribution.md +++ b/docs/it/extend/distribution.md @@ -38,4 +38,4 @@ Molto probabilmente vorrai creare una discussione sulla comunità Flarum sulla c ```bash composer require autore/nome-estensione -``` \ No newline at end of file +``` diff --git a/docs/it/extend/formatting.md b/docs/it/extend/formatting.md index 41d5e867e..2d0990ab7 100644 --- a/docs/it/extend/formatting.md +++ b/docs/it/extend/formatting.md @@ -16,26 +16,26 @@ use s9e\TextFormatter\Parser; use s9e\TextFormatter\Renderer; return [ - (new Extend\Formatter) - // Aggiungi la configurazione del formattatore di testo personalizzato - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modifica il testo grezzo prima che venga analizzato. - // Questa callback dovrebbe restituire il testo modificato. - ->parse(function (Parser $parser, $context, $text) { - // logica personalizzata qui - return $newText; - }) - //Modificare l'XML di cui eseguire il rendering. - // il suo callback dovrebbe restituire il nuovo XML. - // Ad esempio, nell'estensione menzioni, viene utilizzato per - // fornire il nome utente e il nome visualizzato dell'utente menzionato. - // Assicurati che l'ultimo argomento $request sia annullabile (o omesso completamente). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // logica personalizzata qui - return $newXml; - }) + (new Extend\Formatter()) + // Aggiungi la configurazione del formattatore di testo personalizzato + ->configure(function (Configurator $config) { + $config->BBCodes->addFromRepository('B'); + }) + // Modifica il testo grezzo prima che venga analizzato. + // Questa callback dovrebbe restituire il testo modificato. + ->parse(function (Parser $parser, $context, $text) { + // logica personalizzata qui + return $newText; + }) + //Modificare l'XML di cui eseguire il rendering. + // il suo callback dovrebbe restituire il nuovo XML. + // Ad esempio, nell'estensione menzioni, viene utilizzato per + // fornire il nome utente e il nome visualizzato dell'utente menzionato. + // Assicurati che l'ultimo argomento $request sia annullabile (o omesso completamente). + ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { + // logica personalizzata qui + return $newXml; + }), ]; ``` diff --git a/docs/it/extend/forms.md b/docs/it/extend/forms.md index 12b1582bc..1f4d450d7 100644 --- a/docs/it/extend/forms.md +++ b/docs/it/extend/forms.md @@ -21,10 +21,9 @@ import FieldSet from 'flarum/components/FieldSet'; import Button from 'flarum/components/Button'; import Switch from 'flarum/components/Switch'; - class FormComponent extends Component { oninit(vnode) { - this.textInput = ""; + this.textInput = ''; this.booleanInput = false; } @@ -32,14 +31,12 @@ class FormComponent extends Component { return ( <form onsubmit={this.onsubmit.bind(this)}> <FieldSet label={app.translator.trans('fake-extension.form.fieldset_label')}> - <input className="FormControl" value={this.textInput} oninput={e => this.textInput = e.target.value}> - </input> - <Switch state={this.booleanInput} onchange={val => this.booleanInput = val}> - </Switch> + <input className="FormControl" value={this.textInput} oninput={(e) => (this.textInput = e.target.value)}></input> + <Switch state={this.booleanInput} onchange={(val) => (this.booleanInput = val)}></Switch> </FieldSet> <Button type="submit">{app.translator.trans('core.admin.basics.submit_button')}</Button> </form> - ) + ); } onsubmit() { @@ -50,7 +47,6 @@ class FormComponent extends Component { Don't forget to use [translations](translate.md)! - ## Streams, bidi, and withAttr Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/util/Stream`. @@ -60,11 +56,10 @@ Its basic usage is: ```js import Stream from 'flarum/utils/Stream'; - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true +const value = Stream('hello!'); +value() === 'hello!'; // true +value('world!'); +value() === 'world!'; // true ``` Nei form di Flarum, i flussi sono spesso usati insieme all'attributo bidi. diff --git a/docs/it/extend/frontend-pages.md b/docs/it/extend/frontend-pages.md index 85da66773..44da83247 100644 --- a/docs/it/extend/frontend-pages.md +++ b/docs/it/extend/frontend-pages.md @@ -18,10 +18,9 @@ I componenti della pagina funzionano esattamente come qualsiasi altro componente ```js import Page from 'flarum/components/Page'; - export default class CustomPage extends Page { view() { - return <p>Hello!</p> + return <p>Hello!</p>; } } ``` @@ -54,7 +53,7 @@ import DiscussionPage from 'flarum/components/DiscussionPage'; app.current.matches(DiscussionPage); // To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); +app.current.matches(IndexPage, { routeName: 'following' }); ``` ## Route resolver (avanzato) @@ -82,19 +81,22 @@ import CustomPage from './components/CustomPage'; import CustomPageResolver from './resolvers/CustomPageResolver'; // Utilizza un'istanza del resolver di percorsi -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; +app.routes['resolverInstance'] = { + path: '/custom/path/1', + resolver: { + onmatch: function (args) { + if (!app.session.user) return m.route.SKIP; - return CustomPage; - } -}}; + return CustomPage; + }, + }, +}; // Usa una classe di resolver di percorsi personalizzata -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage }; // Usa la classe di default (`flarum/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; +app.routes['resolverClass'] = { path: '/custom/path/2', component: CustomPage }; ``` ### Resolvers personalizzati diff --git a/docs/it/extend/frontend.md b/docs/it/extend/frontend.md index 8f9d3f1f0..af6a3862a 100644 --- a/docs/it/extend/frontend.md +++ b/docs/it/extend/frontend.md @@ -6,8 +6,8 @@ Questa pagina descrive come apportare modifiche all'interfaccia utente di Flarum Flarum ha due applicazioni frontend separate: -* `forum`, la parte pubblica del forum in cui gli utenti creano discussioni e post. -* `admin`, il lato privato del tuo forum dove, come amministratore del tuo forum, configuri la tua installazione di Flarum. +- `forum`, la parte pubblica del forum in cui gli utenti creano discussioni e post. +- `admin`, il lato privato del tuo forum dove, come amministratore del tuo forum, configuri la tua installazione di Flarum. Condividono lo stesso codice di base, quindi una volta che sai come estenderne uno, sai come estenderli entrambi. @@ -19,8 +19,8 @@ Prima di poter scrivere qualsiasi JavaScript, dobbiamo impostare un **transpiler Per fare ci�, devi lavorare in un ambiente adatto. No, non il tipo di ambiente di casa/ufficio - puoi lavorare in bagno per quel che ci importa! Stiamo parlando degli strumenti installati sul tuo sistema. Avrai bisogno: -* Node.js e npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) +- Node.js e npm ([Download](https://nodejs.org/en/download/)) +- Webpack (`npm install -g webpack`) Questo pu� essere complicato perch� il sistema di ognuno � diverso. Dal sistema operativo che stai utilizzando, alle versioni del programma che hai installato, alle autorizzazioni di accesso dell'utente – Ci vengono i brividi solo a pensarci! Se incappi nei guai, ~~ti salutiamo~~ usa [Google](https://google.com) per vedere se qualcuno ha riscontrato il tuo stesso errore e ha trovato una soluzione. In caso contrario, chiedi aiuto nel [Forum di Flarum](https://flarumit.it) o su [Discord chat](https://flarum.org/discord/). @@ -105,13 +105,13 @@ Tieni presente che questo � semplicemente un consiglio: non c'� nulla che ti Il file pi� importante qui � `index.js`: tutto il resto � solo l'estrazione di classi e funzioni nei propri file. Esaminiamo un tipico `index.js`: ```js -import {extend, override} from 'flarum/extend'; +import { extend, override } from 'flarum/extend'; // We provide our extension code in the form of an "initializer". // This is a callback that will run after the core has booted. -app.initializers.add('our-extension', function(app) { +app.initializers.add('our-extension', function (app) { // Your Extension Code Here - console.log("EXTENSION NAME is working!"); + console.log('EXTENSION NAME is working!'); }); ``` @@ -131,17 +131,17 @@ Il tuo file `forum.js` � l'equivalente javascript di `extend.php`.Come la sua Dovresti familiarizzare con la sintassi corretta per [importare moduli Js](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), poich� la maggior parte delle estensioni pi� grandi di poche righe divider� i loro js in pi� file. -Praticamente ogni estensione Flarum dovr� importare * qualcosa * da Flarum Core. +Praticamente ogni estensione Flarum dovr� importare _ qualcosa _ da Flarum Core. Come la maggior parte delle estensioni, il codice sorgente JS di core � suddiviso in cartelle `admin`, `common`, e `forum`. Tuttavia, viene esportato tutto in `flarum`. Per elaborare: -* Durante lo sviluppo di `admin`, il core esporta le directory `admin` e `common` come `flarum`. Per esempio, `admin/components/AdminLinkButton` � disponibile come `flarum/components/AdminLinkButton`. -* Durante lo sviluppo di `forum`, il core esporta le directory `common` e `forum` come `flarum`. Per esempio `forum/states/PostStreamState` � disponibile come `flarum/states/PostStreamState`. -* In entrambi i casi, i file `common` sono disponibili in `flarum`: `common/Component` viene esportato come `flarum/Component`. +- Durante lo sviluppo di `admin`, il core esporta le directory `admin` e `common` come `flarum`. Per esempio, `admin/components/AdminLinkButton` � disponibile come `flarum/components/AdminLinkButton`. +- Durante lo sviluppo di `forum`, il core esporta le directory `common` e `forum` come `flarum`. Per esempio `forum/states/PostStreamState` � disponibile come `flarum/states/PostStreamState`. +- In entrambi i casi, i file `common` sono disponibili in `flarum`: `common/Component` viene esportato come `flarum/Component`. In alcuni casi, un'estensione potrebbe voler estendere il codice da un'altra estensione flarum. Questo � possibile solo per le estensioni che esportano esplicitamente il loro contenuto. -* `flarum/tags` e `flarum/flags` sono attualmente le uniche estensioni in bundle che consentono di estendere il proprio JS. Puoi importare i loro contenuti da `flarum/{EXT_NAME}/PATH` (es. `flarum/tags/components/TagHero`). -* TIl processo per estendere ciascuna estensione della comunit� � diverso; dovresti consultare la documentazione per ogni singola estensione. +- `flarum/tags` e `flarum/flags` sono attualmente le uniche estensioni in bundle che consentono di estendere il proprio JS. Puoi importare i loro contenuti da `flarum/{EXT_NAME}/PATH` (es. `flarum/tags/components/TagHero`). +- TIl processo per estendere ciascuna estensione della comunit� � diverso; dovresti consultare la documentazione per ogni singola estensione. ### Transpilazione @@ -167,10 +167,7 @@ Affinch� il JavaScript della tua estensione possa essere caricato nel frontend use Flarum\Extend; -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') -]; +return [(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')]; ``` Flarum render� tutto ci� che esporti con `export` da `forum.js` disponibile nell'oggetto `flarum.extensions['acme-hello-world']`. TInoltre, puoi scegliere di esporre la tua API pubblica per consentire ad altre estensioni di interagire. @@ -186,9 +183,7 @@ Flarum render� tutto ci� che esporti con `export` da `forum.js` disponibile Puoi anche aggiungere CSS e asset [LESS](http://lesscss.org/features/) al frontend utilizzanto l'extender `Frontend` e metodo `css`: ```php - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') +(new Extend\Frontend('forum'))->js(__DIR__ . '/js/dist/forum.js')->css(__DIR__ . '/less/forum.less'); ``` ::: tip @@ -205,11 +200,11 @@ Il punto cruciale � che Flarum genera elementi DOM virtuali che sono una rappr Poich� l'interfaccia � costruita con JavaScript, � davvero facile collegarsi e apportare modifiche. Tutto quello che devi fare � trovare il giusto extender per la parte dell'interfaccia che desideri modificare, quindi aggiungere il tuo DOM virtuale nel mix. -La maggior parte delle parti modificabili dell'interfaccia sono in realt� solo * elenchi di elementi *. Per esempio: +La maggior parte delle parti modificabili dell'interfaccia sono in realt� solo _ elenchi di elementi _. Per esempio: -* I controlli che appaiono in ogni post (Rispondi, Mi piace, Modifica, Elimina) -* Gli elementi di navigazione della barra laterale dell'indice (Tutte le discussioni, Seguito, Tag) -* Gli elementi nell'intestazione (Cerca, Notifiche, Menu utente) +- I controlli che appaiono in ogni post (Rispondi, Mi piace, Modifica, Elimina) +- Gli elementi di navigazione della barra laterale dell'indice (Tutte le discussioni, Seguito, Tag) +- Gli elementi nell'intestazione (Cerca, Notifiche, Menu utente) A ciascun elemento in questi elenchi viene assegnato un ** nome ** in modo da poter aggiungere, rimuovere e riorganizzare facilmente gli elementi. Trova semplicemente il componente appropriato per la parte dell'interfaccia che desideri modificare, e usa uno metodi per modificare il contenuto dell'elenco degli elementi. Ad esempio, per aggiungere un collegamento a Google nell'intestazione: @@ -217,7 +212,7 @@ A ciascun elemento in questi elenchi viene assegnato un ** nome ** in modo da po import { extend } from 'flarum/extend'; import HeaderPrimary from 'flarum/components/HeaderPrimary'; -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add('google', <a href="https://google.com">Google</a>); }); ``` @@ -245,15 +240,15 @@ DiscussionPage Dovresti familiarizzare con [Componenti API di Mithril](https://mithril.js.org/components.html) e [sistema redraw](https://mithril.js.org/autoredraw.html). Flarum avvolge i componenti in classi `flarum/Component`, che estende a sua volta le [classi dei componenti](https://mithril.js.org/components.html#classes). Offre i seguenti vantaggi: -* Gli attributi passati ai componenti sono disponibili in tutta la classe tramite `this.attrs`. -* I metodi statici `initAttrs` mutano `this.attrs` prima di impostarli, e ti consente di impostare i valori predefiniti o di modificarli in altro modo prima di utilizzarli nella tua classe.Tieni presente che ci� non influisce sull'iniziale `vnode.attrs`. -* Il metodo `$` restituisce un oggetto jQuery per l'elemento DOM radice del componente. Facoltativamente, puoi passare un selettore per ottenere dei sotto DOM. -* l metodo statico `component` pu� essere utilizzato come alternativa a JSX ed a `m`. I seguenti sono identici: - * `m(CustomComponentClass, attrs, children)` - * `CustomComponentClass.component(attrs, children)` - * `<CustomComponentClass {...attrs}>{children}</CustomComponentClass>` +- Gli attributi passati ai componenti sono disponibili in tutta la classe tramite `this.attrs`. +- I metodi statici `initAttrs` mutano `this.attrs` prima di impostarli, e ti consente di impostare i valori predefiniti o di modificarli in altro modo prima di utilizzarli nella tua classe.Tieni presente che ci� non influisce sull'iniziale `vnode.attrs`. +- Il metodo `$` restituisce un oggetto jQuery per l'elemento DOM radice del componente. Facoltativamente, puoi passare un selettore per ottenere dei sotto DOM. +- l metodo statico `component` pu� essere utilizzato come alternativa a JSX ed a `m`. I seguenti sono identici: + - `m(CustomComponentClass, attrs, children)` + - `CustomComponentClass.component(attrs, children)` + - `<CustomComponentClass {...attrs}>{children}</CustomComponentClass>` -Tuttavia, le classi di componenti che estendono `Component` devono richiamare `super` quando utilizzano `oninit`, `oncreate`, e metodi `onbeforeupdate` . +Tuttavia, le classi di componenti che estendono `Component` devono richiamare `super` quando utilizzano `oninit`, `oncreate`, e metodi `onbeforeupdate` . Per utilizzare i componenti Flarum, � sufficiente estendere `flarum/Component` nella tua classe di componenti personalizzati. @@ -274,9 +269,7 @@ class Counter extends Component { return ( <div> Count: {this.count} - <button onclick={e => this.count++}> - {this.attrs.buttonLabel} - </button> + <button onclick={(e) => this.count++}>{this.attrs.buttonLabel}</button> </div> ); } @@ -309,14 +302,14 @@ Praticamente tutte le estensioni di frontend usano [il monkey patching](https:// ```jsx // Questo aggiunge un attributo a "app" globale. -app.googleUrl = "https://google.com"; +app.googleUrl = 'https://google.com'; // Questo sostituisce l'output della pagina di discussione con "Hello World" import DiscussionPage from 'flarum/components/DiscussionPage'; -DiscussionPage.prototype.view = function() { +DiscussionPage.prototype.view = function () { return <p>Hello World</p>; -} +}; ``` trasformer� le pagine di discussione di Flarum in "Hello World". Quanto � creativo! @@ -329,7 +322,6 @@ Nella maggior parte dei casi, in realt� non vogliamo sostituire completamente 1. Per `extend`, il callback riceve l'output del metodo originale, cos� come tutti gli argomenti passati al metodo originale. 2. Per `override`, il callback riceve un chiamabile (che pu� essere utilizzato per chiamare il metodo originale), cos� come tutti gli argomenti passati al metodo originale. - Tieni presente che se stai cercando di modificare l'output di un metodo con `override`, � necessario restituire il nuovo output. Se stai modificando l'output con `extend`, dovresti semplicemente modificare l'output originale (che viene ricevuto come primo argomento). Tieni a mente che `extend` cpu� solo mutare l'output se l'output � modificabile (ad esempio un oggetto o un array e non un numero / stringa). @@ -345,7 +337,7 @@ import CustomComponentClass from './components/CustomComponentClass'; // Qui, aggiungiamo un articolo alla ItemList restituita. Stiamo utilizzando un componente personalizzato // come discusso sopra. Abbiamo anche specificato una priorit� come terzo argomento, // che verr� utilizzato per ordinare questi articoli. Nota che non � necessario restituire nulla. -extend(HeaderPrimary.prototype, 'items', function(items) { +extend(HeaderPrimary.prototype, 'items', function (items) { items.add( 'google', <CustomComponentClass> @@ -358,7 +350,7 @@ extend(HeaderPrimary.prototype, 'items', function(items) { // Here, we conditionally use the original output of a method, // or create our own ItemList, and then add an item to it. // Note that we MUST return our custom output. -override(HeaderPrimary.prototype, 'items', function(original) { +override(HeaderPrimary.prototype, 'items', function (original) { let items; if (someArbitraryCondition) { @@ -376,8 +368,8 @@ override(HeaderPrimary.prototype, 'items', function(original) { Poich� tutti i componenti e le utilit� di Flarum sono rappresentati da classi, `extend`, `override`, e il vecchio JS, il che significa che possiamo agganciarci, o sostituire, QUALSIASI metodo in qualsiasi parte di Flarum. Alcuni potenziali usi "avanzati" includono: -* Estendere o sovrascrivere `view` per cambiare (o ridefinire completamente) la struttura html dei componenti Flarum. Questo apre Flarum a temi illimitati. -* Collegati ai metodi dei componenti Mithril per aggiungere listener di eventi JS o ridefinire in altro modo la logica aziendale. +- Estendere o sovrascrivere `view` per cambiare (o ridefinire completamente) la struttura html dei componenti Flarum. Questo apre Flarum a temi illimitati. +- Collegati ai metodi dei componenti Mithril per aggiungere listener di eventi JS o ridefinire in altro modo la logica aziendale. ### Utilit� di Flarum diff --git a/docs/it/extend/i18n.md b/docs/it/extend/i18n.md index 0cbbeab00..f98dfa02d 100644 --- a/docs/it/extend/i18n.md +++ b/docs/it/extend/i18n.md @@ -48,15 +48,16 @@ Puoi anche utilizzare le chiavi per ** dare spazi ai nomi ** per le tue traduzio Ogni chiave di spaziatura dei nomi dovrebbe anche essere seguita da due punti. Le chiavi devono essere nidificate secondo il formato struttura YAML, aggiungendo due spazi di rientro per ogni livello nella gerarchia. Metti tutto insieme ed il file locale [tutorial per iniziare](start.md) dovrebbe assomigliare a questo: ```yaml -acme-hello-world: # Namespacing for the extension; unindented. - alert: # Namespacing for alerts; indented 2 spaces. - hello_text: "Hello, world!" # Identifier/translation; indented 4 spaces. +acme-hello-world: # Namespacing for the extension; unindented. + alert: # Namespacing for alerts; indented 2 spaces. + hello_text: 'Hello, world!' # Identifier/translation; indented 4 spaces. ``` Una volta che hai queste informazioni a posto, puoi formare la ** chiave di traduzione completa ** che utilizzerai per accedere a una traduzione elencandone le chiavi in ordine dallo spazio dei nomi dell'estensione a un identificatore, con i punti come delimitatori. Ad esempio, la chiave di traduzione completa per "Hello, world!" sarebbe: ```javascript -'acme-hello-world.alert.hello_text' +'acme-hello-world.alert.hello_text'; + ``` Questo è davvero tutto ciò che devi sapere sui meccanismi di creazione delle chiavi. Tieni presente, tuttavia, che esiste un formato standard che gli sviluppatori devono seguire quando creano le risorse linguistiche per Flarum. Le regole per il [namespacing delle traduzioni](#namespacing-translations) e [assegnare un nome ad chiavi ID](#naming-id-keys) possono essere trovati nell'appencice A. @@ -75,7 +76,7 @@ Avrai notato che solo una delle due traduzioni di esempio nella sezione preceden Poiché Flarum utilizza parentesi graffe e parentesi angolari per indicare i le [variabili](#including-variables) ed i [tag HTML](#html-tags), rispettivamente, è ovvio che qualsiasi traduzione che includa tali variabili dovrà essere racchiusa tra virgolette doppie. -Inoltre, dovresti usare ** virgolette singole ** per racchiudere qualsiasi traduzione che includa una o più virgolette doppie (`"`) o backslash (`\`). Questa regola ha la precedenza! Quindi, se una traduzione dovesse includere sia le virgolette doppie che uno o più caratteri dalla lista sopra — come [questo esempio](#including-variables), in cui una variabile è compensata da virgolette — andrebbe racchiuso tra * virgolette singole *. +Inoltre, dovresti usare ** virgolette singole ** per racchiudere qualsiasi traduzione che includa una o più virgolette doppie (`"`) o backslash (`\`). Questa regola ha la precedenza! Quindi, se una traduzione dovesse includere sia le virgolette doppie che uno o più caratteri dalla lista sopra — come [questo esempio](#including-variables), in cui una variabile è compensata da virgolette — andrebbe racchiuso tra _ virgolette singole _. ::: @@ -91,6 +92,7 @@ literal_block_text: | Le virgolette non sono necessarie, anche quando il blocco contiene caratteri speciali. ``` + Il blocco letterale termina con l'ultima riga da rientrare di almeno due spazi in più rispetto alla chiave ID. Le virgolette non sono necessarie perché il blocco è effettivamente delimitato da questi due spazi extra di rientro. Le principali risorse linguistiche di Flarum utilizzano blocchi letterali principalmente per il contenuto del corpo dell'email. @@ -102,13 +104,13 @@ Non è raro utilizzare la stessa porzione di testo in più di una posizione o co - Come un ** pulsante ** su cui gli utenti possono fare clic quando desiderano modificare alcune cose - Come il ** titolo ** di una finestra di dialogo visualizzata quando gli utenti fanno clic su quel pulsante -Il tuo istinto potrebbe essere quello di aggiungere un'unica traduzione — chiuamiamola "`edit_stuff`" — e usiamo quella chiave ID due volte nel tuo codice. Questo approccio è efficiente, ma manca di flessibilità: in alcune lingue, potrebbe non essere possibile utilizzare la stessa frase sia per il pulsante che per il titolo della finestra di dialogo! Un modo migliore sarebbe definire * due * chiavi da utilizzare nel codice, quindi impostarle entrambe per fare riferimento alla stessa traduzione, in questo modo: +Il tuo istinto potrebbe essere quello di aggiungere un'unica traduzione — chiuamiamola "`edit_stuff`" — e usiamo quella chiave ID due volte nel tuo codice. Questo approccio è efficiente, ma manca di flessibilità: in alcune lingue, potrebbe non essere possibile utilizzare la stessa frase sia per il pulsante che per il titolo della finestra di dialogo! Un modo migliore sarebbe definire _ due _ chiavi da utilizzare nel codice, quindi impostarle entrambe per fare riferimento alla stessa traduzione, in questo modo: ```yaml -edit_stuff_button: => edit_stuff # Utilizzato nel codice che crea il pulsante. -edit_stuff_title: => edit_stuff # Utilizzato nel codice che crea la finestra di dialogo. +edit_stuff_button: => edit_stuff # Utilizzato nel codice che crea il pulsante. +edit_stuff_title: => edit_stuff # Utilizzato nel codice che crea la finestra di dialogo. -edit_stuff: Edit Stuff # Non utilizzato nel codice. +edit_stuff: Edit Stuff # Non utilizzato nel codice. ``` È possibile impostare una chiave in modo che faccia riferimento ad un'altra sostituendo la sua traduzione con un segno di uguale (`=`), un segno di maggiore (`>`), e uno spazio, seguito dalla chiave di traduzione completa a cui fare riferimento. Quando l'estensione è installata, il compilatore di Flarum risolverà questi riferimenti per creare un set completo di traduzioni che può usare. @@ -120,7 +122,7 @@ C'è altro da dire sulla referenziazione — per prima cosa, abbiamo complet Dopo aver aggiunto una traduzione al file delle impostazioni locali, con spazi dei nomi e chiavi di identificazione appropriati, è possibile utilizzare l'estensione `app.translator.trans()` per fare riferimento a tale traduzione nel codice. Per esempio il file `js/forum/src/index.js` [Tutorial per iniziare](start.md) potrebbe finire per assomigliare a questo: ```javascript -app.initializers.add('acme-hello-world', function() { +app.initializers.add('acme-hello-world', function () { alert(app.translator.trans('acme-hello-world.alert.hello_text')); }); ``` @@ -132,11 +134,13 @@ Questo mostra il metodo di traduzione di base, senza campanelli o fischietti all Puoi includere variabili nelle traduzioni. Ad esempio, diamo un'occhiata al codice che crea il primo elemento nel [menu a discesa dei risultati di ricerca di Flarum](https://github.com/flarum/core/blob/master/js/forum/src/components/DiscussionsSearchSource.js). Questo pulsante cita la query di ricerca inserita dall'utente e altre informazioni che vengono passate al traduttore insieme alla chiave di traduzione, come parametro aggiuntivo: ```jsx harmony -{LinkButton.component({ - icon: 'search', - children: app.translator.trans('all_discussions_button', {query}), - href: app.route('index', {q: query}) -})} +{ + LinkButton.component({ + icon: 'search', + children: app.translator.trans('all_discussions_button', { query }), + href: app.route('index', { q: query }), + }); +} ``` Una variabile corrispondente nella traduzione consente al traduttore di sapere dove inserire la variabile: @@ -156,7 +160,7 @@ Si inizia aggiungendo una chiave ai parametri di ogni elemento che si desidera v ```jsx harmony <div className="helpText"> {app.translator.trans('icon_text', { - a: <a href="https://fortawesome.github.io/Font-Awesome/icons/" tabindex="-1"/> + a: <a href="https://fortawesome.github.io/Font-Awesome/icons/" tabindex="-1" />, })} </div> ``` @@ -165,7 +169,7 @@ Nota che ogni parametro è definito utilizzando un singolo tag HTML, con una bar Puoi vedere che non tutti i tag vengono passati come argomenti, solo quelli che hanno attributi. ```yaml -icon_text: "Enter the name of any <a>FontAwesome</a> icon class, <em>without</em> the <code>fa-</code> prefix." +icon_text: 'Enter the name of any <a>FontAwesome</a> icon class, <em>without</em> the <code>fa-</code> prefix.' ``` Ovviamente puoi dare a un parametro il nome che preferisci; puoi utilizzare `<fred>` e `</fred>` per racchiudere il testo del tuo link se ti può far piacere! Tuttavia, ti consigliamo di rimanere il più vicino possibile ai tag HTML effettivi rappresentati, in modo che i tuoi localizzatori saranno in grado di capire cosa sta succedendo. @@ -178,11 +182,7 @@ A volte, potrebbe essere necessario fornire versioni alternative di una traduzio ```js const remaining = this.minPrimary - primaryCount; -return app.translator.transChoice( - 'choose_primary_placeholder', - remaining, - { count: remaining } -); +return app.translator.transChoice('choose_primary_placeholder', remaining, { count: remaining }); ``` Questo esempio è tratto da [Scegli tag modali](https://github.com/flarum/tags/blob/master/js/forum/src/components/TagDiscussionModal.js) dell'omonima estensione, dove indica all'utente quanti altri tag primari possono essere selezionati. Nota che la variabile `remaining` viene passato al traduttore ** due volte **. In primo luogo, sembra lo stesso, per condizionare la pluralizzazione della parola "tag". Quindi appare di nuovo come valore del parametro `count`, che il traduttore può utilizzare per inserire quel valore nella traduzione. @@ -190,10 +190,10 @@ Questo esempio è tratto da [Scegli tag modali](https://github.com/flarum/tags/b Quando il metodo `app.translator.transChoice()` viene richiamato, il traduttore esegue la scansione della traduzione per una variante che corrisponde al tipo di pluralizzazione richiesta dal valore della variabile. Queste varianti devono essere elencate in serie, prima in forma singolare, poi in forme plurali in ordine di grandezza crescente e separati utilizzando la linea verticale ("|"). Ecco la traduzione in inglese del codice sopra: ```yaml -choose_primary_placeholder: "Choose a primary tag|Choose {count} primary tags" +choose_primary_placeholder: 'Choose a primary tag|Choose {count} primary tags' ``` -Ovviamente l'inglese ha solo due varianti: singolare o plurale. Dovrai fornire varianti aggiuntive quando crei traduzioni per una lingua che ha più di una forma plurale. Se hai bisogno di informazioni dettagliate sul numero di varianti richieste per una lingua o l'ordine in cui dovrebbero essere elencati, fai riferimento alle [regole di pluralizzazione](https://github.com/symfony/symfony/blob/3.3/src/Symfony/Component/Translation/PluralizationRules.php) +Ovviamente l'inglese ha solo due varianti: singolare o plurale. Dovrai fornire varianti aggiuntive quando crei traduzioni per una lingua che ha più di una forma plurale. Se hai bisogno di informazioni dettagliate sul numero di varianti richieste per una lingua o l'ordine in cui dovrebbero essere elencati, fai riferimento alle [regole di pluralizzazione](https://github.com/symfony/symfony/blob/3.3/src/Symfony/Component/Translation/PluralizationRules.php) che Flarum usa per mappare la variabile alle forme plurali. ### Avere a che fare con i generi @@ -230,44 +230,45 @@ Gli sviluppatori che desiderano contribuire allo sviluppo di Flarum devono segui ### Namespacing delle Traduzioni -Tutte le traduzioni devono essere organizzate in categorie, utilizzando chiavi di spaziatura dei nomi disposte in un massimo di ** tre ** livelli. Ogni livello fornisce ai localizzatori un bit importante di informazioni su * dove viene utilizzata la traduzione: * +Tutte le traduzioni devono essere organizzate in categorie, utilizzando chiavi di spaziatura dei nomi disposte in un massimo di ** tre ** livelli. Ogni livello fornisce ai localizzatori un bit importante di informazioni su _ dove viene utilizzata la traduzione: _ -#### ➡ La chiave di primo livello indica * quale componente utilizza la traduzione *. +#### ➡ La chiave di primo livello indica _ quale componente utilizza la traduzione _. La spaziatura dei nomi per le chiavi di traduzione utilizzate nei componenti Flarum ufficiali, comprese le estensioni in bundle, deve corrispondere al nome del file delle impostazioni locali del language pack per il componente in questione. Gli spazi dei nomi per i componenti non di estensione di Flarum sono fissati come mostrato di seguito: ```yaml -core: # Traduzioni usate dal core di Flarum -validation: # Traduzioni usate dal validatore di Laravel +core: # Traduzioni usate dal core di Flarum +validation: # Traduzioni usate dal validatore di Laravel ``` Le chiavi di traduzione utilizzate in un'estensione o incluse in qualsiasi estensione di terze parti, devono avere una spaziatura dei nomi che utilizza il nome dell'estensione in `vendor-package` dove i prefissi `flarum-` e `flarum-ext-` vengono rimossi da `package` (es, `flarum-tags` per l'estensione Tag e `foo-bar` per l'estensione `foo/flarum-ext-bar`). Dovrebbe esserci un solo ** un ** prefisso di primo livello in qualsiasi file locale; e dovrebbe trovarsi nella prima riga. -#### ➡ La chiave di secondo livello indica * quale interfaccia utilizza la traduzione *. +#### ➡ La chiave di secondo livello indica _ quale interfaccia utilizza la traduzione _. Poiché Flarum non ha tutte le interfacce, abbiamo creato un breve elenco di chiavi di secondo livello tra cui scegliere. Abbiamo incluso quelli usati più di frequente nel modello di file locale creato con lo scheletro dell'estensione. Di seguito trovi l'elenco completo, con le spiegazioni: ```yaml -admin: # Traduzioni utilizzate dall'interfaccia di amministrazione. -forum: # Traduzioni utilizzate dall'interfaccia utente del forum. -lib: # Traduzioni utilizzate da uno dei precedenti. -views: # Traduzioni utilizzate al di fuori del normale client JS. -api: # Traduzioni utilizzate nei messaggi emessi dall'API. -email: # Traduzioni utilizzate nelle email inviate da Flarum. +admin: # Traduzioni utilizzate dall'interfaccia di amministrazione. +forum: # Traduzioni utilizzate dall'interfaccia utente del forum. +lib: # Traduzioni utilizzate da uno dei precedenti. +views: # Traduzioni utilizzate al di fuori del normale client JS. +api: # Traduzioni utilizzate nei messaggi emessi dall'API. +email: # Traduzioni utilizzate nelle email inviate da Flarum. ``` -Le prime quattro chiavi corrispondono all'incirca alle directory contenenti il codice in cui verranno utilizzate le traduzioni. + +Le prime quattro chiavi corrispondono all'incirca alle directory contenenti il codice in cui verranno utilizzate le traduzioni. (La maggior parte delle tue chiavi andrà probabilmente in `admin` o `forum`.) Le restanti due chiavi sono leggermente diverse: `api` è per le traduzioni utilizzate nei messaggi emessi dall'API, e `email` contiene le risorse per tutte le email inviate dal forum. ```yaml -ref: # Traduzioni referenziate da più di una chiave. -group: # Traduzioni utilizzate come gruppi predefiniti. +ref: # Traduzioni referenziate da più di una chiave. +group: # Traduzioni utilizzate come gruppi predefiniti. ``` Queste due chiavi non corrispondono alle interfacce; sono per traduzioni che richiedono una gestione speciale. Spiegheremo come utilizzare `ref` quando parliamo di [riutilizzare le traduzioni](#reusing-translations). Invece `group` contiene i nomi dei gruppi predefiniti, che vengono tradotti dal server anziché dal front-end. -#### ➡ La chiave di terzo livello indica * quale parte dell'interfaccia utente utilizza la traduzione *. +#### ➡ La chiave di terzo livello indica _ quale parte dell'interfaccia utente utilizza la traduzione _. Le chiavi in questo livello non sono definite così rigidamente. Il loro scopo principale è quello di suddividere l'interfaccia utente in parti gestibili, in modo che i localizzatori possano trovare le traduzioni e vedere da soli come vengono utilizzate dal software. (Le chiavi di terzo livello non vengono utilizzate in `ref` e `group`) @@ -281,42 +282,42 @@ Come regola generale, le chiavi di terzo livello dovrebbero essere brevi, non pi Come le chiavi di terzo livello, le chiavi identificative devono essere espresse in `snake_case`. Le chiavi ID devono essere disposte in ordine alfabetico all'interno di ogni nome, in modo che siano facili da trovare per gli sviluppatori. (C'è un'eccezione a questa regola! Le chiavi ID in `email` dovrebbero essere elencati così come appaiono nel tuo client di posta: prima `subject`, poi `body`.) -La tipica chiave ID è composta da due parti; una ** radice ** e un ** suffisso ** ciascuno dei quali può essere omesso in determinate circostanze. Proprio come le chiavi di spaziatura dei nomi indicano ai localizzatori * dove viene utilizzata la traduzione *, ogni parte della chiave ID fornisce un ulteriore bit di informazioni sulla traduzione: +La tipica chiave ID è composta da due parti; una ** radice ** e un ** suffisso ** ciascuno dei quali può essere omesso in determinate circostanze. Proprio come le chiavi di spaziatura dei nomi indicano ai localizzatori _ dove viene utilizzata la traduzione _, ogni parte della chiave ID fornisce un ulteriore bit di informazioni sulla traduzione: -#### ➡ Il suffisso indica * come viene utilizzata la traduzione *. +#### ➡ Il suffisso indica _ come viene utilizzata la traduzione _. Inizieremo con il suffisso perché è la parte più importante del nome della chiave. Indica ai localizzatori quale tipo di oggetto dovrebbero cercare quando cercano di trovare la traduzione nell'interfaccia. Ad esempio, i suffissi nell'elenco seguente vengono utilizzati per oggetti GUI più o meno correlati alle operazioni dell'utente: ```yaml -_button: # Utilizzato per i pulsanti (comprese le voci del menu a discesa). -_link: # Utilizzato per i collegamenti che non vengono visualizzati graficamente come pulsanti. -_heading: # Utilizzato per le intestazioni in tabelle ed elenchi. -_label: # Utilizzato per i nomi dei campi dati, le impostazioni delle caselle di controllo, ecc. -_placeholder: # Utilizzato per il testo predefinito visualizzato nei campi. +_button: # Utilizzato per i pulsanti (comprese le voci del menu a discesa). +_link: # Utilizzato per i collegamenti che non vengono visualizzati graficamente come pulsanti. +_heading: # Utilizzato per le intestazioni in tabelle ed elenchi. +_label: # Utilizzato per i nomi dei campi dati, le impostazioni delle caselle di controllo, ecc. +_placeholder: # Utilizzato per il testo predefinito visualizzato nei campi. ``` Questi suffissi vengono utilizzati per elementi di testo informativi o descrittivi: ```yaml -_confirmation: # Utilizzato per i messaggi visualizzati per confermare un'operazione. -_message: # Utilizzato per i messaggi che mostrano il risultato di un'operazione. -_text: # Utilizzato per qualsiasi testo che non sia un messaggio, un titolo o una descrizione comando. -_title: # Utilizzato per il testo visualizzato come titolo di una pagina o modale. -_tooltip: # Utilizzato per il testo visualizzato quando l'utente passa con il mouse su qualcosa. +_confirmation: # Utilizzato per i messaggi visualizzati per confermare un'operazione. +_message: # Utilizzato per i messaggi che mostrano il risultato di un'operazione. +_text: # Utilizzato per qualsiasi testo che non sia un messaggio, un titolo o una descrizione comando. +_title: # Utilizzato per il testo visualizzato come titolo di una pagina o modale. +_tooltip: # Utilizzato per il testo visualizzato quando l'utente passa con il mouse su qualcosa. ``` E ci sono due suffissi che vengono usati solo in `email`: ```yaml -_body: # Utilizzato per il contenuto del messaggio di posta elettronica. -_subject: # Utilizzato per la riga dell'oggetto del messaggio di posta elettronica. +_body: # Utilizzato per il contenuto del messaggio di posta elettronica. +_subject: # Utilizzato per la riga dell'oggetto del messaggio di posta elettronica. ``` Quanto sopra è un elenco completo dei suffissi disponibili per l'uso nei file delle impostazioni locali. Dovresti fare attenzione a usarli in modo coerente, poiché ciò renderà la vita più facile ai localizzatori. Se ritieni che manchi qualcosa dall'elenco, segnala un problema agli sviluppatori; prenderemo in considerazione l'aggiunta di un nuovo suffisso se la situazione lo richiede. -I suffissi devono essere ** omessi ** nelle chiavi ID per [riutilizzare le traduzioni](#reusing-translations) in `ref:`. Questo perché non puoi essere sicuro che queste traduzioni verranno sempre utilizzate nello stesso contesto. Aggiungere un nuovo contesto significherebbe cambiare il nome della chiave * ovunque sia referenziato * quindi è meglio mantenere queste traduzioni generiche. +I suffissi devono essere ** omessi ** nelle chiavi ID per [riutilizzare le traduzioni](#reusing-translations) in `ref:`. Questo perché non puoi essere sicuro che queste traduzioni verranno sempre utilizzate nello stesso contesto. Aggiungere un nuovo contesto significherebbe cambiare il nome della chiave _ ovunque sia referenziato _ quindi è meglio mantenere queste traduzioni generiche. -#### ➡ La radice indica * cosa dice la traduzione *. +#### ➡ La radice indica _ cosa dice la traduzione _. Se la traduzione è una frase molto breve, non più lunga di poche parole, potresti volerla usare alla lettera (in `snake_case`, naturalmente). Se è molto lungo, invece, dovresti provare a ridurla nel minor numero di parole possibile. @@ -332,7 +333,6 @@ Gli esclusivi [riferimenti chiave](#key-references) di Flarum svolgono lo stesso ```yaml core: - forum: header: log_in_link: => core.ref.log_in @@ -353,19 +353,18 @@ La traduzione riutilizzata è identificata da una chiave che omette il suffisso, ```yaml core: - forum: header: log_in_link: => Log In log_in: - submit_button: => core.forum.header.log_in_link # Non fare mai riferimento alle chiavi - title: => core.forum.header.log_in_link # che non sono in "ref"! + submit_button: => core.forum.header.log_in_link # Non fare mai riferimento alle chiavi + title: => core.forum.header.log_in_link # che non sono in "ref"! ``` Sarebbe molto facile cambiare la traduzione per il collegamento dell'intestazione senza rendersi conto che stai cambiando anche le cose nel modale di accesso, per non parlare delle estensioni che potrebbero anche fare riferimento a quella chiave! Questo genere di cose sarà meno probabile che si verifichi se mantieni le traduzioni riutilizzate in `ref`. -Per questo motivo, qualsiasi riferimento chiave nelle [risorse principali](https://github.com/flarum/lang-english/blob/master/locale/core.yml) +Per questo motivo, qualsiasi riferimento chiave nelle [risorse principali](https://github.com/flarum/lang-english/blob/master/locale/core.yml) ** deve ** puntare alle chiavi in `core.ref`. I riferimenti chiave nelle risorse per le estensioni in bundle possono puntare a una delle due posizioni: - Le traduzioni specifiche dell'estensione dovrebbero andare in `ref` dei file locali dell'estensione. @@ -380,7 +379,7 @@ Un'ultima avvertenza: le chiavi di traduzione in `ref` non dovrebbero ** mai ** ### Aggiunta di commenti -I commenti (e le righe vuote) dovrebbero essere aggiunti ai file delle impostazioni locali in modo che i localizzatori trovino più facile la navigazione all'interno del codice. +I commenti (e le righe vuote) dovrebbero essere aggiunti ai file delle impostazioni locali in modo che i localizzatori trovino più facile la navigazione all'interno del codice. Abbiamo incluso alcuni ** blocchi dei commenti ** nel modello di file locale incluso con lo scheletro dell'estensione. Sono lì per ricordare agli sviluppatori alcuni concetti di base: le chiavi di traduzione non dovrebbero essere usate in più di un posto; le chiavi per le traduzioni riutilizzate non devono mai essere inserite direttamente nel codice; e così via. @@ -402,7 +401,7 @@ Questo probabilmente è ovvio. Dopotutto, se hai intenzione di prenderti la brig Anche piccoli frammenti di testo possono causare problemi ai localizzatori.Una virgola qui, due punti là, pforse un paio di parentesi inserite per rendere la pagina più leggibile: cose del genere possono causare problemi ai localizzatori. Dopo tutto, non tutte le lingue usano gli stessi glifi per queste cose! Anche uno spazio codificato può essere un problema per qualcuno che cerca di tradurre l'interfaccia in una lingua che non utilizza spazi per separare le parole. -In generale, qualsiasi testo visualizzato che non è fornito da una variabile o il risultato di un calcolo * deve * essere incluso nei file delle impostazioni locali. È facile a dirsi, ma in realtà per farlo ci vuole un po' di perseveranza. +In generale, qualsiasi testo visualizzato che non è fornito da una variabile o il risultato di un calcolo _ deve _ essere incluso nei file delle impostazioni locali. È facile a dirsi, ma in realtà per farlo ci vuole un po' di perseveranza. ### Evita sintassi codificata @@ -415,7 +414,7 @@ Per un esempio, diamo un'occhiata alla riga di testo stampata vicino alla parte Inizialmente abbiamo codificato questa riga come due traduzioni, separate da uno spazio codificato. ```yaml -before_sign_up_link: "Non hai un account?" +before_sign_up_link: 'Non hai un account?' sign_up: Registrati ``` @@ -428,14 +427,14 @@ Ma c'erano problemi con questo approccio. Lo spazio codificato sembrava suscitar Poiché sembrava possibile che un localizzatore avesse bisogno di questo tipo di flessibilità, abbiamo optato per astrarre la riga come una singola traduzione, utilizzando tag in stile HTML per racchiudere il testo del collegamento: ```yaml -sign_up_text: "Non hai un account? <a>Registrati</a>" +sign_up_text: 'Non hai un account? <a>Registrati</a>' ``` Questo inserisce lo spazio (precedentemente codificato) nella traduzione, quindi i localizzatori che non ne hanno bisogno possono rimuoverlo. E i tag possono essere posizionati liberamente all'interno della traduzione, rendendo questo approccio molto più flessibile. La morale di questa storia è: quando hai due porzioni di testo adiacenti che sembrano correlate l'una all'altra grammaticamente, o anche semanticamente, dovresti pensare a trovare un modo per incorporarle entrambe in un'unica traduzione. I tuoi localizzatori potrebbero avere motivo di ringraziarti! -Potremmo anche concludere che la presenza di piccole parti di testo codificato, come lo spazio codificato in questo esempio, potrebbe essere una sorta di [odore di codice](https://en.wikipedia.org/wiki/Code_smell) che indica la presenza di un problema più profondo. Non è sempre così, ma è una possibilità che vale la pena di prendere in considerazione. +Potremmo anche concludere che la presenza di piccole parti di testo codificato, come lo spazio codificato in questo esempio, potrebbe essere una sorta di [odore di codice](https://en.wikipedia.org/wiki/Code_smell) che indica la presenza di un problema più profondo. Non è sempre così, ma è una possibilità che vale la pena di prendere in considerazione. ### Tieni gli occhi aperti sui plurali! @@ -458,16 +457,16 @@ In inglese, il passato semplice non è influenzato dalla pluralizzazione. Poich Questo è il tipo di situazione in cui il lavoro monotono dell'astrazione linguistica richiede un po 'di cura e attenzione in più. Ricordati di chiederti se ogni nome (o pronome) può essere plurale. Se è possibile, assicurati di utilizzare l'estensione `app.translator.transChoice()`e passare una variabile appropriata al traduttore. Ovviamente non è necessario fornire traduzioni varianti nelle risorse in inglese. ```yaml -mentioned_by_text: "{users} replied to this." # Può essere pluralizzato ... -mentioned_by_self_text: "{users} replied to this." # Può essere pluralizzato ... +mentioned_by_text: '{users} replied to this.' # Può essere pluralizzato ... +mentioned_by_self_text: '{users} replied to this.' # Può essere pluralizzato ... ``` BMa sarebbe un'ottima idea aggiungere un commento dopo le traduzioni in questione, per avvisare i localizzatori del fatto che il codice supporterà l'aggiunta di tali varianti, qualora fossero necessarie. ### Riutilizza le traduzioni, non le chiavi! -Se le chiavi di spaziatura dei nomi si combinano per formare una specifica completa di dove viene utilizzata una traduzione, e la chiave ID specifica esattamente come viene utilizzata la traduzione e cosa dice, è ovvio che ogni chiave di traduzione completa deve essere unica. In altre parole: * non dovresti mai usare la stessa chiave più di una volta! * +Se le chiavi di spaziatura dei nomi si combinano per formare una specifica completa di dove viene utilizzata una traduzione, e la chiave ID specifica esattamente come viene utilizzata la traduzione e cosa dice, è ovvio che ogni chiave di traduzione completa deve essere unica. In altre parole: _ non dovresti mai usare la stessa chiave più di una volta! _ Sebbene questo possa sembrare inefficiente, c'è una buona ragione per fare le cose in questo modo: è il modo più semplice per garantire che i localizzatori abbiano la flessibilità di cui hanno bisogno. Se riutilizzi le chiavi nel codice, alla fine incontrerai un intoppo. I tuoi localizzatori non saranno in grado di trovare una singola espressione che si adatti a ogni contesto in cui hai usato una chiave o altro, e poi inizieranno a infastidirti per correggere il tuo codice. -Fortunatamente, puoi evitare molti di questi problemi se ti occupi semplicemente delle [traduzioni dei nomi](#namespacing-translations)correttamente, [assegna un nome alle tue chiavi ID](#naming-identifier-keys), e [riutilizza le traduzioni](#reusing-translations) invece delle chiavi. Sebbene possa sembrare un fastidio, a lungo termine, il [formato standard](#appendix-a:-standard-key-format) renderà la localizzazione molto più semplice per * tutti *. +Fortunatamente, puoi evitare molti di questi problemi se ti occupi semplicemente delle [traduzioni dei nomi](#namespacing-translations)correttamente, [assegna un nome alle tue chiavi ID](#naming-identifier-keys), e [riutilizza le traduzioni](#reusing-translations) invece delle chiavi. Sebbene possa sembrare un fastidio, a lungo termine, il [formato standard](#appendix-a:-standard-key-format) renderà la localizzazione molto più semplice per _ tutti _. diff --git a/docs/it/extend/mail.md b/docs/it/extend/mail.md index bd7b403cb..82bda3f83 100644 --- a/docs/it/extend/mail.md +++ b/docs/it/extend/mail.md @@ -13,35 +13,37 @@ use Swift_Transport; class MailgunDriver implements DriverInterface { - public function availableSettings(): array - { - return [ - 'setting_one' => '', - 'setting_two' => 'defaultValue', - 'dropdown_setting' => [ - 'option_one_val' => 'Option One Display', - 'option_two_val' => 'Option Two Display', - ], - ]; - } - - public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag - { - $validator->make($settings->all(), [ - 'setting_one' => 'required', - 'setting_two' => 'nullable|integer', - ])->errors(); - } - - public function canSend(): bool - { - return true; - } - - public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport - { - // Return a mail transport that implements Swift Transport - } + public function availableSettings(): array + { + return [ + 'setting_one' => '', + 'setting_two' => 'defaultValue', + 'dropdown_setting' => [ + 'option_one_val' => 'Option One Display', + 'option_two_val' => 'Option Two Display', + ], + ]; + } + + public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag + { + $validator + ->make($settings->all(), [ + 'setting_one' => 'required', + 'setting_two' => 'nullable|integer', + ]) + ->errors(); + } + + public function canSend(): bool + { + return true; + } + + public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport + { + // Return a mail transport that implements Swift Transport + } } ``` @@ -53,7 +55,7 @@ use YourNamespace\Mail\CustomDriver; return [ // Other extenders - (new Extend\Mail())->driver(CustomDriver::class) + (new Extend\Mail())->driver(CustomDriver::class), // Other extenders ]; ``` diff --git a/docs/it/extend/middleware.md b/docs/it/extend/middleware.md index d906deae9..7532bddfc 100644 --- a/docs/it/extend/middleware.md +++ b/docs/it/extend/middleware.md @@ -1,11 +1,10 @@ # Middleware -Il middleware un modo ingegnoso per avvolgere la gestione delle richieste HTTP in Flarum. Ci consente di modificare le risposte, aggiungere i propri controlli alla richiesta e molto altro ancora. Le possibilit sono infinite! +Il middleware � un modo ingegnoso per avvolgere la gestione delle richieste HTTP in Flarum. Ci� consente di modificare le risposte, aggiungere i propri controlli alla richiesta e molto altro ancora. Le possibilit� sono infinite! Flarum mantiene una "pipe" middleware attraverso la quale passano tutte le richieste. Ciascuna delle tre "applicazioni" (`admin`, `forum`, e `api`) hanno una propria subpipe: dopo essere state elaborate attraverso una logica condivisa, le richieste vengono deviate a una delle pipe in base al percorso. -Una richiesta passa attraverso i livelli middleware in ordine. Quando la richiesta viene gestita (un middleware restituisce qualcosa invece di passare la richiesta al livello successivo o lancia un'eccezione), la risposta risalir ai livelli del middleware in ordine inverso, prima di essere infine restituita all'utente. Tutto, dal gestore degli errori di Flarum alla sua logica di autenticazione, viene implementato come middleware e quindi pu essere integrato, sostituito, riordinato o rimosso dalle estensioni. - +Una richiesta passa attraverso i livelli middleware in ordine. Quando la richiesta viene gestita (un middleware restituisce qualcosa invece di passare la richiesta al livello successivo o lancia un'eccezione), la risposta risalir� ai livelli del middleware in ordine inverso, prima di essere infine restituita all'utente. Tutto, dal gestore degli errori di Flarum alla sua logica di autenticazione, viene implementato come middleware e quindi pu� essere integrato, sostituito, riordinato o rimosso dalle estensioni. ```php use Psr\Http\Message\ResponseInterface; @@ -33,32 +32,32 @@ use Flarum\Extend; // use Flarum\Http\Middleware\CheckCsrfToken; return [ - // Add middleware to forum frontend - (new Extend\Middleware('forum'))->add(YourMiddleware::class), - // Admin frontend - (new Extend\Middleware('admin'))->add(YourMiddleware::class), - // API frontend - (new Extend\Middleware('api'))->add(YourMiddleware::class), - - (new Extend\Middleware('frontend')) - // remove a middleware (e.g. remove CSRF token check 😱) - ->remove(CheckCsrfToken::class) - // insert before another middleware (e.g. before a CSRF token check) - ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) - // insert after another middleware (e.g. after a CSRF token check) - ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) - // replace a middleware (e.g. replace the CSRF check with your own implementation) - ->replace(CheckCsrfToken::class, YourMiddleware::class) + // Add middleware to forum frontend + (new Extend\Middleware('forum'))->add(YourMiddleware::class), + // Admin frontend + (new Extend\Middleware('admin'))->add(YourMiddleware::class), + // API frontend + (new Extend\Middleware('api'))->add(YourMiddleware::class), + + (new Extend\Middleware('frontend')) + // remove a middleware (e.g. remove CSRF token check 😱) + ->remove(CheckCsrfToken::class) + // insert before another middleware (e.g. before a CSRF token check) + ->insertBefore(CheckCsrfToken::class, YourMiddleware::class) + // insert after another middleware (e.g. after a CSRF token check) + ->insertAfter(CheckCsrfToken::class, YourMiddleware::class) + // replace a middleware (e.g. replace the CSRF check with your own implementation) + ->replace(CheckCsrfToken::class, YourMiddleware::class), ]; ``` -Tada! Middleware registrato. Ricorda che l'ordine importante. +Tada! Middleware registrato. Ricorda che l'ordine � importante. Ora che abbiamo le basi, esaminiamo alcune altre cose: ## Limitazione del middleware a determinati percorsi -Se non necessario che il middleware venga eseguito in ogni percorso, possibile aggiungere un filtro `if`: +Se non � necessario che il middleware venga eseguito in ogni percorso, � possibile aggiungere un filtro `if`: ```php use Laminas\Diactoros\Uri; @@ -76,7 +75,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface } ``` -Se il tuo middleware viene eseguito dopo `Flarum\Http\Middleware\ResolveRoute` (consigliato se dipende dal percorso), possibile accedere al nome del percorso tramite `$request->getAttribute('routeName')`. Per esempioe: +Se il tuo middleware viene eseguito dopo `Flarum\Http\Middleware\ResolveRoute` (consigliato se dipende dal percorso), � possibile accedere al nome del percorso tramite `$request->getAttribute('routeName')`. Per esempioe: ```php public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface @@ -115,7 +114,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface ]); $document = new Document(); $document->setErrors($error->getErrors()); - + return new JsonApiResponse($document, $error->getStatus()); } @@ -129,7 +128,7 @@ Per ulteriori informazioni sugli oggetti richiesta e risposta, vedere le [Interf ## Modifica della risposta dopo la manipolazione -Se desideri fare qualcosa con la risposta dopo che la richiesta iniziale stata gestita, non c' problema! Basta eseguire il gestore delle richieste e quindi la logica: +Se desideri fare qualcosa con la risposta dopo che la richiesta iniziale � stata gestita, non c'� problema! Basta eseguire il gestore delle richieste e quindi la logica: ```php public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface @@ -147,7 +146,7 @@ Tieni presente che le risposte della PSR-7 sono immutabili, quindi dovrai riasse ## Trasmettere la richiesta -Una volta che tutto stato detto e fatto e non stai restituendo una risposta tu stesso, puoi semplicemente passare la richiesta al middleware successivo: +Una volta che tutto � stato detto e fatto e non stai restituendo una risposta tu stesso, puoi semplicemente passare la richiesta al middleware successivo: ```php return $handler->handle($request); diff --git a/docs/it/extend/notifications.md b/docs/it/extend/notifications.md index a53f9d87e..dfa1f2f5b 100644 --- a/docs/it/extend/notifications.md +++ b/docs/it/extend/notifications.md @@ -8,11 +8,11 @@ Flarum include un potente sistema di notifica per avvisare gli utenti di nuove a Per definire un tipo di notifica, sarà necessario creare una nuova classe che implementa `Flarum\Notification\Blueprint\BlueprintInterface`. Questa classe definirà il contenuto e il comportamento della notifica tramite i seguenti metodi: -* `getSubject()` Il modello su cui si riferisce la notifica (ad es. Il `Post` che è stato apprezzato). -* `getSender()` Il modello `User` per l'utente che ha attivato la notifica. -* `getData()` Qualsiasi altro dato che potresti voler includere per l'accesso sul frontend (es. Il vecchio titolo della discussione quando rinominato). -* `getType()` Qui è dove assegni il nome alla notifica, questo sarà importante per i passaggi successivi. -* `getSubjectModal()`: Specificare il tipo di modello del soggetto (da `getSubject`). +- `getSubject()` Il modello su cui si riferisce la notifica (ad es. Il `Post` che è stato apprezzato). +- `getSender()` Il modello `User` per l'utente che ha attivato la notifica. +- `getData()` Qualsiasi altro dato che potresti voler includere per l'accesso sul frontend (es. Il vecchio titolo della discussione quando rinominato). +- `getType()` Qui è dove assegni il nome alla notifica, questo sarà importante per i passaggi successivi. +- `getSubjectModal()`: Specificare il tipo di modello del soggetto (da `getSubject`). Diamo un'occhiata a un esempio tratto da [Flarum Likes](https://github.com/flarum/likes/blob/master/src/Notification/PostLikedBlueprint.php): @@ -27,39 +27,39 @@ use Flarum\User\User; class PostLikedBlueprint implements BlueprintInterface { - public $post; + public $post; - public $user; + public $user; - public function __construct(Post $post, User $user) - { - $this->post = $post; - $this->user = $user; - } + public function __construct(Post $post, User $user) + { + $this->post = $post; + $this->user = $user; + } - public function getSubject() - { - return $this->post; - } + public function getSubject() + { + return $this->post; + } - public function getSender() - { - return $this->user; - } + public function getSender() + { + return $this->user; + } - public function getData() - { - } + public function getData() + { + } - public static function getType() - { - return 'postLiked'; - } + public static function getType() + { + return 'postLiked'; + } - public static function getSubjectModel() - { - return Post::class; - } + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -70,9 +70,9 @@ Dai un occhiata a [`DiscussionRenamedBlueprint`](https://github.com/flarum/core/ Quindi, registriamo la tua notifica in modo che Flarum lo sappia. Ciò consentirà agli utenti di modificare il modo in cui desiderano ricevere l'avviso della notifica. Possiamo farlo con il metodo `type` dell'extender `Notification` -* `$blueprint`: La tua classe statica (esempio: `PostLikedBlueprint::class`) -* `$serializer`: Il serializzatore del modello del soggetto (esempio: `PostSerializer::class`) -* `$enabledByDefault`: Qui è dove imposti i metodi di notifica che saranno abilitati per impostazione predefinita. Accetta una serie di stringhe, include "alert" per avere notifiche del forum (l'icona della campana), include "email" per le notifiche email. Puoi usarne uno entrambi o nessuno! (esempio: `['alert']` imposterebbe solo le notifiche nel forum per impostazione predefinita) +- `$blueprint`: La tua classe statica (esempio: `PostLikedBlueprint::class`) +- `$serializer`: Il serializzatore del modello del soggetto (esempio: `PostSerializer::class`) +- `$enabledByDefault`: Qui è dove imposti i metodi di notifica che saranno abilitati per impostazione predefinita. Accetta una serie di stringhe, include "alert" per avere notifiche del forum (l'icona della campana), include "email" per le notifiche email. Puoi usarne uno entrambi o nessuno! (esempio: `['alert']` imposterebbe solo le notifiche nel forum per impostazione predefinita) Vediamo un esempio da [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/extend.php): @@ -116,84 +116,84 @@ use Symfony\Contracts\Translation\TranslatorInterface; class PostMentionedBlueprint implements BlueprintInterface, MailableInterface { - /** - * @var Post - */ - public $post; - - /** - * @var Post - */ - public $reply; - - /** - * @param Post $post - * @param Post $reply - */ - public function __construct(Post $post, Post $reply) - { - $this->post = $post; - $this->reply = $reply; - } + /** + * @var Post + */ + public $post; + + /** + * @var Post + */ + public $reply; + + /** + * @param Post $post + * @param Post $reply + */ + public function __construct(Post $post, Post $reply) + { + $this->post = $post; + $this->reply = $reply; + } - /** - * {@inheritdoc} - */ - public function getSubject() - { - return $this->post; - } + /** + * {@inheritdoc} + */ + public function getSubject() + { + return $this->post; + } - /** - * {@inheritdoc} - */ - public function getFromUser() - { - return $this->reply->user; - } + /** + * {@inheritdoc} + */ + public function getFromUser() + { + return $this->reply->user; + } - /** - * {@inheritdoc} - */ - public function getData() - { - return ['replyNumber' => (int) $this->reply->number]; - } + /** + * {@inheritdoc} + */ + public function getData() + { + return ['replyNumber' => (int) $this->reply->number]; + } - /** - * {@inheritdoc} - */ - public function getEmailView() - { - return ['text' => 'flarum-mentions::emails.postMentioned']; - } + /** + * {@inheritdoc} + */ + public function getEmailView() + { + return ['text' => 'flarum-mentions::emails.postMentioned']; + } - /** - * {@inheritdoc} - */ - public function getEmailSubject(TranslatorInterface $translator) - { - return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ - '{replier_display_name}' => $this->post->user->display_name, - '{title}' => $this->post->discussion->title - ]); - } + /** + * {@inheritdoc} + */ + public function getEmailSubject(TranslatorInterface $translator) + { + return $translator->trans('flarum-mentions.email.post_mentioned.subject', [ + '{replier_display_name}' => $this->post->user->display_name, + '{title}' => $this->post->discussion->title, + ]); + } - /** - * {@inheritdoc} - */ - public static function getType() - { - return 'postMentioned'; - } + /** + * {@inheritdoc} + */ + public static function getType() + { + return 'postMentioned'; + } - /** - * {@inheritdoc} - */ - public static function getSubjectModel() - { - return Post::class; - } + /** + * {@inheritdoc} + */ + public static function getSubjectModel() + { + return Post::class; + } } ``` @@ -213,45 +213,45 @@ use Illuminate\Contracts\Queue\Queue; class PusherNotificationDriver implements NotificationDriverInterface { - /** - * @var Queue - */ - protected $queue; - - public function __construct(Queue $queue) - { - $this->queue = $queue; - } + /** + * @var Queue + */ + protected $queue; + + public function __construct(Queue $queue) + { + $this->queue = $queue; + } - /** - * {@inheritDoc} - */ - public function send(BlueprintInterface $blueprint, array $users): void - { - // The `send` method is responsible for determining any notifications need to be sent. - // If not (for example, if there are no users to send to), there's no point in scheduling a job. - // We HIGHLY recommend that notifications are sent via a queue job for performance reasons. - if (count($users)) { - $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); - } + /** + * {@inheritDoc} + */ + public function send(BlueprintInterface $blueprint, array $users): void + { + // The `send` method is responsible for determining any notifications need to be sent. + // If not (for example, if there are no users to send to), there's no point in scheduling a job. + // We HIGHLY recommend that notifications are sent via a queue job for performance reasons. + if (count($users)) { + $this->queue->push(new SendPusherNotificationsJob($blueprint, $users)); } + } - /** - * {@inheritDoc} - */ - public function registerType(string $blueprintClass, array $driversEnabledByDefault): void - { - // Questo metodo viene generalmente utilizzato per registrare una preferenza utente per questa notifica. - // Nel caso di Pusher, non ce n'è bisogno. - } + /** + * {@inheritDoc} + */ + public function registerType(string $blueprintClass, array $driversEnabledByDefault): void + { + // Questo metodo viene generalmente utilizzato per registrare una preferenza utente per questa notifica. + // Nel caso di Pusher, non ce n'è bisogno. + } } ``` Anche i driver di notifica vengono registrati tramite l'extender `Notification`, usando il metodo `driver`. Vengono forniti i seguenti argomenti -* `$driverName`: Un nome unico e leggibile per il driver -* `$driverClass`: La classe statica del driver (esempio: `PostSerializer::class`) -* `$typesEnabledByDefault`: Un array di tipi per i quali questo driver dovrebbe essere abilitato per impostazione predefinita. Questo verrà utilizzato nel calcolo `$driversEnabledByDefault`, che viene fornito dal metodo `registerType` del driver. +- `$driverName`: Un nome unico e leggibile per il driver +- `$driverClass`: La classe statica del driver (esempio: `PostSerializer::class`) +- `$typesEnabledByDefault`: Un array di tipi per i quali questo driver dovrebbe essere abilitato per impostazione predefinita. Questo verrà utilizzato nel calcolo `$driversEnabledByDefault`, che viene fornito dal metodo `registerType` del driver. Un altro esempio da [Flarum Pusher](https://github.com/flarum/pusher/blob/master/extend.php): @@ -277,12 +277,12 @@ Come per i progetti di notifica, dobbiamo dire a Flarum come vogliamo che venga Innanzitutto, crea una classe che estenda il componente di notifica. Quindi, ci sono 4 funzioni da aggiungere: -* `icon()`: Le icone [Font Awesome](https://fontawesome.com/) che appariranno accanto al testo della notifica (esempio: `fas fa-code-branch`). -* `href()`: Il collegamento che dovrebbe essere aperto quando si fa clic sulla notifica (esempio: `app.route.post(this.attrs.notification.subject())`). -* `content()`: Cosa dovrebbe mostrare la notifica stessa. Dovrebbe dire il nome utente e quindi l'azione. Sarà seguito da quando è stata inviata la notifica (assicurati di utilizzare le traduzioni). -* `exerpt()`: (opzionale) Un piccolo estratto che viene mostrato sotto la notifica (comunemente un estratto di un post). +- `icon()`: Le icone [Font Awesome](https://fontawesome.com/) che appariranno accanto al testo della notifica (esempio: `fas fa-code-branch`). +- `href()`: Il collegamento che dovrebbe essere aperto quando si fa clic sulla notifica (esempio: `app.route.post(this.attrs.notification.subject())`). +- `content()`: Cosa dovrebbe mostrare la notifica stessa. Dovrebbe dire il nome utente e quindi l'azione. Sarà seguito da quando è stata inviata la notifica (assicurati di utilizzare le traduzioni). +- `exerpt()`: (opzionale) Un piccolo estratto che viene mostrato sotto la notifica (comunemente un estratto di un post). -* Diamo un'occhiata al nostro esempio, vero? * +- Diamo un'occhiata al nostro esempio, vero? \* Dall'estensione [Flarum Subscriptions](https://github.com/flarum/subscriptions/blob/master/js/src/forum/components/NewPostNotification.js), quando viene pubblicato un nuovo post in una discussione successiva: @@ -304,7 +304,7 @@ export default class NewPostNotification extends Notification { } content() { - return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', {user: this.attrs.notification.sender()}); + return app.translator.trans('flarum-subscriptions.forum.notifications.new_post_text', { user: this.attrs.notification.sender() }); } } ``` @@ -337,25 +337,26 @@ app.initializers.add('flarum-likes', () => { items.add('postLiked', { name: 'postLiked', icon: 'far fa-thumbs-up', - label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'), }); }); }); ``` + Aggiungi semplicemente il nome della tua notifica (dal progetto), un'icona che desideri mostrare e una descrizione della notifica e il gioco è fatto! ## Sending Notifications -* I dati non vengono visualizzati nel database solo magicamente * +- I dati non vengono visualizzati nel database solo magicamente \* Ora che hai configurato tutte le notifiche, è il momento di inviare effettivamente la notifica all'utente! Per fortuna, questa è la parte più semplice, usa semplicemente la funzione [`NotificationSyncer`](https://github.com/flarum/core/blob/master/src/Notification/NotificationSyncer.php). Accetta due argomenti: -* `BlueprintInterface`: Questo è il progetto da istanziare che abbiamo creato nel primo passaggio, è necessario includere tutte le variabili che vengono utilizzate sul progetto (esempio: se a un utente piace un post, devi includere il modello `user` a cui è piaciuto il post). -* `$users`: Questo accetta un array di `user` che dovrebbe ricevere la notifica +- `BlueprintInterface`: Questo è il progetto da istanziare che abbiamo creato nel primo passaggio, è necessario includere tutte le variabili che vengono utilizzate sul progetto (esempio: se a un utente piace un post, devi includere il modello `user` a cui è piaciuto il post). +- `$users`: Questo accetta un array di `user` che dovrebbe ricevere la notifica -*Che cosa vuoi ancora? Vuoi essere in grado di eliminare anche le notifiche? * Il modo più semplice per rimuovere una notifica è passare esattamente gli stessi dati dell'invio di una notifica, tranne che con un array vuoto di destinatari. +_Che cosa vuoi ancora? Vuoi essere in grado di eliminare anche le notifiche? _ Il modo più semplice per rimuovere una notifica è passare esattamente gli stessi dati dell'invio di una notifica, tranne che con un array vuoto di destinatari. Diamo un'occhiata al nostro ** ultimo ** esempio di oggi: @@ -377,42 +378,38 @@ use Illuminate\Contracts\Events\Dispatcher; class SendNotificationWhenPostIsLiked { - protected $notifications; + protected $notifications; - public function __construct(NotificationSyncer $notifications) - { - $this->notifications = $notifications; - } + public function __construct(NotificationSyncer $notifications) + { + $this->notifications = $notifications; + } - public function subscribe(Dispatcher $events) - { - $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); - $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); - } + public function subscribe(Dispatcher $events) + { + $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); + $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); + } - public function whenPostWasLiked(PostWasLiked $event) - { - $this->syncNotification($event->post, $event->user, [$event->post->user]); - } + public function whenPostWasLiked(PostWasLiked $event) + { + $this->syncNotification($event->post, $event->user, [$event->post->user]); + } - public function whenPostWasUnliked(PostWasUnliked $event) - { - $this->syncNotification($event->post, $event->user, []); - } + public function whenPostWasUnliked(PostWasUnliked $event) + { + $this->syncNotification($event->post, $event->user, []); + } - public function syncNotification(Post $post, User $user, array $recipients) - { - if ($post->user->id != $user->id) { - $this->notifications->sync( - new PostLikedBlueprint($post, $user), - $recipients - ); - } + public function syncNotification(Post $post, User $user, array $recipients) + { + if ($post->user->id != $user->id) { + $this->notifications->sync(new PostLikedBlueprint($post, $user), $recipients); } + } } ``` ** Fantastico! ** Ora puoi inviare spam agli utenti con aggiornamenti sugli avvenimenti nel forum! - -* Hai provato di tutto? * Beh, se hai provato di tutto allora immagino ... Scherzo. Sentiti libero di postare nella [Community di Flarum](https://discuss.flarum.org/t/extensibility) o su [Discord](https://flarum.org/discord/) e qualcuno ti darà una mano. +- Hai provato di tutto? \* Beh, se hai provato di tutto allora immagino ... Scherzo. Sentiti libero di postare nella [Community di Flarum](https://discuss.flarum.org/t/extensibility) o su [Discord](https://flarum.org/discord/) e qualcuno ti darà una mano. diff --git a/docs/it/extend/permissions.md b/docs/it/extend/permissions.md index e00f7d99f..209a955da 100644 --- a/docs/it/extend/permissions.md +++ b/docs/it/extend/permissions.md @@ -53,13 +53,17 @@ Possiamo farlo estendendo il componente del frontend `flarum/components/Permissi import { extend } from 'flarum/extend'; import PermissionGrid from 'flarum/components/PermissionGrid'; -export default function() { - extend(PermissionGrid.prototype, 'moderateItems', items => { - items.add('tag', { - icon: 'fas fa-tag', // Classi CSS per l'icona. Generalmente in formato fontawesome, anche se puoi usare anche il tuo CSS personalizzato. - label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'), - permission: 'discussion.tag' // La stringa di autorizzazione. - }, 95); +export default function () { + extend(PermissionGrid.prototype, 'moderateItems', (items) => { + items.add( + 'tag', + { + icon: 'fas fa-tag', // Classi CSS per l'icona. Generalmente in formato fontawesome, anche se puoi usare anche il tuo CSS personalizzato. + label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'), + permission: 'discussion.tag', // La stringa di autorizzazione. + }, + 95 + ); }); } ``` diff --git a/docs/it/extend/post-types.md b/docs/it/extend/post-types.md index d7ae8cb85..bf205de83 100644 --- a/docs/it/extend/post-types.md +++ b/docs/it/extend/post-types.md @@ -1 +1 @@ -# Tipi di post \ No newline at end of file +# Tipi di post diff --git a/docs/it/extend/routes.md b/docs/it/extend/routes.md index 8c019c271..c31862ade 100644 --- a/docs/it/extend/routes.md +++ b/docs/it/extend/routes.md @@ -8,11 +8,11 @@ Il routing avviene sia sul backend PHP che sul frontend JavaScript. Sul backend, Flarum ha tre raccolte di percorsi: -* `forum` Questi percorsi sono accessibili in `yourforum.com/`. Includono percorsi che mostrano pagine nel frontend (come `yourforum.com/d/123-title`) e altri percorsi di utilità (come il percorso di reimpostazione della password). +- `forum` Questi percorsi sono accessibili in `yourforum.com/`. Includono percorsi che mostrano pagine nel frontend (come `yourforum.com/d/123-title`) e altri percorsi di utilità (come il percorso di reimpostazione della password). -* `admin` Questi percorsi sono accessibili sotto `yourforum.com/admin/`. Di default, c'è solo un percorso `admin` nel backend; il resto del routing amministrativo avviene sul frontend +- `admin` Questi percorsi sono accessibili sotto `yourforum.com/admin/`. Di default, c'è solo un percorso `admin` nel backend; il resto del routing amministrativo avviene sul frontend -* `api` Questi percorsi sono accessibili sotto `yourforum.com/api/` e compone le JSON:API di Flarum. +- `api` Questi percorsi sono accessibili sotto `yourforum.com/api/` e compone le JSON:API di Flarum. ### Definizione dei percorsi @@ -20,9 +20,9 @@ Puoi aggiungere percorsi a una qualsiasi di queste raccolte utilizzando l'extend Esistono metodi per registrare percorsi di qualsiasi metodo di richiesta HTTP: `get`, `post`, `put`, `patch`, e `delete`. Tutti questi metodi accettano tre argomenti: -* `$path` Il percorso che utilizza sintassi [FastRoute](https://github.com/nikic/FastRoute#defining-routes). -* `$name` Un nome univoco per la rotta, utilizzato per generare URL. Per evitare conflitti con altre estensioni, è necessario utilizzare il nome di chi lo ha fornito. -* `$handler` Il nome della classe controller che gestirà la richiesta. Quest'ultima verrà risolta tramite il contenitore. +- `$path` Il percorso che utilizza sintassi [FastRoute](https://github.com/nikic/FastRoute#defining-routes). +- `$name` Un nome univoco per la rotta, utilizzato per generare URL. Per evitare conflitti con altre estensioni, è necessario utilizzare il nome di chi lo ha fornito. +- `$handler` Il nome della classe controller che gestirà la richiesta. Quest'ultima verrà risolta tramite il contenitore. ```php <?php @@ -30,10 +30,7 @@ Esistono metodi per registrare percorsi di qualsiasi metodo di richiesta HTTP: ` use Flarum\Extend; use Acme\HelloWorld\HelloWorldController; -return [ - (new Extend\Routes('forum')) - ->get('/hello-world', 'acme.hello-world', HelloWorldController::class) -]; +return [(new Extend\Routes('forum'))->get('/hello-world', 'acme.hello-world', HelloWorldController::class)]; ``` ### Controller @@ -52,10 +49,10 @@ use Psr\Http\Server\RequestHandlerInterface; class HelloWorldController implements RequestHandlerInterface { - public function handle(Request $request): Response - { - return new HtmlResponse('<h1>Hello, world!</h1>'); - } + public function handle(Request $request): Response + { + return new HtmlResponse('<h1>Hello, world!</h1>'); + } } ``` @@ -76,8 +73,7 @@ Il metodo `handle` di un Controller è il codice che viene eseguito quando qualc A volte sarà necessario acquisire segmenti dell'URI all'interno di un percorso. Puoi farlo definendo i parametri del percorso usando sintassi [FastRoute](https://github.com/nikic/FastRoute#defining-routes): ```php - (new Extend\Routes('forum')) - ->get('/user/{id}', 'acme.user', UserController::class) +(new Extend\Routes('forum'))->get('/user/{id}', 'acme.user', UserController::class); ``` I valori di questi parametri verranno uniti ai parametri di query della richiesta, a cui è possibile accedere nel controller richiamando `$request->getQueryParams()`: @@ -118,19 +114,19 @@ Quindi, inserisci la Factory nel tuo controller e rendenderizza tramite `HtmlRes ```php class HelloWorldController implements RequestHandlerInterface { - protected $view; - - public function __construct(Factory $view) - { - $this->view = $view; - } - - public function handle(Request $request): Response - { - $view = $this->view->make('acme.hello-world::greeting'); - - return new HtmlResponse($view->render()); - } + protected $view; + + public function __construct(Factory $view) + { + $this->view = $view; + } + + public function handle(Request $request): Response + { + $view = $this->view->make('acme.hello-world::greeting'); + + return new HtmlResponse($view->render()); + } } ``` @@ -145,8 +141,7 @@ L'aggiunta di percorsi al frontend richiede in realtà di registrarl sia su fron Sul backend, invece di aggiungere il tuo percorso frontend tramite `Routes`, potresti utilizzare l'extender `Frontend` con metodo `route`. Questo presuppone sempre `GET` come metodo, e accetta un percorso e un nome come primi due argomenti: ```php - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users') +(new Extend\Frontend('forum'))->route('/users', 'acme.users'); ``` Ora quando `tuoforum.com/utente` viene visitato, verrà visualizzato il frontend del forum. Tuttavia, poiché il frontend non conosce ancora la rotta `users`, verrà visualizzato l'elenco di discussioni. @@ -166,7 +161,7 @@ export const extend = [ ]; ``` --> -Ora quanto `tuoforum.com/utente` verrà caricato il frontend del forum ed anche il componente `UsersPage` verrà renderizzato. Per ulteriori informazioni sulle pagine di frontend, vedere [questa sezione della documentazione](frontend-pages.md). +Ora quanto `tuoforum.com/utente` verrà caricato il frontend del forum ed anche il componente `UsersPage` verrà renderizzato. Per ulteriori informazioni sulle pagine di frontend, vedere [questa sezione della documentazione](frontend-pages.md). Advanced use cases might also be interested in using [route resolvers](frontend-pages.md#route-resolvers-advanced). @@ -190,6 +185,7 @@ I parametri del percorso verranno passati in `attrs` del componente. Saranno dis Per generare un URL ad un percorso sul frontend, utilizzare il metodo `app.route`. Accetta due argomenti: il nome della rotta e un hash di parametri. I parametri riempiranno i segmenti URI corrispondenti, altrimenti verranno aggiunti come parametri della query. <!-- import { app } from '@flarum/core/forum'; --> + ```js const url = app.route('acme.user', { id: 123, foo: 'bar' }); // http://tuoforum.com/utente/123?foo=bar @@ -224,10 +220,10 @@ import Link from 'flarum/components/Link'; Ogni volta che visiti percorso sul frontend, il backend costruisce un documento HTML con lo "scheletro" necessario per avviare l'applicazione JavaScript frontend. Puoi facilmente modificare questo documento per eseguire attività come: -* Modificare il "<title>" della pagina -* Aggiunta di risorse JavaScript e CSS esterne -* Aggiunta di contenuti SEO e tag "<meta>" -* Aggiunta di dati al payload JavaScript (ad es. Per precaricare le risorse che verranno visualizzate immediatamente sulla pagina, evitando così una richiesta non necessaria all'API) +- Modificare il "<title>" della pagina +- Aggiunta di risorse JavaScript e CSS esterne +- Aggiunta di contenuti SEO e tag "<meta>" +- Aggiunta di dati al payload JavaScript (ad es. Per precaricare le risorse che verranno visualizzate immediatamente sulla pagina, evitando così una richiesta non necessaria all'API) Puoi apportare modifiche generali al frontend utilizzando l'extender `Frontend` e metodo `content`. Accetta una chiusura che riceve due parametri: un oggetto `Flarum\Frontend\Document` che rappresenta il documento HTML che verrà visualizzato e un oggetto `Request`. @@ -236,10 +232,9 @@ use Flarum\Frontend\Document; use Psr\Http\Message\ServerRequestInterface as Request; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document, Request $request) { - $document->head[] = '<script>alert("Hello, world!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document, Request $request) { + $document->head[] = '<script>alert("Hello, world!")</script>'; + }), ]; ``` @@ -247,9 +242,8 @@ Puoi anche aggiungere contenuti tuo frontend: ```php return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) + (new Extend\Frontend('forum'))->route('/users', 'acme.users', function (Document $document, Request $request) { + $document->title = 'Users'; + }), ]; ``` diff --git a/docs/it/extend/search.md b/docs/it/extend/search.md index 90de843b7..fbd342abc 100644 --- a/docs/it/extend/search.md +++ b/docs/it/extend/search.md @@ -1 +1 @@ -# Cerca \ No newline at end of file +# Cerca diff --git a/docs/it/extend/service-provider.md b/docs/it/extend/service-provider.md index c190559da..8185113eb 100644 --- a/docs/it/extend/service-provider.md +++ b/docs/it/extend/service-provider.md @@ -32,19 +32,19 @@ use Flarum\Foundation\AbstractServiceProvider; class CustomServiceProvider extends AbstractServiceProvider { - public function register() - { - // custom logic here - } - - public function boot() - { - // custom logic here - } + public function register() + { + // custom logic here + } + + public function boot() + { + // custom logic here + } } ``` -Il metodo `register` verrà eseguito durante il passaggio (3) qui sopra, e il metodo `boot` verrà eseguito durante la fase (5). +Il metodo `register` verrà eseguito durante il passaggio (3) qui sopra, e il metodo `boot` verrà eseguito durante la fase (5). In entrambi i metodi, il contenitore è disponibile tramite `$this->app`. Per registrare effettivamente il tuo provider di servizi personalizzato, puoi utilizzare l'extender `ServiceProvider` in `extend.php`: @@ -55,9 +55,8 @@ Per registrare effettivamente il tuo provider di servizi personalizzato, puoi ut use Flarum\Extend; return [ - // Other extenders - (new Extend\ServiceProvider()) - ->register(CustomServiceProvider::class), - // Other extenders + // Other extenders + (new Extend\ServiceProvider())->register(CustomServiceProvider::class), + // Other extenders ]; ``` diff --git a/docs/it/extend/settings.md b/docs/it/extend/settings.md index 811668cb3..72a2a0372 100644 --- a/docs/it/extend/settings.md +++ b/docs/it/extend/settings.md @@ -17,15 +17,15 @@ use Flarum\Settings\SettingsRepositoryInterface; class ClassInterfacesWithSettings { - /** - * @var SettingsRepositoryInterface - */ - protected $settings; - - public function __construct(SettingsRepositoryInterface $settings) - { - $this->settings = $settings; - } + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } } ``` @@ -80,15 +80,15 @@ Questo può essere fatto tramite l'extender `Settings`. Per esempio: use Flarum\Extend; return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }), -] + (new Extend\Settings()) + ->serializeToForum('myCoolSetting', 'my.cool.setting.key') + ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { + // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. + // In this example, we'll append a string to it. + + return "My Cool Setting: $retrievedValue"; + }), +]; ``` Ora, l'impostazione `my.cool.setting.key` sarà disponibile nel frontend come `app.forum.attribute("myCoolSetting")`, e il nostro valore modificato sarà accessibile tramite `app.forum.attribute("myCoolSettingModified")`. diff --git a/docs/it/extend/start.md b/docs/it/extend/start.md index 029f65fee..9e181aca5 100644 --- a/docs/it/extend/start.md +++ b/docs/it/extend/start.md @@ -10,11 +10,11 @@ Tieni presente che Flarum utilizza alcuni linguaggi e strumenti _moderni_. Se ha Flarum � composto da tre strati: -* Primo, c'� il ** backend **. Questo � scritto in formato [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), e fa uso di un'ampia gamma di array e componenti [Laravel](https://laravel.com/) e pacchetti tramite [Composer](https://getcomposer.org/). Ti consigliamo anche di familiarizzare con il concetto di [iniezione dipendenze](https://laravel.com/docs/6.x/container), che viene utilizzato in tutto il nostro backend. +- Primo, c'� il ** backend **. Questo � scritto in formato [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), e fa uso di un'ampia gamma di array e componenti [Laravel](https://laravel.com/) e pacchetti tramite [Composer](https://getcomposer.org/). Ti consigliamo anche di familiarizzare con il concetto di [iniezione dipendenze](https://laravel.com/docs/6.x/container), che viene utilizzato in tutto il nostro backend. -* Secondo, il backend espone una ** API pubblica ** che consente ai client frontend di interfacciarsi con i dati del tuo forum. Questo � costruito secondo il [specifiche JSON:API](https://jsonapi.org/). +- Secondo, il backend espone una ** API pubblica ** che consente ai client frontend di interfacciarsi con i dati del tuo forum. Questo � costruito secondo il [specifiche JSON:API](https://jsonapi.org/). -* Ed ultimo, c'� l'interfaccia web predefinita che chiamiamo ** frontend **. Questa � una [applicazione a pagina singola](https://en.wikipedia.org/wiki/Single-page_application) che utilizza le API. � costruito con un semplice framework simile a React chiamato [Mithril.js](https://mithril.js.org). +- Ed ultimo, c'� l'interfaccia web predefinita che chiamiamo ** frontend **. Questa � una [applicazione a pagina singola](https://en.wikipedia.org/wiki/Single-page_application) che utilizza le API. � costruito con un semplice framework simile a React chiamato [Mithril.js](https://mithril.js.org). Le estensioni dovranno spesso interagire con tutti e tre questi livelli per far accadere le cose. Ad esempio, se si desidera creare un'estensione che aggiunga campi personalizzati ai profili utente, � necessario aggiungere le strutture di database appropriate nel ** backend **, esporre tali dati nell '** API pubblica ** e quindi visualizzare e consentire agli utenti di modificarlo sul ** frontend **. @@ -22,20 +22,17 @@ Allora ... come estendiamo questi livelli? ## Extender -Per estendere Flarum, useremo un concetto chiamato ** extender **. Gli extender sono oggetti * dichiarativi * che descrivono in termini semplici gli obiettivi che stai cercando di raggiungere (come aggiungere un nuovo percorso al tuo forum o eseguire del codice quando � stata creata una nuova discussione). +Per estendere Flarum, useremo un concetto chiamato ** extender **. Gli extender sono oggetti _ dichiarativi _ che descrivono in termini semplici gli obiettivi che stai cercando di raggiungere (come aggiungere un nuovo percorso al tuo forum o eseguire del codice quando � stata creata una nuova discussione). Ogni extender � diverso. Tuttavia, saranno sempre in qualche modo simili a questo: ```php // Register a JavaScript and a CSS file to be delivered with the forum frontend -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') +(new Extend\Frontend('forum'))->js(__DIR__ . '/forum-scripts.js')->css(__DIR__ . '/forum-styles.css'); ``` Creare prima un'istanza dell'extender, quindi chiamare i metodi su di essa per un'ulteriore configurazione. Tutti questi metodi restituiscono l'extender stesso, in modo da poter ottenere l'intera configurazione semplicemente concatenando le chiamate ai metodi. - Per mantenere le cose coerenti, usiamo questo concetto di estensori sia nel backend (nel mondo PHP) che nel frontend (mondo JavaScript). _Tutto_ quello che fai nella tua estensione dovrebbe essere fatto tramite extender, perch� sono una ** garanzia ** che ti stiamo dando che una futura versione minore di Flarum non interromper� la tua estensione. Tutti gli estensori attualmente disponibili dal core di Flarum possono essere trovati sotto la voce [`Extend`](https://github.com/flarum/core/blob/master/src/Extend) [(documentazione PHP API)](https://api.docs.flarum.org/php/master/flarum/extend). Ogni estensione potr� avere anche extender proprietari. @@ -51,10 +48,9 @@ use Flarum\Extend; use Flarum\Frontend\Document; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document) { - $document->head[] = '<script>alert("Ciao, Mondo!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document) { + $document->head[] = '<script>alert("Ciao, Mondo!")</script>'; + }), ]; ``` @@ -86,53 +82,55 @@ Dobbiamo parlare un po' a Composer del nostro pacchetto, e possiamo farlo creand ```json { - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } + "name": "acme/flarum-hello-world", + "description": "Say hello to the world!", + "type": "flarum-extension", + "require": { + "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" + }, + "autoload": { + "psr-4": { "Acme\\HelloWorld\\": "src/" } + }, + "extra": { + "flarum-extension": { + "title": "Hello World", + "icon": { + "name": "fas fa-smile", + "backgroundColor": "#238c59", + "color": "#fff" + } } + } } ``` -* ** nome ** � il nome del pacchetto Composer nel formato `creatore/pacchetto`. - * Dovresti scegliere un nome fornitore che sia univoco, ad esempio il tuo nome utente GitHub. Ai fini di questo tutorial, supporremo che tu stia utilizzando `acme`come nome creatore. - * Dovresti aggiungere il prefisso `package` con `flarum-` per indicare che si tratta di un pacchetto specificamente destinato all'uso con Flarum. +- ** nome ** � il nome del pacchetto Composer nel formato `creatore/pacchetto`. + + - Dovresti scegliere un nome fornitore che sia univoco, ad esempio il tuo nome utente GitHub. Ai fini di questo tutorial, supporremo che tu stia utilizzando `acme`come nome creatore. + - Dovresti aggiungere il prefisso `package` con `flarum-` per indicare che si tratta di un pacchetto specificamente destinato all'uso con Flarum. + +- **description ** � una breve descrizione composta da una frase che spiega ci� che fa l'estensione. -* **description ** � una breve descrizione composta da una frase che spiega ci� che fa l'estensione. +- **type** DEVE essere impostato su `flarum-extension`. Ci� garantisce che quando qualcuno "richiede" la tua estensione, verr� identificato come tale. -* **type** DEVE essere impostato su `flarum-extension`. Ci� garantisce che quando qualcuno "richiede" la tua estensione, verr� identificato come tale. +- **require** contiene un elenco delle dipendenze della tua estensione. -* **require** contiene un elenco delle dipendenze della tua estensione. - * Dovrai specificare la versione di Flarum con cui la tua estensione � compatibile qui. - * Questo � anche il posto dove elencare altre librerie Composer di cui il tuo codice ha bisogno per funzionare. + - Dovrai specificare la versione di Flarum con cui la tua estensione � compatibile qui. + - Questo � anche il posto dove elencare altre librerie Composer di cui il tuo codice ha bisogno per funzionare. ::: warning Scegli con cura la versione Flarum - - Sebbene Flarum sia ancora in beta, ti consigliamo di dichiarare la compatibilit� solo con la versione corrente di Flarum: + +Sebbene Flarum sia ancora in beta, ti consigliamo di dichiarare la compatibilit� solo con la versione corrente di Flarum: "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" - - ::: -* **autoload** dice a Composer dove trovare le classi della tua estensione. Il nome qui dovrebbe riflettere il fornitore delle estensioni e il nome del pacchetto in CamelCase. +::: + +- **autoload** dice a Composer dove trovare le classi della tua estensione. Il nome qui dovrebbe riflettere il fornitore delle estensioni e il nome del pacchetto in CamelCase. -* **extra.flarum-extension** contiene alcune informazioni specifiche di Flarum, come il nome visualizzato dell'estensione e come dovrebbe apparire la sua icona. - * **title** � il nome visualizzato della tua estensione. - * **icon** � un oggetto che definisce l'icona della tua estensione. La propriet� ** name ** � un icona [Font Awesome](https://fontawesome.com/icons). Tutte le altre propriet� vengono utilizzate dall'attributo `style` per l'icona della tua estensione. +- **extra.flarum-extension** contiene alcune informazioni specifiche di Flarum, come il nome visualizzato dell'estensione e come dovrebbe apparire la sua icona. + - **title** � il nome visualizzato della tua estensione. + - **icon** � un oggetto che definisce l'icona della tua estensione. La propriet� ** name ** � un icona [Font Awesome](https://fontawesome.com/icons). Tutte le altre propriet� vengono utilizzate dall'attributo `style` per l'icona della tua estensione. Guarda la documentazione [schema di composer.json](https://getcomposer.org/doc/04-schema.md) documentation per informazioni su altre propriet� da aggiungere a `composer.json`. @@ -152,7 +150,7 @@ composer require acme/flarum-hello-world *@dev Una volta fatto, vai avanti e avvia la pagina di amministrazione del tuo forum. -*crank, ching, crunk* +_crank, ching, crunk_ Oopl�! Ciao a te estensione Hello World! diff --git a/docs/it/extend/testing.md b/docs/it/extend/testing.md index 21e60f835..8ae056963 100644 --- a/docs/it/extend/testing.md +++ b/docs/it/extend/testing.md @@ -1 +1 @@ -# Test \ No newline at end of file +# Test diff --git a/docs/it/extend/theme.md b/docs/it/extend/theme.md index 8f8226868..328488dd3 100644 --- a/docs/it/extend/theme.md +++ b/docs/it/extend/theme.md @@ -1 +1 @@ -# Guida rapida \ No newline at end of file +# Guida rapida diff --git a/docs/it/extend/translate.md b/docs/it/extend/translate.md index cc787c0f3..5617b3f39 100644 --- a/docs/it/extend/translate.md +++ b/docs/it/extend/translate.md @@ -11,11 +11,10 @@ Ecco un esempio veloce dal pacchetto [Flarum English](https://github.com/flarum/ ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` -*Facile, giusto?* - +_Facile, giusto?_ ### Pacchetti di traduzione @@ -24,10 +23,10 @@ Tuttavia, il processo è leggermente diverso per i pacchetti di traduzione. Con ```php <?php -return new Flarum\Extend\LanguagePack; +return new Flarum\Extend\LanguagePack(); ``` -`composer.json` andraà aggiornato. Ora avrà bisogno di un oggetto `flarum-locale` in `extra`, come per `flarum-extension`. +`composer.json` andraà aggiornato. Ora avrà bisogno di un oggetto `flarum-locale` in `extra`, come per `flarum-extension`. Puoi semplicemente inserire quanto segue sotto `flarum-extension` pur rimanendo dentro `extra`: ```json @@ -37,4 +36,4 @@ Puoi semplicemente inserire quanto segue sotto `flarum-extension` pur rimanendo } ``` -E questo è tutto! \ No newline at end of file +E questo è tutto! diff --git a/docs/it/extend/update-b15.md b/docs/it/extend/update-b15.md index 318505d70..fc61bc072 100644 --- a/docs/it/extend/update-b15.md +++ b/docs/it/extend/update-b15.md @@ -17,16 +17,17 @@ Se hai bisogno di aiuto per applicare queste modifiche o utilizzare nuove funzio - `Flarum\Formatter\Event\Parsing` è obsoleto, il metodo `parse` di `Formatter` va utilizzato al suo posto - `Flarum\Formatter\Event\Rendering` è obsoleto, il metodo `render` di `Formatter` va utilizzato al suo posto - `Flarum\Notification\Event\Sending` è obsoleto, il metodo `driver` di `Notification` va utilizzato al suo posto - - Si noti che il nuovo sistema di driver di notifica non è un analogo esatto del vecchio evento `Sending`, -poiché può solo aggiungere nuovi driver, non modificare la funzionalità del driver di avviso della campana di notifica predefinito. Se l'estensione deve modificare ** come ** o ** a chi ** vengono inviate le notifiche, potrebbe essere necessario sostituire `Flarum\Notification\NotificationSyncer`. + - Si noti che il nuovo sistema di driver di notifica non è un analogo esatto del vecchio evento `Sending`, + poiché può solo aggiungere nuovi driver, non modificare la funzionalità del driver di avviso della campana di notifica predefinito. Se l'estensione deve modificare ** come ** o ** a chi ** vengono inviate le notifiche, potrebbe essere necessario sostituire `Flarum\Notification\NotificationSyncer`. - `Flarum\Event\ConfigureNotificationTypes` è obsoleto, il metodo `type` di `Notification` va utilizzato al suo posto - `Flarum\Event\ConfigurePostTypes` è obsoleto, il metodo `type` di `Post` va utilizzato al suo posto -- `Flarum\Post\Event\CheckingForFlooding` è ormai obsoleto come `Flarum\Post\Floodgate`. -Sono stati sostituiti con un sistema di limitazione basato su middleware che si applica a TUTTE le richieste a / api / * e possono essere configurati tramite il `ThrottleApi`. Per favore guarda la documentazione [limitazioni API](api-throttling.md) per informazioni. +- `Flarum\Post\Event\CheckingForFlooding` è ormai obsoleto come `Flarum\Post\Floodgate`. + Sono stati sostituiti con un sistema di limitazione basato su middleware che si applica a TUTTE le richieste a / api / \* e possono essere configurati tramite il `ThrottleApi`. Per favore guarda la documentazione [limitazioni API](api-throttling.md) per informazioni. - `Flarum\Event\ConfigureUserPreferences` è ormai obsoleto, il metodo `registerPreference` di `User` va utilizzato al suo posto - `Flarum\Foundation\Event\Validating` è ormai obsoleto, il metodo `configure` di `Validator` va utilizzato al suo posto - Il sistema delle politiche è stato leggermente rielaborato per essere più intuitivo. In precedenza, i criteri contenevano sia i criteri effettivi, che determinano se un utente può eseguire alcune capacità, sia gli ambiti di visibilità del modello, che consentivano un'efficace limitazione delle query solo agli elementi a cui gli utenti hanno accesso. Guarda [documentazione sulle autorizzazioni](authorization.md) per maggiori informazioni su questo sistema. Ora: + - `Flarum\Event\ScopeModelVisibility` è ormai obsoleto. Nuovi scopers possono essere registrati tramite l'extender `ModelVisibility`, e ogni query `Eloquent\Builder` può essere richiamata dal metodo `whereVisibleTo`, con l'abilità in questione come secondo argomento opzionale (il valore predefinito è `view`). - `Flarum\Event\GetPermission` è ormai obsoleto. Le policy possono essere registrate tramite extender `Policy`. `Flarum\User\User::can` non è cambiato. Si prega di notare che le nuove policy devono restituire uno dei valori `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, non booleano. diff --git a/docs/it/extend/update-b16.md b/docs/it/extend/update-b16.md index c0b481f46..b1c083f60 100644 --- a/docs/it/extend/update-b16.md +++ b/docs/it/extend/update-b16.md @@ -47,12 +47,12 @@ Come parte dei nostri continui sforzi per rendere il sistema di ricerca di Flaru In particolare, il filtraggio e la ricerca sono ora trattati come meccanismi diversi e hanno condutture ed estensori separati. In sostanza, se una query ha `filter[q]` come parametro, verrà considerato come una ricerca e tutti gli altri parametri del filtro verranno ignorati. In caso contrario, verrà gestito dal sistema di filtraggio. Ciò consentirà alla fine di gestire le ricerche da driver alternativi (forniti dalle estensioni), come ElasticSearch, senza impattare i filtri (es. caricamento discussioni recenti). Le classi comuni a entrambi i sistemi sono state spostate sotto il namespace `Query`. -Le implementazioni di filtro e ricerca predefinita di Core (denominate SimpleFlarumSearch) sono abbastanza simili, poiché entrambe sono alimentate dal database. L'API controller `List` richiama i metodi `search` / `filter` in una sottoclasse specifica delle risorse di `Flarum\Search\AbstractSearcher` o `Flarum\Filter\AbstractFilterer`. Gli argomenti sono un'istanza di `Flarum\Query\QueryCriteria`, oltre a informazioni su ordinamento, offset e limite. Entrambi i sistemi restituiscono un'istanza di `Flarum\Query\QueryResults`, +Le implementazioni di filtro e ricerca predefinita di Core (denominate SimpleFlarumSearch) sono abbastanza simili, poiché entrambe sono alimentate dal database. L'API controller `List` richiama i metodi `search` / `filter` in una sottoclasse specifica delle risorse di `Flarum\Search\AbstractSearcher` o `Flarum\Filter\AbstractFilterer`. Gli argomenti sono un'istanza di `Flarum\Query\QueryCriteria`, oltre a informazioni su ordinamento, offset e limite. Entrambi i sistemi restituiscono un'istanza di `Flarum\Query\QueryResults`, che è effettivamente un involucro attorno a una collezione di modelli Eloquent. Anche i sistemi predefiniti sono in qualche modo simili nella loro implementazione. `Filterer`applica filtri (implementando `Flarum\Filter\FilterInterface`) in base ai parametri della query nel modulo `filter[FILTER_KEY] = FILTER_VALUE` (o `filter[-FILTER_KEY] = FILTER_VALUE` per filtri negati). SimpleFlarumSearch `Searcher` divide il parametro `filter[q]` da spazi in "termini", applica Gambits (implementando `Flarum\Search\GambitInterface`) che corrispondono ai termini e quindi applicano "Fulltext Gambit" per cercare in base a "termini" che non corrispondono ad un "auxiliary gambit". Entrambi i sistemi applicano quindi l'ordinamento, un offset e un limite di conteggio dei risultati e consentono alle estensioni di modificare il risultato della query tramite `searchMutators` o `filterMutators`. -Le estensioni aggiungono "gambits" e "search mutators" per classi `Searcher` tramite estensore `SimpleFlarumSearch`. Possono aggiungere filtri a classi `Filterer` tramite estensore`Filter`. +Le estensioni aggiungono "gambits" e "search mutators" per classi `Searcher` tramite estensore `SimpleFlarumSearch`. Possono aggiungere filtri a classi `Filterer` tramite estensore`Filter`. Per quanto riguarda l'aggiornamento, tieni presente quanto segue: @@ -117,7 +117,6 @@ I [problemi di sicurezza in Flarum](https://github.com/flarum/core/issues/2075) Se utilizzi token di accesso di breve durata per qualsiasi scopo, prendi nota del tempo di scadenza di 1 ora. La scadenza si basa sull'ora dell'ultimo utilizzo, quindi rimarrà valida finché continuerà ad essere utilizzata. - A causa della grande quantità di token scaduti accumulati nel database e del fatto che la maggior parte dei token non è mai stata utilizzata più di una volta durante il processo di accesso, abbiamo scelto di eliminare tutti i token di accesso per una durata di 3600 secondi come parte della migrazione , Tutti i token rimanenti sono stati convertiti in `session_remember`. #### Ricorda cookie @@ -140,4 +139,4 @@ Un token collegato a una sessione Web verrà ora automaticamente eliminato dal d - Le policy possono ora restituire `true` e `false` come alias per `$this->allow()` e `$this->deny()`, rispettivamente. - I permessi `user.edit` sono stati divisi in `user.editGroups`, `user.editCredentials` (per email, username, e password), e `user.edit` (per altri attributi). - Ci sono ora permessi (`bypassTagCounts`) che consentono agli utenti di ignorare i requisiti di conteggio dei tag. -- Flarum ora supporta PHP 7.3 - PHP 8.0, con supporto per PHP 7.2 ufficialmente abbandonato. \ No newline at end of file +- Flarum ora supporta PHP 7.3 - PHP 8.0, con supporto per PHP 7.2 ufficialmente abbandonato. diff --git a/docs/it/extensions.md b/docs/it/extensions.md index ee939b7bb..75d32533b 100644 --- a/docs/it/extensions.md +++ b/docs/it/extensions.md @@ -4,7 +4,7 @@ Flarum è minimalista, ma è anche altamente estensibile. In effetti, la maggior Questo approccio rende Flarum estremamente personalizzabile: Puoi disabilitare tutte le funzionalità che non ti servono e installare altre estensioni per rendere il tuo forum perfetto per la tua comunità. -Per ulteriori informazioni sulla filosofia di Flarum su quali funzionalità includiamo nel core o se stai cercando di creare la tua estensione, consulta la [documentazione estensioni](extend/README.md). +Per ulteriori informazioni sulla filosofia di Flarum su quali funzionalità includiamo nel core o se stai cercando di creare la tua estensione, consulta la [documentazione estensioni](extend/README.md). Questo articolo si concentrerà sulla gestione delle estensioni dal punto di vista dell'amministratore del forum. ## Trovare le estensioni @@ -15,7 +15,7 @@ Flarum ha un vasto ecosistema di estensioni, molte delle quali sono open source Proprio come Flarum, le estensioni vengono installate tramite [Composer](https://getcomposer.org), usando SSH. Per installare un estensione: -1. `cd` fino alla cartella che contiene `composer.json`. +1. `cd` fino alla cartella che contiene `composer.json`. 2. Lancia `composer require COMPOSER_PACKAGE_NAME`. Questo solitamente compare nel post o nella documentazione dell'estensione. ## Gestire le estensioni @@ -24,4 +24,4 @@ La pagina delle estensioni del pannello di amministrazione offre un modo semplic - Abilitare o disabilitare estensioni - Accedere alle impostazioni delle estensioni (sebbene alcune estensioni utilizzino una scheda nella barra laterale principale per le impostazioni) -- Ripristina le migrazioni di un'estensione per rimuovere eventuali modifiche al database apportate (tramite il tasto disinstalla). Ciò rimuoverà TUTTI i dati associati all'estensione ed è irreversibile. Dovrebbe essere fatto solo quando rimuovi un'estensione e non prevedi di installarla di nuovo. È anche del tutto facoltativo. \ No newline at end of file +- Ripristina le migrazioni di un'estensione per rimuovere eventuali modifiche al database apportate (tramite il tasto disinstalla). Ciò rimuoverà TUTTI i dati associati all'estensione ed è irreversibile. Dovrebbe essere fatto solo quando rimuovi un'estensione e non prevedi di installarla di nuovo. È anche del tutto facoltativo. diff --git a/docs/it/faq.md b/docs/it/faq.md index 62c86c1da..ba4cdb350 100644 --- a/docs/it/faq.md +++ b/docs/it/faq.md @@ -16,7 +16,7 @@ Tuttavia, le donazioni non avranno un impatto diretto sulla velocità di svilupp ### Posso utilizzare la versione beta in produzione? Per favore? -C'è una ragione se nelle [istruzioni sull'installazione](install.md) si viene messi in guardia su questa domanda. Flarum non è ancora maturo e c'è molto spazio perché qualcosa vada storto. Le estensioni su cui fai affidamento potrebbero essere rese incompatibili dalle versioni beta più recenti. I bug potrebbero causare una perdita di contenuto o esporre informazioni private a Internet in generale. Una SEO non ottimale potrebbe danneggiare il posizionamento del tuo sito, rendendo difficile attirare nuovi membri. I membri esistenti potrebbero stufarsi di problemi di prestazioni o funzionalità incomplete e dirigersi verso pascoli più verdi. +C'è una ragione se nelle [istruzioni sull'installazione](install.md) si viene messi in guardia su questa domanda. Flarum non è ancora maturo e c'è molto spazio perché qualcosa vada storto. Le estensioni su cui fai affidamento potrebbero essere rese incompatibili dalle versioni beta più recenti. I bug potrebbero causare una perdita di contenuto o esporre informazioni private a Internet in generale. Una SEO non ottimale potrebbe danneggiare il posizionamento del tuo sito, rendendo difficile attirare nuovi membri. I membri esistenti potrebbero stufarsi di problemi di prestazioni o funzionalità incomplete e dirigersi verso pascoli più verdi. Puoi decidere di ignorare questi rischi e installare comunque Flarum. Dipende da te ... ma tieni presente che se le cose vanno orribilmente storte, sarà tua responsabilità affrontarle. Non possiamo garantire che saremo in grado di aiutarti a risolvere i tuoi problemi, tanto meno in modo tempestivo. Quindi tieni presente che è il tuo sito che metti in gioco, scegli con saggezza. diff --git a/docs/it/install.md b/docs/it/install.md index 30385b6d7..b3adb7dbc 100644 --- a/docs/it/install.md +++ b/docs/it/install.md @@ -4,7 +4,7 @@ Flarum è **un software in fase beta**. Ciò significa che ha ancora alcune funzionalità incomplete e bug 🐛🐞, e ad un certo punto – prima o poi – probabilmente un errore potrà paventarsi! 💥 -La beta serve a risolvere questi problemi e migliorare Flarum. **Per favore, non utilizzare Flarum in produzione a meno che tu non sappia cosa stai facendo**. Non possiamo supportarti se le cose vanno male. Sarà possibile eseguire l'aggiornamento alle versioni successive, ma potrebbe essere necessario sporcarsi le mani. +La beta serve a risolvere questi problemi e migliorare Flarum. **Per favore, non utilizzare Flarum in produzione a meno che tu non sappia cosa stai facendo**. Non possiamo supportarti se le cose vanno male. Sarà possibile eseguire l'aggiornamento alle versioni successive, ma potrebbe essere necessario sporcarsi le mani. ::: @@ -18,10 +18,10 @@ Fatti un giro sul nostro [forum di dimostrazione](https://discuss.flarum.org/d/2 Prima di installare Flarum, è importante verificare che il tuo server soddisfi i requisiti. Per eseguire Flarum, avrai bisogno di: -* **Apache** (con mod\_rewrite abilitayo) o **Nginx** -* **PHP 7.3+** con le seguenti estensioni: curl, dom, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+** o **MariaDB 10.0.5+** -* **SSH (accesso su riga di comando)** per lanciare Composer +- **Apache** (con mod_rewrite abilitayo) o **Nginx** +- **PHP 7.3+** con le seguenti estensioni: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip +- **MySQL 5.6+** o **MariaDB 10.0.5+** +- **SSH (accesso su riga di comando)** per lanciare Composer ::: Hosting condiviso @@ -47,7 +47,7 @@ Quando tutto è pronto, accedi al tuo forum in un browser web e segui le istruzi ### Apache -Flarum include un file `.htaccess` nella cartella `public` – assicurati che sia stato caricato correttamente. **Flarum non funzionerà correttamente se `mod_rewrite` non è abilitato o il file `.htaccess` non è accessibile.** Assicurati di verificare con il tuo provider di hosting (o il tuo VPS) che queste funzionalità siano abilitate. Se gestisci il tuo server, potresti dover aggiungere quanto segue alla configurazione del tuo sito per abilitare i file `.htaccess`. +Flarum include un file `.htaccess` nella cartella `public` – assicurati che sia stato caricato correttamente. **Flarum non funzionerà correttamente se `mod_rewrite` non è abilitato o il file `.htaccess` non è accessibile.** Assicurati di verificare con il tuo provider di hosting (o il tuo VPS) che queste funzionalità siano abilitate. Se gestisci il tuo server, potresti dover aggiungere quanto segue alla configurazione del tuo sito per abilitare i file `.htaccess`. ``` <Directory "/percorso/di/flarum/public"> @@ -79,11 +79,12 @@ www.esempio.com { header /assets { +Cache-Control "public, must-revalidate, proxy-revalidate" +Cache-Control "max-age=25000" - Pragma "public" + Pragma "public" } encode gzip } ``` + ## Proprietà della cartella Durante l'installazione, Flarum potrebbe richiedere di rendere scrivibili alcune directory. Per consentire l'accesso in scrittura a una directory su Linux, eseguire il seguente comando: @@ -98,9 +99,9 @@ Se Flarum richiede l'accesso in scrittura sia alla directory che al suo contenut chmod 775 -R /percorso/della/directory ``` -Se dopo aver completato questi passaggi, Flarum continua a richiedere la modifica delle autorizzazioni, potrebbe essere necessario verificare che i file siano di proprietà del gruppo e dell'utente corretti. +Se dopo aver completato questi passaggi, Flarum continua a richiedere la modifica delle autorizzazioni, potrebbe essere necessario verificare che i file siano di proprietà del gruppo e dell'utente corretti. -Per impostazione predefinita, nella maggior parte delle distribuzioni Linux `www-data` è sia il gruppo che l'utente ad operare sotto PHP. È possibile modificare la proprietà della cartella nella maggior parte dei sistemi operativi Linux eseguendo `chown -R www-data:www-data nomecartella/`. +Per impostazione predefinita, nella maggior parte delle distribuzioni Linux `www-data` è sia il gruppo che l'utente ad operare sotto PHP. È possibile modificare la proprietà della cartella nella maggior parte dei sistemi operativi Linux eseguendo `chown -R www-data:www-data nomecartella/`. Per saperne di più su questi comandi, nonché sui permessi dei file e sulla proprietà su Linux, leggi [questo tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). Se stai configurando Flarum su Windows, potresti trovare le risposte [domande su Super User](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows). @@ -112,7 +113,7 @@ Il tuo ambiente potrebbe variare rispetto alla documentazione fornita, consulta ::: danger Non dare mai permessi 777 -Non impostare mai alcuna cartella o file a livello di autorizzazione su `777`, poiché questo livello di autorizzazione consente a chiunque di accedere al contenuto della cartella e del file indipendentemente dall'utente o dal gruppo. +Non impostare mai alcuna cartella o file a livello di autorizzazione su `777`, poiché questo livello di autorizzazione consente a chiunque di accedere al contenuto della cartella e del file indipendentemente dall'utente o dal gruppo. ::: @@ -122,7 +123,7 @@ Per impostazione predefinita, la struttura delle directory di Flarum include una Tuttavia, se desideri ospitare Flarum in una sottodirectory (tipo `tuosito.com/forum`), o se il tuo host non ti dà il controllo sulla tua webroot (sei bloccato con qualcosa di simile `public_html` o `htdocs`), puoi impostare Flarum senza la cartella `public` . -Semplicemente sposta tutti i file nella cartella `public` (incluso il file `.htaccess`) nella directory da cui vuoi servire Flarum. Quindi modifica il file `.htaccess` rimuovi il commento alle linee da 9-15 per proteggere le risorse sensibili. Per Nginx, rimuovi il commento alle linee da 8-11 del file `.nginx.conf`. +Semplicemente sposta tutti i file nella cartella `public` (incluso il file `.htaccess`) nella directory da cui vuoi servire Flarum. Quindi modifica il file `.htaccess` rimuovi il commento alle linee da 9-15 per proteggere le risorse sensibili. Per Nginx, rimuovi il commento alle linee da 8-11 del file `.nginx.conf`. Dovrai anche modificare il file `index.php` cambiando le seguenti righe: @@ -130,7 +131,7 @@ Dovrai anche modificare il file `index.php` cambiando le seguenti righe: $site = require './site.php'; ``` - Ora, modifica il file `site.php` ed aggiorna i percorsi affinché rispettino la struttura del tuo sito: +Ora, modifica il file `site.php` ed aggiorna i percorsi affinché rispettino la struttura del tuo sito: ```php 'base' => __DIR__, @@ -142,9 +143,9 @@ $site = require './site.php'; Se hai una comunità esistente e non vuoi ricominciare da zero, potresti essere in grado di importare i tuoi dati esistenti in Flarum. Sebbene non ci siano ancora importatori ufficiali, la comunità ha creato diversi importatori non ufficiali: -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) +- [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) +- [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) +- [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) +- [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) Questi possono essere usati anche per altri software per forum, migrando prima a phpBB, poi a Flarum. Tieni presente che non possiamo garantire che funzionino e non possiamo offrire supporto per loro. diff --git a/docs/it/languages.md b/docs/it/languages.md index 7fa7e9e56..262df474d 100644 --- a/docs/it/languages.md +++ b/docs/it/languages.md @@ -9,7 +9,7 @@ Se stai utilizzando estensioni di terze parti, assicurati di [leggere qui](#thir Per iniziare, visita il tag [Extensions > Languages](https://discuss.flarum.org/t/languages) nella community di FLarum, e carca il language pack che vuoi installare. -I language pack vengono installati con lo stesso metodo utilizzato per le [estensioni](extensions.md). La lingua verrà visualizzata nella pagina Estensioni dell'interfaccia di amministrazione e potrai attivarla da lì. +I language pack vengono installati con lo stesso metodo utilizzato per le [estensioni](extensions.md). La lingua verrà visualizzata nella pagina Estensioni dell'interfaccia di amministrazione e potrai attivarla da lì. Questo è tutto quelo che devi fare! Ora dovresti essere in grado di utilizzare il selettore della lingua nell'intestazione del tuo sito per cambiare la visualizzazione del forum nella nuova lingua. diff --git a/docs/it/mail.md b/docs/it/mail.md index 0fa6b94cb..5367847fc 100644 --- a/docs/it/mail.md +++ b/docs/it/mail.md @@ -20,7 +20,7 @@ Questo driver utilizza il tuo account [Mailgun](https://www.mailgun.com/) per in ### Log -Il driver Log NON INVIA EMAIL,ed è utilizzato principalmente dagli sviluppatori. Scrive il contenuto di qualsiasi messaggio di posta elettronica nel file di registro in `DIRECTORY_PRINCIPALE_FLARUM/storage/logs`. +Il driver Log NON INVIA EMAIL,ed è utilizzato principalmente dagli sviluppatori. Scrive il contenuto di qualsiasi messaggio di posta elettronica nel file di registro in `DIRECTORY_PRINCIPALE_FLARUM/storage/logs`. ## Email di prova diff --git a/docs/it/troubleshoot.md b/docs/it/troubleshoot.md index 942b2e544..7d98d8b94 100644 --- a/docs/it/troubleshoot.md +++ b/docs/it/troubleshoot.md @@ -14,11 +14,11 @@ Se hai visto pagine vuote e la modifica sopra non aiuta, prova a impostare `disp AMolti problemi possono essere risolti con quanto segue: -* Pulisci la cache del browser -* Pulisci la cache del backend con il comando [`php flarum cache:clear`](console.md). -* Assicurati che il tuo database sia aggiornato con il comando [`php flarum migrate`](console.md). -* Assicurati che [la configurazione email](mail.md) nel tuo pannello di amministrazione sia corretta: una configurazione e-mail non valida causerà errori durante la registrazione, la reimpostazione di una password, la modifica delle e-mail e l'invio di notifiche. -* Controlla che il tuo file `config.php` sia corretto. Ad esempio, assicurati di utilizzare un `url` corretto. +- Pulisci la cache del browser +- Pulisci la cache del backend con il comando [`php flarum cache:clear`](console.md). +- Assicurati che il tuo database sia aggiornato con il comando [`php flarum migrate`](console.md). +- Assicurati che [la configurazione email](mail.md) nel tuo pannello di amministrazione sia corretta: una configurazione e-mail non valida causerà errori durante la registrazione, la reimpostazione di una password, la modifica delle e-mail e l'invio di notifiche. +- Controlla che il tuo file `config.php` sia corretto. Ad esempio, assicurati di utilizzare un `url` corretto. Dovrai anche dare un'occhiata all'output di [`php flarum info`](console.md) per assicurarti che nulla di importante sia fuori posto. @@ -34,11 +34,11 @@ Da qualche parte lungo la strada potresti avere un'idea di cosa sta causando il Se sembra che avrai bisogno di aiuto per risolvere il problema, è ora di fare sul serio nella raccolta dei dati. Cerca messaggi di errore o altre informazioni sul problema nei seguenti punti: -* Visualizzato nella pagina attuale -* Visualizzato nella console del browser (Chrome: More tools -> Developer Tools -> Console) -* Registrato nel registro degli errori del server (es. `/var/log/nginx/error.log`) -* Registrato nel log PHP-FPM's (es. `/var/log/php7.x-fpm.log`) -* Registrato da Flarum (`storage/logs/flarum.log`) +- Visualizzato nella pagina attuale +- Visualizzato nella console del browser (Chrome: More tools -> Developer Tools -> Console) +- Registrato nel registro degli errori del server (es. `/var/log/nginx/error.log`) +- Registrato nel log PHP-FPM's (es. `/var/log/php7.x-fpm.log`) +- Registrato da Flarum (`storage/logs/flarum.log`) Copia i messaggi in un file di testo e prendi nota di quando si è verificato l'errore, cosa stavi facendo in quel momento e così via. Assicurati di includere tutti gli approfondimenti che potresti aver raccolto sulle condizioni in cui il problema si verifica e non si verifica. Aggiungi quante più informazioni possibili sul tuo ambiente server: versione del sistema operativo, versione del server web, versione e gestore di PHP, ecc. @@ -46,4 +46,4 @@ Copia i messaggi in un file di testo e prendi nota di quando si è verificato l' Dopo aver raccolto tutte le informazioni possibili sul problema, sei pronto per presentare una segnalazione di bug. Si prega di seguire le istruzioni [per segnalare bug](bugs.md). -Se scopri qualcosa di nuovo sul problema dopo aver inviato la segnalazione, aggiungi tali informazioni in fondo al tuo post originale. È una buona idea presentare un rapporto anche se hai risolto il problema da solo, poiché anche altri utenti potrebbero trarre vantaggio dalla tua soluzione. Se hai trovato una soluzione temporanea al problema, assicurati mettercene a conoscenza. \ No newline at end of file +Se scopri qualcosa di nuovo sul problema dopo aver inviato la segnalazione, aggiungi tali informazioni in fondo al tuo post originale. È una buona idea presentare un rapporto anche se hai risolto il problema da solo, poiché anche altri utenti potrebbero trarre vantaggio dalla tua soluzione. Se hai trovato una soluzione temporanea al problema, assicurati mettercene a conoscenza. diff --git a/docs/it/update.md b/docs/it/update.md index 05e2b7ac2..218e9a8b7 100644 --- a/docs/it/update.md +++ b/docs/it/update.md @@ -1,3 +1,3 @@ # Aggiornare la versione di Flarum -Mentre Flarum è in fase beta, le istruzioni e le modalità di aggiornamento verranno scritte direttamente nel forum inglese: [annunci sui rilasci](https://discuss.flarum.org/t/blog?sort=newest). \ No newline at end of file +Mentre Flarum è in fase beta, le istruzioni e le modalità di aggiornamento verranno scritte direttamente nel forum inglese: [annunci sui rilasci](https://discuss.flarum.org/t/blog?sort=newest). diff --git a/docs/tr/README.md b/docs/tr/README.md index 369c446eb..03ba9e149 100644 --- a/docs/tr/README.md +++ b/docs/tr/README.md @@ -8,10 +8,10 @@ Bu kullanıcı kılavuzu, Flarum'u kullanarak kendi forumunuzu kurmanıza yardı Flarum, [esoTalk](https://github.com/esotalk/esoTalk) ve [FluxBB](https://fluxbb.org)'nin birleşik halefidir. Şu şekilde tasarlanmıştır: -* **Hızlı ve basit.** Dağınıklık yok, şişkinlik yok, karmaşık bağımlılıklar yok. Flarum PHP ile oluşturulmuştur, bu nedenle dağıtımı hızlı ve kolaydır. Arayüz, küçük bir ayak izine sahip, performanslı bir JavaScript çerçevesi olan [Mithril](https://mithril.js.org) tarafından desteklenmektedir. +- **Hızlı ve basit.** Dağınıklık yok, şişkinlik yok, karmaşık bağımlılıklar yok. Flarum PHP ile oluşturulmuştur, bu nedenle dağıtımı hızlı ve kolaydır. Arayüz, küçük bir ayak izine sahip, performanslı bir JavaScript çerçevesi olan [Mithril](https://mithril.js.org) tarafından desteklenmektedir. -* **Güzel ve duyarlı.** Bu, insanlar için forum yazılımıdır. Flarum, kutudan çıkar çıkmaz tüm platformlarda tutarlı ve sezgisel olacak şekilde dikkatle tasarlanmıştır. +- **Güzel ve duyarlı.** Bu, insanlar için forum yazılımıdır. Flarum, kutudan çıkar çıkmaz tüm platformlarda tutarlı ve sezgisel olacak şekilde dikkatle tasarlanmıştır. -* **Güçlü ve genişletilebilir.** Flarum'u topluluğunuza uyacak şekilde özelleştirin, genişletin ve entegre edin. Flarum’un mimarisi, [Güçlü Uzantı API'si](/extend/) ile inanılmaz derecede esnektir. +- **Güçlü ve genişletilebilir.** Flarum'u topluluğunuza uyacak şekilde özelleştirin, genişletin ve entegre edin. Flarum’un mimarisi, [Güçlü Uzantı API'si](/extend/) ile inanılmaz derecede esnektir. -* **Ücretsiz ve açıktır.** Flarum, [MIT lisansı](https://github.com/flarum/flarum/blob/master/LICENSE) altında yayınlanmıştır. \ No newline at end of file +- **Ücretsiz ve açıktır.** Flarum, [MIT lisansı](https://github.com/flarum/flarum/blob/master/LICENSE) altında yayınlanmıştır. diff --git a/docs/tr/admin.md b/docs/tr/admin.md index 316acbe8e..4bb407053 100644 --- a/docs/tr/admin.md +++ b/docs/tr/admin.md @@ -2,4 +2,4 @@ Flarum Yönetici Gösterge Tablosu, forumunuzu yönetmek için kullanıcı dostu bir arayüzdür. Yalnızca "Yönetici" [group](permissions.md) içindeki kullanıcılar tarafından kullanılabilir. -Yönetici kontrol paneline erişmek için, ekranın sağ üst köşesindeki **Adınıza** tıklayın ve **Yönetim**'i seçin. \ No newline at end of file +Yönetici kontrol paneline erişmek için, ekranın sağ üst köşesindeki **Adınıza** tıklayın ve **Yönetim**'i seçin. diff --git a/docs/tr/bugs.md b/docs/tr/bugs.md index ec7a554a5..4a9df57ba 100644 --- a/docs/tr/bugs.md +++ b/docs/tr/bugs.md @@ -6,7 +6,7 @@ Flarum içinde bir güvenlik açığı keşfederseniz, lütfen derhal ele alabil ::: -Flarum'u test etmemize yardım ettiğiniz için teşekkür ederiz. Takımda olmanıza sevindik! *Sorunları sabırla giderebilen* ve *bunları net bir şekilde iletebilen* kişilere ihtiyacımız var. Muhtemelen bildiğiniz gibi, iyi hata bildirimi biraz zaman ve çaba gerektirir. Bununla iyiyseniz, o zaman başlayalım! +Flarum'u test etmemize yardım ettiğiniz için teşekkür ederiz. Takımda olmanıza sevindik! _Sorunları sabırla giderebilen_ ve _bunları net bir şekilde iletebilen_ kişilere ihtiyacımız var. Muhtemelen bildiğiniz gibi, iyi hata bildirimi biraz zaman ve çaba gerektirir. Bununla iyiyseniz, o zaman başlayalım! ## Yinelenenler @@ -15,7 +15,7 @@ Zaten bir hata mı buldunuz? Olağanüstü! Bunu duymak isteriz — ancak ö - Daha önce bildirilip bildirilmediğini görmek için [Destek forumumuzda](https://discuss.flarum.org/t/support) arama yapın. - Bir düzeltme üzerinde çalışıyor olabiliriz, bu nedenle [sorun izleyicimizi](https://github.com/flarum/core/issues) de arayın. -*Derinlemesine* aradıysanız ve eli boş çıkarsanız, raporunuzu memnuniyetle karşılıyoruz. Sadece basit bir konuysa (örneğin yanlış yazılmış bir kelime veya grafik hatası) sonraki paragrafa geçin. Ancak hatalar görüyorsanız veya bir şey açıkça bozuksa, önce bazı bilgileri toplamanız gerekir. Lütfen [Sorun Giderme](troubleshoot.md) kılavuzumuza gidin ve oradaki talimatları izleyin. Mümkün olduğu kadar çok bilgi toplayın! +_Derinlemesine_ aradıysanız ve eli boş çıkarsanız, raporunuzu memnuniyetle karşılıyoruz. Sadece basit bir konuysa (örneğin yanlış yazılmış bir kelime veya grafik hatası) sonraki paragrafa geçin. Ancak hatalar görüyorsanız veya bir şey açıkça bozuksa, önce bazı bilgileri toplamanız gerekir. Lütfen [Sorun Giderme](troubleshoot.md) kılavuzumuza gidin ve oradaki talimatları izleyin. Mümkün olduğu kadar çok bilgi toplayın! ## Raporlama @@ -25,4 +25,4 @@ Yapabiliyorsanız, sorunun Flarum'un en son sürümüyle tekrarlanabilir olup ol Unutmayın: Bir hata raporunun amacı, hatayı kopyalayıp düzeltmemizi kolaylaştırmaktır. Etkili bir hata raporunun nasıl yazılacağına dair bazı yararlı ipuçları için [bu makaleyi](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) okumak isteyebilirsiniz. Karşılaştığınız sorunu yeniden oluşturmak için gerekli adımları net bir şekilde açıklamanız **zorunludur**. Net bir yeniden işleme adımının olmadığı sorunlar önceliklendirilmeyecektir. "needs verification" etiketli bir sorun, sorunun yazarından 5 günden fazla bir süre herhangi bir girdi almazsa kapatılır. -Raporunuzu gönderdikten sonra, sizden lütfen *tartışmayı takip etmenizi* ve sabırla beklemenizi rica ederiz. Daha fazla ayrıntı veya açıklama istememiz gerekebilir; ama her zaman yapacak çok işimiz var ve raporunuza hak ettiği zamanı verebilmemiz biraz zaman alabilir. \ No newline at end of file +Raporunuzu gönderdikten sonra, sizden lütfen _tartışmayı takip etmenizi_ ve sabırla beklemenizi rica ederiz. Daha fazla ayrıntı veya açıklama istememiz gerekebilir; ama her zaman yapacak çok işimiz var ve raporunuza hak ettiği zamanı verebilmemiz biraz zaman alabilir. diff --git a/docs/tr/code-of-conduct.md b/docs/tr/code-of-conduct.md index 65228e0c1..8358f0572 100644 --- a/docs/tr/code-of-conduct.md +++ b/docs/tr/code-of-conduct.md @@ -2,7 +2,7 @@ ### _Flarum Topluluğuna Hoş Geldiniz!_ -... Ve bize katıldığınız için teşekkürler! Flarum için heyecanlıyız ve aynı şekilde hisseden insanlarla tanışmaktan her zaman mutluyuz. *Herkesin* Flarum ve Flarum topluluğundan en iyi şekilde yararlanmasını istiyoruz, bu nedenle bu yönergeleri okuyup uygulamanızı rica ediyoruz. Bunlar, forumumuzu, Discord sohbetini, GitHub'da iletişim kurmayı veya Flarum topluluğu olmadan başka herhangi bir iletişim biçimini kullanıyor olsanız da geçerlidir. +... Ve bize katıldığınız için teşekkürler! Flarum için heyecanlıyız ve aynı şekilde hisseden insanlarla tanışmaktan her zaman mutluyuz. _Herkesin_ Flarum ve Flarum topluluğundan en iyi şekilde yararlanmasını istiyoruz, bu nedenle bu yönergeleri okuyup uygulamanızı rica ediyoruz. Bunlar, forumumuzu, Discord sohbetini, GitHub'da iletişim kurmayı veya Flarum topluluğu olmadan başka herhangi bir iletişim biçimini kullanıyor olsanız da geçerlidir. ### Her Şeyden Önce Sakin Olun! @@ -16,29 +16,29 @@ Hepimiz Flarum hakkında konuşmak ve onu daha iyi bir uygulama haline getirmek - Spam, kimlik avı gönderileri ve bu siteyi tahrif etmeye yönelik her türlü eylem - Yazılım korsanlığı ve benzeri konuların tartışılması -*Yukarıdakilerin tümü moderatör eylemi gerekçesidir.* Başka bir üyeyle bir sorununuz varsa, lütfen onlarla kendi başınıza yüzleşmemenizi rica ederiz. Forumdaysa, lütfen söz konusu gönderide *Report* komutunu kullanın, ardından durumla ilgilenmesi için bunu yetkiliye bırakın. Aksi takdirde, ihlali [admin@flarum.org](mailto:admin@flarum.org) adresine bildirin. +_Yukarıdakilerin tümü moderatör eylemi gerekçesidir._ Başka bir üyeyle bir sorununuz varsa, lütfen onlarla kendi başınıza yüzleşmemenizi rica ederiz. Forumdaysa, lütfen söz konusu gönderide _Report_ komutunu kullanın, ardından durumla ilgilenmesi için bunu yetkiliye bırakın. Aksi takdirde, ihlali [admin@flarum.org](mailto:admin@flarum.org) adresine bildirin. -Moderatörlerimiz, saldırgan veya iletişim akışını aksatan herhangi bir içeriği düzenleyebilir veya silebilir. Ciddi veya tekrarlanan suçlar, ihlalde bulunan kullanıcının hesabının askıya alınmasına neden olabilir. Yani, bilirsin, *sakin ol*. 😎 +Moderatörlerimiz, saldırgan veya iletişim akışını aksatan herhangi bir içeriği düzenleyebilir veya silebilir. Ciddi veya tekrarlanan suçlar, ihlalde bulunan kullanıcının hesabının askıya alınmasına neden olabilir. Yani, bilirsin, _sakin ol_. 😎 ### Duyulmasını Sağlayın -Yeni bir tartışma başlatmak ister misiniz? Öncelikle [SSS](faq.md) bölümünü okuduğunuzdan ve proje hakkında tam olarak bilgi sahibi olduğunuzdan emin olmak için bağlantıları takip ettiğinizden emin olun. Daha sonra foruma göz atmak için biraz zaman ayırın, [etiket sistemi](https://discuss.flarum.org/tags) hakkında bilgi edinin ve konunuzla ilgili anahtar kelimeler için birkaç arama yapın: *birisi çoktan bunun hakkında bir tartışma başlamış olabilir!* +Yeni bir tartışma başlatmak ister misiniz? Öncelikle [SSS](faq.md) bölümünü okuduğunuzdan ve proje hakkında tam olarak bilgi sahibi olduğunuzdan emin olmak için bağlantıları takip ettiğinizden emin olun. Daha sonra foruma göz atmak için biraz zaman ayırın, [etiket sistemi](https://discuss.flarum.org/tags) hakkında bilgi edinin ve konunuzla ilgili anahtar kelimeler için birkaç arama yapın: _birisi çoktan bunun hakkında bir tartışma başlamış olabilir!_ Bir tartışma başlatmaya hazır olduğunuzdan emin olduğunuzda lütfen aşağıdaki noktaları aklınızda bulundurun: - Ona iyi bir başlık ver! Başlığınız ne hakkında konuşmak istediğinizi netleştirirse en iyi sonuçları alırsınız. - Doğru etiketleri seçin. Bu, gönderinizin hemen okunma ve yanıtlanma olasılığını artıracaktır. -- Aynı tartışma ilgili tekrar tekrar *yayınlamayın*, çünkü bunu yapmak ters etki yaratır. -- Çok dilli kullanım için ayrılmış bir etiket kullanmıyorsanız, *yalnızca İngilizce yayınlayın.* Sizi okuyamazsak yardımcı olamayız! +- Aynı tartışma ilgili tekrar tekrar _yayınlamayın_, çünkü bunu yapmak ters etki yaratır. +- Çok dilli kullanım için ayrılmış bir etiket kullanmıyorsanız, _yalnızca İngilizce yayınlayın._ Sizi okuyamazsak yardımcı olamayız! - Unutmayın, yazılarınızı imzalamanıza gerek yok. Kim olduğunuzu bize bildirmek için profilinize bakıyoruz. Lütfen işleri organize etmemize yardımcı olmak için çaba gösterin. Toparlanmak için harcanan zaman, sizi tanımak, sorunlarınızı tartışmak ve Flarum hakkında konuşmak için harcayamayacağımız zamandır. Ve sonuçta, hepimiz yapmak için buradayız! ### Yanıtınızı Sayın - + Başkalarının fikirlerinizi okuyup dikkate alması umuduyla bir tartışmaya katılmak için zaman ayırıyorsunuz. Öyleyse neden yanıtınızı okumaya değer kılmak için çaba harcamıyorsunuz? -- Bir başlığı yanıtlamayın. İlk gönderiyi *okumak* için biraz zaman ayırın ve en azından tartışmanın geri kalanına *göz atın*. +- Bir başlığı yanıtlamayın. İlk gönderiyi _okumak_ için biraz zaman ayırın ve en azından tartışmanın geri kalanına _göz atın_. - Cevabınızın tartışmaya katkıda bulunup bulunmadığını kendinize sorun. Olmazsa, yayınlamadan önce biraz daha düşünün. - Birisiyle aynı fikirde olmak için tek kelimelik yazılar yapmaktan kaçının; bunun için "Like" düğmesini kullanabilirsiniz. - Yeterli olduğunda arka arkaya birden fazla gönderi yapmaktan kaçının. Bu bir forum, sohbet odası değil. @@ -48,4 +48,4 @@ Başkalarının fikirlerinizi okuyup dikkate alması umuduyla bir tartışmaya k Hiç kimse ara sıra yapılan şakadan veya akıllıca sözlerden şikayet etmeyecek. Ruh halini hafif tutmayı seviyoruz! Ama aynı zamanda her şeyi üretken tutmak için, bir tartışmayı tamamen raydan çıkarmaktan kaçınmanızı istiyoruz. -> Bu kuralları bir araya getirmedeki yardımlarından dolayı Dominion'a teşekkürler. \ No newline at end of file +> Bu kuralları bir araya getirmedeki yardımlarından dolayı Dominion'a teşekkürler. diff --git a/docs/tr/config.md b/docs/tr/config.md index 70b24db62..7df74deb2 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -10,10 +10,9 @@ Ayrıca Flarum'a veritabanı bilgisi ve daha fazlasını sağlar. Örnek bir dosyayla her şeyin ne anlama geldiğine dair hızlı bir genel bakış: ```php -<?php return array ( +<?php return [ 'debug' => false, // sorunları gidermek için kullanılan hata ayıklama modunu etkinleştirir veya devre dışı bırakır - 'database' => - array ( + 'database' => [ 'driver' => 'mysql', // veritabanı sürücüsü, yani MySQL, MariaDB... 'host' => 'localhost', // bağlantının ana bilgisayarı, harici bir hizmet kullanılmadığı sürece çoğu durumda localhost 'database' => 'flarum', // veritabanının adı @@ -24,12 +23,11 @@ Ayrıca Flarum'a veritabanı bilgisi ve daha fazlasını sağlar. 'prefix' => '', // veritabanındaki tablolar için önek, aynı veritabanını başka bir hizmetle paylaşıyorsanız kullanışlıdır 'port' => '3306', // veritabanı bağlantısının portu, MySQL ile varsayılan olarak 3306'dır 'strict' => false, - ), + ], 'url' => 'https://flarum.localhost', // URL kurulumu, etki alanlarını değiştirirseniz bunu değiştirmek isteyeceksiniz - 'paths' => - array ( + 'paths' => [ 'api' => 'api', // /api , API'ye gider. 'admin' => 'admin', // /admin , yönetici paneline gider. - ), -); + ], +]; ``` diff --git a/docs/tr/console.md b/docs/tr/console.md index ea33eb8ec..b5162a70a 100644 --- a/docs/tr/console.md +++ b/docs/tr/console.md @@ -48,4 +48,4 @@ Bekleyen tüm geçişleri çalıştırır. Bu, veritabanını değiştiren bir u `php flarum migrate:reset --extension [extension_id]` -Bir uzantı için tüm geçişleri sıfırlayın. Bu, çoğunlukla uzantı geliştiricileri tarafından kullanılır, ancak bazen, bir uzantıyı kaldırıyorsanız ve tüm verilerini veritabanından temizlemek istiyorsanız bunu çalıştırmanız gerekebilir. Lütfen bunun çalışması için söz konusu uzantının şu anda yüklü olması ancak mutlaka etkinleştirilmesi gerekmediğini unutmayın. \ No newline at end of file +Bir uzantı için tüm geçişleri sıfırlayın. Bu, çoğunlukla uzantı geliştiricileri tarafından kullanılır, ancak bazen, bir uzantıyı kaldırıyorsanız ve tüm verilerini veritabanından temizlemek istiyorsanız bunu çalıştırmanız gerekebilir. Lütfen bunun çalışması için söz konusu uzantının şu anda yüklü olması ancak mutlaka etkinleştirilmesi gerekmediğini unutmayın. diff --git a/docs/tr/contributing.md b/docs/tr/contributing.md index 914c739d4..56ba5ac87 100644 --- a/docs/tr/contributing.md +++ b/docs/tr/contributing.md @@ -52,35 +52,39 @@ npm run dev ## Geliştirme İş Akışı Tipik bir katkı iş akışı şuna benzer: - + 1. 🌳 Uygun **dalı** yeni bir özellik dalına ayırın. - * *Hata düzeltmeleri* en son kararlı dala gönderilmelidir. - * Mevcut Flarum sürümüyle geriye dönük olarak tamamen uyumlu olan *Küçük* özellikler, en son kararlı dala gönderilebilir. - * *Ana* özellikler her zaman gelecek Flarum sürümünü içeren "ana" şubeye gönderilmelidir. - * Dahili olarak `<initials>/<short-description>` (eg. `tz/refactor-frontend`) adlandırma şemasını kullanıyoruz. + + - _Hata düzeltmeleri_ en son kararlı dala gönderilmelidir. + - Mevcut Flarum sürümüyle geriye dönük olarak tamamen uyumlu olan _Küçük_ özellikler, en son kararlı dala gönderilebilir. + - _Ana_ özellikler her zaman gelecek Flarum sürümünü içeren "ana" şubeye gönderilmelidir. + - Dahili olarak `<initials>/<short-description>` (eg. `tz/refactor-frontend`) adlandırma şemasını kullanıyoruz. 2. 🔨 Bir **kod** yazın. - * [Kodlama Stili](#Kodlama-Stili) hakkında aşağıya bakın. - + - [Kodlama Stili](#Kodlama-Stili) hakkında aşağıya bakın. 3. 🚦 **Kodunuzu** test edin. - * Hataları giderirken veya özellikler eklerken gerektiği gibi birim testleri ekleyin. - * Test paketini ilgili paket klasöründeki `vendor/bin/phpunit` ile çalıştırın. - + - Hataları giderirken veya özellikler eklerken gerektiği gibi birim testleri ekleyin. + - Test paketini ilgili paket klasöründeki `vendor/bin/phpunit` ile çalıştırın. + <!-- * See [here](link-to-core/tests/README.md) for more information about testing in Flarum. --> + 4. 💾 Kodunuzu açıklayıcı bir mesajla **işleyin**. - * Değişikliğiniz mevcut bir sorunu çözüyorsa (genellikle bu, 123 numaralı sorun numarası olmak üzere yeni satırda "123 numaralı düzeltmeleri" içermelidir). - * [İyi bir işlem mesajı](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) yazın. + + - Değişikliğiniz mevcut bir sorunu çözüyorsa (genellikle bu, 123 numaralı sorun numarası olmak üzere yeni satırda "123 numaralı düzeltmeleri" içermelidir). + - [İyi bir işlem mesajı](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) yazın. 5. 🎁 GitHub'da bir Çekme İsteği (PR) **gönderin**. - * Çekme talebi şablonunu doldurun. - * Değişikliğiniz görselse, değişikliği gösteren bir ekran görüntüsü veya GIF ekleyin. - * JavaScript `dist` dosyalarını DERLEMEYİN. Bunlar birleştirme sırasında otomatik olarak derlenecektir. + + - Çekme talebi şablonunu doldurun. + - Değişikliğiniz görselse, değişikliği gösteren bir ekran görüntüsü veya GIF ekleyin. + - JavaScript `dist` dosyalarını DERLEMEYİN. Bunlar birleştirme sırasında otomatik olarak derlenecektir. 6. 🤝 Onay için Flarum ekibiyle **iletişim kurun**. - * Ekip üyeleri kodunuzu inceleyecek. Bazı değişiklikler veya iyileştirmeler veya alternatifler önerebiliriz, ancak küçük değişiklikler için çekme talebinizin hızla kabul edilmesi gerekir. - * Geri bildirimi ele alırken, üzerine yazmak veya ezmek yerine ek taahhütleri itin (birleştireceğiz). + + - Ekip üyeleri kodunuzu inceleyecek. Bazı değişiklikler veya iyileştirmeler veya alternatifler önerebiliriz, ancak küçük değişiklikler için çekme talebinizin hızla kabul edilmesi gerekir. + - Geri bildirimi ele alırken, üzerine yazmak veya ezmek yerine ek taahhütleri itin (birleştireceğiz). 7. 🕺 **Dans et** tıpkı Flarum'a katkıda bulunduğun gibi. @@ -94,10 +98,10 @@ Kod stiliniz mükemmel değilse endişelenmeyin! StyleCI, herhangi bir stil düz Flarum, [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) kodlama standardını ve [PSR- 4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) otomatik yükleme standardı. Bunun da ötesinde, [diğer stil kurallarına](https://github.com/flarum/core/blob/master/.styleci.yml) uyarız. Mümkün olduğunda PHP 7 tür ipucu ve dönüş türü bildirimlerini ve satır içi belgeler sağlamak için [PHPDoc](https://docs.phpdoc.org/) kullanıyoruz. Katkılarınızda kod tabanının geri kalanı tarafından kullanılan stili deneyin ve taklit edin. -* Ad alanları tekil olmalıdır (ör. `Flarum\Discussion`, not `Flarum\Discussions`) -* Arayüzlerin sonuna `Interface` eklenmelidir (ör. `MailableInterface`) -* Abstract sınıflarının önüne `Abstract` yazılmalıdır (ör `AbstractModel`) -* Özelliklerin sonuna `Trait` eklenmelidir (ör. `ScopeVisibilityTrait`) +- Ad alanları tekil olmalıdır (ör. `Flarum\Discussion`, not `Flarum\Discussions`) +- Arayüzlerin sonuna `Interface` eklenmelidir (ör. `MailableInterface`) +- Abstract sınıflarının önüne `Abstract` yazılmalıdır (ör `AbstractModel`) +- Özelliklerin sonuna `Trait` eklenmelidir (ör. `ScopeVisibilityTrait`) ### JavaScript @@ -106,16 +110,18 @@ Flarum'un JavaScript'i çoğunlukla [Airbnb Stil Kılavuzu](https://github.com/a ### Veritabanı **Sütunlar** veri türlerine göre adlandırılmalıdır: -* DATETIME veya TIMESTAMP: `{verbed}_at` (ör. created_at, read_at) veya `{verbed}_until` (ör. suspended_until) -* INT bu bir sayıdır: `{noun}_count` (ör. comment_count, word_count) -* Yabancı anahtar: `{verbed}_{entity}_id` (ör. hidden_user_id) - * Fiil birincil ilişki için ihmal edilebilir (ör. Yazının yazarı sadece `user_id`) -* BOOL: `is_{adjective}` (ör. is_locked) + +- DATETIME veya TIMESTAMP: `{verbed}_at` (ör. created_at, read_at) veya `{verbed}_until` (ör. suspended_until) +- INT bu bir sayıdır: `{noun}_count` (ör. comment_count, word_count) +- Yabancı anahtar: `{verbed}_{entity}_id` (ör. hidden_user_id) + - Fiil birincil ilişki için ihmal edilebilir (ör. Yazının yazarı sadece `user_id`) +- BOOL: `is_{adjective}` (ör. is_locked) **Tablolar** aşağıdaki şekilde adlandırılmalıdır: -* Çoğul biçim kullanın (`discussions`) -* Birden çok kelimeyi alt çizgilerle ayırın (`access_tokens`) -* İlişki tabloları için, iki tablo adını alfabetik sırayla bir alt çizgi ile tekil biçimde birleştirin (ör. `discussion_user`) + +- Çoğul biçim kullanın (`discussions`) +- Birden çok kelimeyi alt çizgilerle ayırın (`access_tokens`) +- İlişki tabloları için, iki tablo adını alfabetik sırayla bir alt çizgi ile tekil biçimde birleştirin (ör. `discussion_user`) ### CSS diff --git a/docs/tr/extend/README.md b/docs/tr/extend/README.md index 8041fcd5c..c3df8dff1 100644 --- a/docs/tr/extend/README.md +++ b/docs/tr/extend/README.md @@ -1,3 +1,3 @@ ### Flarum Genişletme -Yakında Türkçe belgeler eklenecektir. \ No newline at end of file +Yakında Türkçe belgeler eklenecektir. diff --git a/docs/tr/extend/admin.md b/docs/tr/extend/admin.md index 5c2d63b6b..fcf7a75ed 100644 --- a/docs/tr/extend/admin.md +++ b/docs/tr/extend/admin.md @@ -1,3 +1,3 @@ # Yönetici Gösterge Tablosu -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/api-throttling.md b/docs/tr/extend/api-throttling.md index 27ef88b10..7fe5ff137 100644 --- a/docs/tr/extend/api-throttling.md +++ b/docs/tr/extend/api-throttling.md @@ -1,3 +1,3 @@ # API Azaltma -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/authorization.md b/docs/tr/extend/authorization.md index 16517da23..674ab1ac6 100644 --- a/docs/tr/extend/authorization.md +++ b/docs/tr/extend/authorization.md @@ -1,3 +1,3 @@ # Yetki -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/backend-events.md b/docs/tr/extend/backend-events.md index b18b0d14d..dc58ef895 100644 --- a/docs/tr/extend/backend-events.md +++ b/docs/tr/extend/backend-events.md @@ -1,3 +1,3 @@ # Arka Uç Etkinlikleri -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/console.md b/docs/tr/extend/console.md index 3df610e03..5b7592699 100644 --- a/docs/tr/extend/console.md +++ b/docs/tr/extend/console.md @@ -1,3 +1,3 @@ # Konsol -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/data.md b/docs/tr/extend/data.md index b53e7c35c..a99cb9cb6 100644 --- a/docs/tr/extend/data.md +++ b/docs/tr/extend/data.md @@ -1,3 +1,3 @@ # Verilerle Çalışma -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/distribution.md b/docs/tr/extend/distribution.md index 40d7cfe70..f61a13850 100644 --- a/docs/tr/extend/distribution.md +++ b/docs/tr/extend/distribution.md @@ -1,3 +1,3 @@ # Dağıtım -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/formatting.md b/docs/tr/extend/formatting.md index 1b0ec2b62..0cf0d3a3c 100644 --- a/docs/tr/extend/formatting.md +++ b/docs/tr/extend/formatting.md @@ -1,3 +1,3 @@ # Biçimlendirme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/forms.md b/docs/tr/extend/forms.md index 39b7d5bf1..9699bd31f 100644 --- a/docs/tr/extend/forms.md +++ b/docs/tr/extend/forms.md @@ -1,3 +1,3 @@ # Formlar ve İstekler -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/frontend-pages.md b/docs/tr/extend/frontend-pages.md index c659b016d..6a5c3a465 100644 --- a/docs/tr/extend/frontend-pages.md +++ b/docs/tr/extend/frontend-pages.md @@ -1,3 +1,3 @@ # Ön Uç Sayfaları ve Çözücüler -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/frontend.md b/docs/tr/extend/frontend.md index ad64d8c6b..c0caa2040 100644 --- a/docs/tr/extend/frontend.md +++ b/docs/tr/extend/frontend.md @@ -1,3 +1,3 @@ # Ön Uç Geliştirme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/i18n.md b/docs/tr/extend/i18n.md index 0862acbff..3038b7034 100644 --- a/docs/tr/extend/i18n.md +++ b/docs/tr/extend/i18n.md @@ -1,3 +1,3 @@ # Uluslararasılaştırma -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/interactive-components.md b/docs/tr/extend/interactive-components.md index ff74baa3d..1f6aa077a 100644 --- a/docs/tr/extend/interactive-components.md +++ b/docs/tr/extend/interactive-components.md @@ -1,3 +1,3 @@ # Etkileşimli Bileşenler -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/mail.md b/docs/tr/extend/mail.md index d8d35bf95..50e6fbb07 100644 --- a/docs/tr/extend/mail.md +++ b/docs/tr/extend/mail.md @@ -1,3 +1,3 @@ # Posta -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/middleware.md b/docs/tr/extend/middleware.md index 6978264ee..62945cdb9 100644 --- a/docs/tr/extend/middleware.md +++ b/docs/tr/extend/middleware.md @@ -1,3 +1,3 @@ # Ara Yazılım -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/notifications.md b/docs/tr/extend/notifications.md index ed202ab73..b663984d0 100644 --- a/docs/tr/extend/notifications.md +++ b/docs/tr/extend/notifications.md @@ -1,3 +1,3 @@ # Bildirimler -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/permissions.md b/docs/tr/extend/permissions.md index 4c4eaa47e..9beb47d19 100644 --- a/docs/tr/extend/permissions.md +++ b/docs/tr/extend/permissions.md @@ -1,3 +1,3 @@ # Gruplar ve İzinler -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/post-types.md b/docs/tr/extend/post-types.md index b32a7b02b..9fdc35f4d 100644 --- a/docs/tr/extend/post-types.md +++ b/docs/tr/extend/post-types.md @@ -1,3 +1,3 @@ # Gönderi Türleri -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/routes.md b/docs/tr/extend/routes.md index 059730bf7..4812e0402 100644 --- a/docs/tr/extend/routes.md +++ b/docs/tr/extend/routes.md @@ -1,3 +1,3 @@ # Rotalar ve İçerik -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/search.md b/docs/tr/extend/search.md index 4097860a6..d711b0405 100644 --- a/docs/tr/extend/search.md +++ b/docs/tr/extend/search.md @@ -1,3 +1,3 @@ # Arama -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/service-provider.md b/docs/tr/extend/service-provider.md index fc8b9028a..094dee8b2 100644 --- a/docs/tr/extend/service-provider.md +++ b/docs/tr/extend/service-provider.md @@ -1,3 +1,3 @@ # Servis Sağlayıcı -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/settings.md b/docs/tr/extend/settings.md index d7b810b11..d0f6f4df7 100644 --- a/docs/tr/extend/settings.md +++ b/docs/tr/extend/settings.md @@ -1,3 +1,3 @@ # Ayarlar -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/slugging.md b/docs/tr/extend/slugging.md index e9561eb0a..22f008623 100644 --- a/docs/tr/extend/slugging.md +++ b/docs/tr/extend/slugging.md @@ -1,3 +1,3 @@ # Model Yavaşlatma -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/start.md b/docs/tr/extend/start.md index 7e5cbe9f7..442fa5cb8 100644 --- a/docs/tr/extend/start.md +++ b/docs/tr/extend/start.md @@ -1,3 +1,3 @@ # Başlangıç -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/testing.md b/docs/tr/extend/testing.md index 671ecb560..b83d8be8e 100644 --- a/docs/tr/extend/testing.md +++ b/docs/tr/extend/testing.md @@ -1,3 +1,3 @@ # Deneme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/theme.md b/docs/tr/extend/theme.md index d4e641362..e9d011c36 100644 --- a/docs/tr/extend/theme.md +++ b/docs/tr/extend/theme.md @@ -1,3 +1,3 @@ # Hızlı Başlangıç -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/translate.md b/docs/tr/extend/translate.md index f9d08d0a8..cea1dd467 100644 --- a/docs/tr/extend/translate.md +++ b/docs/tr/extend/translate.md @@ -1,3 +1,3 @@ # Flarum Çeviri -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b10.md b/docs/tr/extend/update-b10.md index 8d7b48b89..1fdc5cc53 100644 --- a/docs/tr/extend/update-b10.md +++ b/docs/tr/extend/update-b10.md @@ -1,3 +1,3 @@ # Beta 10 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b12.md b/docs/tr/extend/update-b12.md index eed777c3f..1666edb54 100644 --- a/docs/tr/extend/update-b12.md +++ b/docs/tr/extend/update-b12.md @@ -1,3 +1,3 @@ # Beta 12 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b13.md b/docs/tr/extend/update-b13.md index 754386ca5..daaef09c2 100644 --- a/docs/tr/extend/update-b13.md +++ b/docs/tr/extend/update-b13.md @@ -1,3 +1,3 @@ # Beta 13 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b14.md b/docs/tr/extend/update-b14.md index e45ff2cf4..602f8c22d 100644 --- a/docs/tr/extend/update-b14.md +++ b/docs/tr/extend/update-b14.md @@ -1,3 +1,3 @@ # Beta 14 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b15.md b/docs/tr/extend/update-b15.md index 5d6b51ebd..8daae1b2c 100644 --- a/docs/tr/extend/update-b15.md +++ b/docs/tr/extend/update-b15.md @@ -1,3 +1,3 @@ # Beta 15 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extend/update-b8.md b/docs/tr/extend/update-b8.md index 6b0ad9d0d..8f6da59d8 100644 --- a/docs/tr/extend/update-b8.md +++ b/docs/tr/extend/update-b8.md @@ -1,3 +1,3 @@ # Beta 8 için Güncelleme -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file +**Yakında Türkçe belgeler eklenecektir.** diff --git a/docs/tr/extensions.md b/docs/tr/extensions.md index f25ac1313..afcd8d4e9 100644 --- a/docs/tr/extensions.md +++ b/docs/tr/extensions.md @@ -23,4 +23,4 @@ Yönetici panosunun uzantılar sayfası, yüklendiklerinde uzantıları yönetme - Bir uzantıyı etkinleştirin veya devre dışı bırakın - Uzantı ayarlarına erişin (ancak bazı uzantılar ayarlar için ana kenar çubuğunda bir sekme kullanacak olsa da) -- Bir uzantının, yaptığı tüm veritabanı değişikliklerini kaldırmak için geçişlerini geri alın (bu, Kaldır düğmesiyle yapılabilir). Bu, uzantı ile ilişkili TÜM verileri kaldırır ve geri alınamaz. Yalnızca bir uzantıyı kaldırırken yapılmalıdır ve tekrar yüklemeyi planlamayın. Aynı zamanda tamamen isteğe bağlıdır. \ No newline at end of file +- Bir uzantının, yaptığı tüm veritabanı değişikliklerini kaldırmak için geçişlerini geri alın (bu, Kaldır düğmesiyle yapılabilir). Bu, uzantı ile ilişkili TÜM verileri kaldırır ve geri alınamaz. Yalnızca bir uzantıyı kaldırırken yapılmalıdır ve tekrar yüklemeyi planlamayın. Aynı zamanda tamamen isteğe bağlıdır. diff --git a/docs/tr/faq.md b/docs/tr/faq.md index f655596ac..78f9b7260 100644 --- a/docs/tr/faq.md +++ b/docs/tr/faq.md @@ -12,7 +12,7 @@ Evet! Ancak, yükseltme işlemi biraz sorunlu geçebilir. Mümkün olduğunca ko Tüm bağışlar minnetle alındı. [Github Sponsors](https://github.com/sponsors/flarum) veya [OpenCollective](https://opencollective.com/flarum) üzerinden verebilirsiniz. -Ancak bağışlar, Flarum'daki geliştirme hızını doğrudan etkilemeyecek. Ayrıca, kullanıcıları [katkıda bulunan kod](contributing.md), [uzantıları oluşturma](/extend/), belge yazma, Flarum'u diğer dillere çevirme, [topluluk forumlarında](https://discuss.flarum.org/) yardım ve destek sağlama gibi başka şekillerde katkıda bulunmaya teşvik ediyoruz. ...ve sadece topluluk etrafında genel bir pozitif enerji olmak! +Ancak bağışlar, Flarum'daki geliştirme hızını doğrudan etkilemeyecek. Ayrıca, kullanıcıları [katkıda bulunan kod](contributing.md), [uzantıları oluşturma](/extend/), belge yazma, Flarum'u diğer dillere çevirme, [topluluk forumlarında](https://discuss.flarum.org/) yardım ve destek sağlama gibi başka şekillerde katkıda bulunmaya teşvik ediyoruz. ...ve sadece topluluk etrafında genel bir pozitif enerji olmak! ### Beta sürümünü üretimde kullanabilir miyim? diff --git a/docs/tr/install.md b/docs/tr/install.md index 36443d83a..89f24ecec 100644 --- a/docs/tr/install.md +++ b/docs/tr/install.md @@ -18,10 +18,10 @@ Flarum'u [gösteri forumlarımızdan](https://discuss.flarum.org/d/21101) birind Flarum'u kurmadan önce, sunucunuzun gereksinimleri karşılayıp karşılamadığını kontrol etmeniz önemlidir. Flarum'u çalıştırmak için şunlara ihtiyacınız olacak: -* **Apache** (mod_rewrite etkin) veya **Nginx** -* **PHP 7.3+** şu uzantılar aktif olmalı: curl, dom, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6 +** veya **MariaDB10.0.5+** -Composer'ı çalıştırmak için **SSH (komut satırı) erişimi** +- **Apache** (mod_rewrite etkin) veya **Nginx** +- **PHP 7.3+** şu uzantılar aktif olmalı: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip +- **MySQL 5.6 +** veya **MariaDB10.0.5+** + Composer'ı çalıştırmak için **SSH (komut satırı) erişimi** ::: tip Paylaşımlı Hosting @@ -79,7 +79,7 @@ www.example.com { header /assets { +Cache-Control "public, must-revalidate, proxy-revalidate" +Cache-Control "max-age=25000" - Pragma "public" + Pragma "public" } encode gzip } @@ -143,9 +143,9 @@ Son olarak, `site.php` dosyasını düzenleyin ve aşağıdaki satırlardaki yol Mevcut bir topluluğunuz varsa ve sıfırdan başlamak istemiyorsanız, mevcut verilerinizi Flarum'a aktarabilirsiniz. Henüz resmi uzantı bulunmamakla birlikte, topluluk birkaç resmi olmayan uzantı yaptı: -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) +- [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) +- [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) +- [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) +- [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) Bunlar, önce phpBB'ye, sonra Flarum'a geçerek diğer forum yazılımları için de kullanılabilir. Bunların işe yarayacağını garanti edemeyeceğimizi ve onlar için destek sunamayacağımızı unutmayın. diff --git a/docs/tr/languages.md b/docs/tr/languages.md index 9ec6ab8b3..cbf589348 100644 --- a/docs/tr/languages.md +++ b/docs/tr/languages.md @@ -27,4 +27,4 @@ Tek dilli bir site çalıştırıyorsanız ve dil seçicinin site başlığında Flarum Topluluğu sitesinden indirilen dil paketleri genellikle Flarum ile birlikte gelen tüm uzantıların çevirilerini içerecek olsa da, kural olarak yüklemiş olabileceğiniz tüm topluluk uzantılarını kapsamazlar. Uzantılarının çevirilerini sağlamak ve sürdürmek geliştiricilere bağlıdır. -Bu nedenle, bir topluluk uzantısı yüklemeden önce, yüklediğiniz her dil paketi için çeviriler içerdiğinden emin olmalısınız. Bir uzantının ihtiyacınız olan bir dili desteklemediğini fark ederseniz, lütfen doğrudan geliştiriciyle iletişime geçin ve gerekli çevirilerin eklenmesini sağlayın. \ No newline at end of file +Bu nedenle, bir topluluk uzantısı yüklemeden önce, yüklediğiniz her dil paketi için çeviriler içerdiğinden emin olmalısınız. Bir uzantının ihtiyacınız olan bir dili desteklemediğini fark ederseniz, lütfen doğrudan geliştiriciyle iletişime geçin ve gerekli çevirilerin eklenmesini sağlayın. diff --git a/docs/tr/mail.md b/docs/tr/mail.md index 300f94d17..c9132da53 100644 --- a/docs/tr/mail.md +++ b/docs/tr/mail.md @@ -24,4 +24,4 @@ Günlük posta sürücüsü POSTA GÖNDERMEZ ve öncelikle geliştiriciler taraf ## Test E-postası -Bir e-posta yapılandırmasını kaydettikten sonra, yapılandırmanızın çalıştığından emin olmak için yönetici panosunun Posta sayfasındaki "Test Postası Gönder" düğmesini tıklayabilirsiniz. Bir hata görürseniz veya bir e-posta almazsanız, yapılandırmayı ayarlayın ve tekrar deneyin. Herhangi bir hata yoksa, ancak gelen kutunuzda hiçbir şey görünmüyorsa istenmeyen postanızı kontrol ettiğinizden emin olun. \ No newline at end of file +Bir e-posta yapılandırmasını kaydettikten sonra, yapılandırmanızın çalıştığından emin olmak için yönetici panosunun Posta sayfasındaki "Test Postası Gönder" düğmesini tıklayabilirsiniz. Bir hata görürseniz veya bir e-posta almazsanız, yapılandırmayı ayarlayın ve tekrar deneyin. Herhangi bir hata yoksa, ancak gelen kutunuzda hiçbir şey görünmüyorsa istenmeyen postanızı kontrol ettiğinizden emin olun. diff --git a/docs/tr/releases.md b/docs/tr/releases.md index fba55fe34..9dfa24526 100644 --- a/docs/tr/releases.md +++ b/docs/tr/releases.md @@ -11,4 +11,4 @@ https://laravel.com/docs/5.7/releases ## Release Notes --> -Sürüm notları [Flarum Topluluğu](https://discuss.flarum.org/t/blog?sort=newest)'nda bulunabilir. \ No newline at end of file +Sürüm notları [Flarum Topluluğu](https://discuss.flarum.org/t/blog?sort=newest)'nda bulunabilir. diff --git a/docs/tr/themes.md b/docs/tr/themes.md index c30eecf49..49d1285f3 100644 --- a/docs/tr/themes.md +++ b/docs/tr/themes.md @@ -28,4 +28,4 @@ Flarum aslında LESS kullanır, bu da değişkenlere, koşullara ve işlevlere i Flarum'un esnek [uzantı sistemi](extensions.md), Flarum'un herhangi bir parçasını pratik olarak eklemenize, çıkarmanıza veya değiştirmenize olanak tanır. Renkleri/boyutları/stilleri değiştirmenin ötesinde önemli tema değişiklikleri yapmak istiyorsanız, kesinlikle gitmenin yolu özel bir uzantıdır. -Bir uzantının nasıl oluşturulacağını öğrenmek için [uzantı belgelerimize](extend/README.md) göz atın! \ No newline at end of file +Bir uzantının nasıl oluşturulacağını öğrenmek için [uzantı belgelerimize](extend/README.md) göz atın! diff --git a/docs/tr/troubleshoot.md b/docs/tr/troubleshoot.md index 299815227..4317b8d9c 100644 --- a/docs/tr/troubleshoot.md +++ b/docs/tr/troubleshoot.md @@ -1,6 +1,6 @@ # Sorun Giderme -Flarum beklendiği gibi yüklenmiyorsa veya çalışmıyorsa, yapmanız gereken ilk şey ortamınızın [sistem gereksinimlerini](install.md#sunucu-gereksinimleri) karşılayıp karşılamadığını *tekrar kontrol etmektir.* Flarum'un çalıştırması gereken bir şeyi kaçırıyorsanız, onu düzeltmeniz gerekir. +Flarum beklendiği gibi yüklenmiyorsa veya çalışmıyorsa, yapmanız gereken ilk şey ortamınızın [sistem gereksinimlerini](install.md#sunucu-gereksinimleri) karşılayıp karşılamadığını _tekrar kontrol etmektir._ Flarum'un çalıştırması gereken bir şeyi kaçırıyorsanız, onu düzeltmeniz gerekir. Ayrıca, [Destek forumunu](https://discuss.flarum.org/t/support) ve [sorun izleyiciyi](https://github.com/flarum/core/issues) aramak için birkaç dakikanızı ayırmalısınız. Birisi sorunu zaten bildirmiş olabilir ve bir düzeltme mevcut veya yolda. İyice araştırdıysanız ve sorunla ilgili herhangi bir bilgi bulamıyorsanız, sorun gidermeye başlamanın zamanı geldi. @@ -14,11 +14,11 @@ Boş sayfalar görüyorsanız ve yukarıdaki değişiklik yardımcı olmuyorsa, Aşağıdakilerle birçok sorun çözülebilir: -* Tarayıcınızın önbelleğini temizleyin -* Arka uç önbelleğini [`php flarum cache:clear`](console.md) ile temizleyin. -* Veritabanınızın [`php flarum migrate`](console.md) ile güncellendiğinden emin olun. -* Yönetici panonuzdaki [e-posta yapılandırmasının](mail.md) doğru olduğundan emin olun: geçersiz e-posta yapılandırması kayıt olurken, parolayı sıfırlarken, e-postaları değiştirirken ve bildirim gönderirken hatalara neden olur. -* `config.php` dosyanızın doğru olup olmadığını kontrol edin. Örneğin, doğru `url` nin kullanıldığından emin olun. +- Tarayıcınızın önbelleğini temizleyin +- Arka uç önbelleğini [`php flarum cache:clear`](console.md) ile temizleyin. +- Veritabanınızın [`php flarum migrate`](console.md) ile güncellendiğinden emin olun. +- Yönetici panonuzdaki [e-posta yapılandırmasının](mail.md) doğru olduğundan emin olun: geçersiz e-posta yapılandırması kayıt olurken, parolayı sıfırlarken, e-postaları değiştirirken ve bildirim gönderirken hatalara neden olur. +- `config.php` dosyanızın doğru olup olmadığını kontrol edin. Örneğin, doğru `url` nin kullanıldığından emin olun. Ayrıca önemli hiçbir şeyin yerinde olmadığından emin olmak için [`php flarum info`](console.md) çıktısına da göz atmak isteyeceksiniz. @@ -34,16 +34,16 @@ Yol boyunca bir yerlerde sorununuza neyin sebep olduğu hakkında bir fikir edin Sorunu çözmek için yardıma ihtiyacınız olacak gibi görünüyorsa, veri toplama konusunda ciddi olmanın zamanı geldi. Aşağıdaki yerlerde hata mesajlarını veya sorunla ilgili diğer bilgileri arayın: -* Asıl sayfada görüntülenir -* Tarayıcı konsolunda görüntülenir (Chrome: Diğer araçlar -> Geliştirici Araçları -> Konsol) -* Sunucunun hata günlüğüne kaydedilir (ör. `/var/log/nginx/error.log`) -* PHP-FPM'nin hata günlüğüne kaydedilir (ör. `/var/log/php7.x-fpm.log`) -* Flarum tarafından kaydedildi (`storage/logs/flarum.log`) +- Asıl sayfada görüntülenir +- Tarayıcı konsolunda görüntülenir (Chrome: Diğer araçlar -> Geliştirici Araçları -> Konsol) +- Sunucunun hata günlüğüne kaydedilir (ör. `/var/log/nginx/error.log`) +- PHP-FPM'nin hata günlüğüne kaydedilir (ör. `/var/log/php7.x-fpm.log`) +- Flarum tarafından kaydedildi (`storage/logs/flarum.log`) -Herhangi bir mesajı bir metin dosyasına kopyalayın ve hatanın *ne zaman* oluştuğu, o sırada *ne yaptığınız* vb. Hakkında birkaç not alın. Sorunun meydana geldiği ve oluşmadığı koşullar hakkında derlemiş olabileceğiniz tüm bilgileri eklediğinizden emin olun. Sunucu ortamınız hakkında olabildiğince fazla bilgi ekleyin: İşletim sistemi sürümü, web sunucusu sürümü, PHP sürümü ve işleyici, vb. +Herhangi bir mesajı bir metin dosyasına kopyalayın ve hatanın _ne zaman_ oluştuğu, o sırada _ne yaptığınız_ vb. Hakkında birkaç not alın. Sorunun meydana geldiği ve oluşmadığı koşullar hakkında derlemiş olabileceğiniz tüm bilgileri eklediğinizden emin olun. Sunucu ortamınız hakkında olabildiğince fazla bilgi ekleyin: İşletim sistemi sürümü, web sunucusu sürümü, PHP sürümü ve işleyici, vb. ## 4. Adım: Bir rapor hazırlayın Sorunla ilgili tüm bilgileri topladıktan sonra bir hata raporu vermeye hazırsınız. Lütfen [Hataları Bildirme](bugs.md) ile ilgili talimatları uygulayın. -Raporunuzu doldurduktan sonra sorunla ilgili yeni bir şey keşfederseniz, lütfen bu bilgiyi orijinal yayınınızın altına ekleyin. Sorunu kendi başınıza çözmüş olsanız bile rapor vermek iyi bir fikirdir, çünkü diğer kullanıcılar da çözümünüzden faydalanabilir. Sorun için geçici bir çözüm bulduysanız, bundan da bahsettiğinizden emin olun. \ No newline at end of file +Raporunuzu doldurduktan sonra sorunla ilgili yeni bir şey keşfederseniz, lütfen bu bilgiyi orijinal yayınınızın altına ekleyin. Sorunu kendi başınıza çözmüş olsanız bile rapor vermek iyi bir fikirdir, çünkü diğer kullanıcılar da çözümünüzden faydalanabilir. Sorun için geçici bir çözüm bulduysanız, bundan da bahsettiğinizden emin olun. diff --git a/docs/tr/update.md b/docs/tr/update.md index 48a37dca3..8d78c2979 100644 --- a/docs/tr/update.md +++ b/docs/tr/update.md @@ -1,3 +1,3 @@ # Güncelleme -Flarum beta sürümündeyken, nasıl güncelleme yapılacağına ilişkin talimatlar her [yayın duyurusunda](https://discuss.flarum.org/t/blog?sort=newest) yayınlanacaktır. \ No newline at end of file +Flarum beta sürümündeyken, nasıl güncelleme yapılacağına ilişkin talimatlar her [yayın duyurusunda](https://discuss.flarum.org/t/blog?sort=newest) yayınlanacaktır. diff --git a/docs/troubleshoot.md b/docs/troubleshoot.md index f53593a97..6de6e399b 100644 --- a/docs/troubleshoot.md +++ b/docs/troubleshoot.md @@ -1,6 +1,6 @@ # Troubleshooting -If Flarum isn't installing or working as expected, the first thing you should do is *check again* whether your environment meets the [system requirements](install.md#server-requirements). If you're missing something that Flarum needs to run, you'll need to remedy that first. +If Flarum isn't installing or working as expected, the first thing you should do is _check again_ whether your environment meets the [system requirements](install.md#server-requirements). If you're missing something that Flarum needs to run, you'll need to remedy that first. Next, you should take a few minutes to search the [Support forum](https://discuss.flarum.org/t/support) and the [issue tracker](https://github.com/flarum/core/issues). It's possible that someone has already reported the problem, and a fix is either available or on the way. If you've searched thoroughly and can't find any information about the problem, it's time to start troubleshooting. @@ -21,12 +21,12 @@ If you've been seeing blank pages and the above change doesn't help, try setting A lot of issues can be fixed with the following: -* Clear your browser cache -* Clear the backend cache with [`php flarum cache:clear`](console.md). -* Make sure your database is updated with [`php flarum migrate`](console.md). -* Ensure that the [email configuration](mail.md) in your admin dashboard is correct: invalid email config will cause errors when registering, resetting a password, changing emails, and sending notifications. -* Check that your `config.php` is correct. For instance, make sure that the right `url` is being used (`https` vs `http` and case sensitivity matter here!). -* One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. +- Clear your browser cache +- Clear the backend cache with [`php flarum cache:clear`](console.md). +- Make sure your database is updated with [`php flarum migrate`](console.md). +- Ensure that the [email configuration](mail.md) in your admin dashboard is correct: invalid email config will cause errors when registering, resetting a password, changing emails, and sending notifications. +- Check that your `config.php` is correct. For instance, make sure that the right `url` is being used (`https` vs `http` and case sensitivity matter here!). +- One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. You'll also want to take a look at the output of [`php flarum info`](console.md) to ensure that nothing major is out of place. @@ -42,13 +42,13 @@ Somewhere along the way you may get an idea about what's causing your issue, and If it looks like you're going to need help solving the problem, it's time to get serious about collecting data. Look for error messages or other information about the problem in the following places: -* Displayed on the actual page -* Displayed in the browser console (Chrome: More tools -> Developer Tools -> Console) -* Recorded in the server's error log (e.g. `/var/log/nginx/error.log`) -* Recorded in PHP-FPM's error log (e.g. `/var/log/php7.x-fpm.log`) -* Recorded by Flarum (`storage/logs`) +- Displayed on the actual page +- Displayed in the browser console (Chrome: More tools -> Developer Tools -> Console) +- Recorded in the server's error log (e.g. `/var/log/nginx/error.log`) +- Recorded in PHP-FPM's error log (e.g. `/var/log/php7.x-fpm.log`) +- Recorded by Flarum (`storage/logs`) -Copy any messages to a text file and jot down a few notes about *when* the error occurred, *what* you were doing at the time, and so on. Be sure to include any insights you may have gleaned about the conditions under which the issue does and doesn't occur. Add as much information as possible about your server environment: OS version, web server version, PHP version and handler, et cetera. +Copy any messages to a text file and jot down a few notes about _when_ the error occurred, _what_ you were doing at the time, and so on. Be sure to include any insights you may have gleaned about the conditions under which the issue does and doesn't occur. Add as much information as possible about your server environment: OS version, web server version, PHP version and handler, et cetera. ## Step 4: Prepare a report diff --git a/docs/update.md b/docs/update.md index c94065e3d..9100e3e24 100644 --- a/docs/update.md +++ b/docs/update.md @@ -93,4 +93,4 @@ If none of this fixes your issue, feel free to reach out on our [Support forum]( ### Errors After Updating -If you are unable to access your forum after updating, follow our [troubleshooting instructions](troubleshoot.md). \ No newline at end of file +If you are unable to access your forum after updating, follow our [troubleshooting instructions](troubleshoot.md). diff --git a/docs/zh/README.md b/docs/zh/README.md index 05da46aeb..4adeb7815 100644 --- a/docs/zh/README.md +++ b/docs/zh/README.md @@ -8,10 +8,10 @@ Flarum 是一款非常简洁的开源论坛软件。它响应快速、简便易 Flarum 的前身是 [esoTalk](https://github.com/esotalk/esoTalk) 和 [FluxBB](https://fluxbb.org),她生来就被设计如此: -* **快速、简单。** 不杂乱不臃肿,没有复杂的依赖关系。Flarum 使用 PHP 构建,因此很容易被部署。同时界面采用高性能 JavaScript 框架 [Mithril](https://mithril.js.org),因此占用空间很小。 +- **快速、简单。** 不杂乱不臃肿,没有复杂的依赖关系。Flarum 使用 PHP 构建,因此很容易被部署。同时界面采用高性能 JavaScript 框架 [Mithril](https://mithril.js.org),因此占用空间很小。 -* **漂亮、响应式。** 专为人设计的论坛程序。Flarum 经过精心设计,完美支持跨平台、开箱即用。 +- **漂亮、响应式。** 专为人设计的论坛程序。Flarum 经过精心设计,完美支持跨平台、开箱即用。 -* **强大、可扩展。** 您可以客制化、扩展或集成 Flarum 以满足您的社区需求。Flarum 拥有非常全面、强大的 [扩展 API](https://docs.flarum.org/extend/),她的架构及其灵活。 +- **强大、可扩展。** 您可以客制化、扩展或集成 Flarum 以满足您的社区需求。Flarum 拥有非常全面、强大的 [扩展 API](https://docs.flarum.org/extend/),她的架构及其灵活。 -* **免费、开源。** Flarum 基于 [MIT 协议](https://github.com/flarum/flarum/blob/master/LICENSE) 发布。 +- **免费、开源。** Flarum 基于 [MIT 协议](https://github.com/flarum/flarum/blob/master/LICENSE) 发布。 diff --git a/docs/zh/appearance.md b/docs/zh/appearance.md index 6b4c5452f..fe80e2941 100644 --- a/docs/zh/appearance.md +++ b/docs/zh/appearance.md @@ -1,3 +1,4 @@ # 外观 + 此页面正在建设中。 This page is under construction. diff --git a/docs/zh/bugs.md b/docs/zh/bugs.md index 3a3dc3c0c..391db6769 100644 --- a/docs/zh/bugs.md +++ b/docs/zh/bugs.md @@ -6,7 +6,7 @@ ::: -我们很欢迎、也非常感谢您帮助我们测试 Flarum!编写一份良好的错误报告需要一些时间和精力,因此我们希望您能做到 *耐心解决问题*、*清晰描述问题*,如果可以的话,就继续往下看吧! +我们很欢迎、也非常感谢您帮助我们测试 Flarum!编写一份良好的错误报告需要一些时间和精力,因此我们希望您能做到 _耐心解决问题_、_清晰描述问题_,如果可以的话,就继续往下看吧! ## 撞车 @@ -15,7 +15,7 @@ - 搜索 [支持社区](https://discuss.flarum.org/t/support),看看这个 bug 是否已经被报告。 - 搜索我们的 [问题追踪器](https://github.com/flarum/core/issues),或许这个 bug 正在修复中。 -在 *搜索一番* 后,如果无人报告该问题,欢迎您提交报告。如果是一个简单的小问题(例如单词拼写错了或图像故障)请直接跳到下一节,查看如何提交报告。如果您发现了比较严重的错误,或者明显的漏洞等,请您转到[《故障排查指南》](troubleshoot.md),按照那里的说明,收集尽可能多的信息。 +在 _搜索一番_ 后,如果无人报告该问题,欢迎您提交报告。如果是一个简单的小问题(例如单词拼写错了或图像故障)请直接跳到下一节,查看如何提交报告。如果您发现了比较严重的错误,或者明显的漏洞等,请您转到[《故障排查指南》](troubleshoot.md),按照那里的说明,收集尽可能多的信息。 ## 报告 @@ -25,4 +25,4 @@ 请注意:问题报告使我们能够轻松地复现并修复错误,您可能需要阅读 [这篇文章](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html),了解如何撰写有效的错误报告。请您 **务必** 清晰描述重现问题的必要步骤。没有明确重现步骤的 Issue 将不会被标记/分类。如果一个标记为「需要验证(needs verification)」的 Issue 从被标记开始 5 天后,Issue 创建者仍没有反馈进一步的信息,该问题将被关闭。 -一旦您提交了报告,请您 *持续关注* 并耐心等待。我们可能会要求您提供细节或进一步说明。考虑到我们工作比较繁忙,可能需要一段时间才能回应您的报告。 +一旦您提交了报告,请您 _持续关注_ 并耐心等待。我们可能会要求您提供细节或进一步说明。考虑到我们工作比较繁忙,可能需要一段时间才能回应您的报告。 diff --git a/docs/zh/code-of-conduct.md b/docs/zh/code-of-conduct.md index 5a2931ab5..c280875d0 100644 --- a/docs/zh/code-of-conduct.md +++ b/docs/zh/code-of-conduct.md @@ -16,29 +16,29 @@ - 发表垃圾信息、钓鱼贴,以及任何旨在破坏本网站的行为; - 讨论盗版软件或类似事情。 -*以上是所有管理员、版主采取行动的依据。* 如果您对其他成员有意见,请不要相互对峙。如果违规行为发生于论坛,请「举报」相关帖字,然后等待工作人员处理。无法举报的,请将违规情况报告到 [admin@flarum.org](mailto:admin@flarum.org)。 +_以上是所有管理员、版主采取行动的依据。_ 如果您对其他成员有意见,请不要相互对峙。如果违规行为发生于论坛,请「举报」相关帖字,然后等待工作人员处理。无法举报的,请将违规情况报告到 [admin@flarum.org](mailto:admin@flarum.org)。 -我们的管理员和版主可以编辑或删除任何具有冒犯性或破坏性的内容。严重或屡次违规的用户,可能会被封禁账户。所以,你懂的,*待人友善一些*。😎 +我们的管理员和版主可以编辑或删除任何具有冒犯性或破坏性的内容。严重或屡次违规的用户,可能会被封禁账户。所以,你懂的,_待人友善一些_。😎 ### 提高自己的曝光度 -想发起一个新讨论?请务必先阅读我们的 [常见问题](faq.md),通过其中的相关链接充分了解这个项目。然后花一些时间浏览论坛,熟悉一下 [标签系统](https://discuss.flarum.org/tags),并搜索一些关键词,*可能您想讨论的早已被大家讨论过。* +想发起一个新讨论?请务必先阅读我们的 [常见问题](faq.md),通过其中的相关链接充分了解这个项目。然后花一些时间浏览论坛,熟悉一下 [标签系统](https://discuss.flarum.org/tags),并搜索一些关键词,_可能您想讨论的早已被大家讨论过。_ 当您确定要发起一个讨论时,请牢记: - 起个好标题!如果您的标题能简洁明了地阐明您要讨论的内容,您会得到更加理想的结果。 - 标签要选对!这将增加帖子被及时阅读、回复的可能性。 -- *不要* 刷帖!急于求成,往往适得其反。 -- 如果没有预留多语言标签,*请仅使用英文发帖*,如果我们看不懂您在说什么,就没法帮您! +- _不要_ 刷帖!急于求成,往往适得其反。 +- 如果没有预留多语言标签,_请仅使用英文发帖_,如果我们看不懂您在说什么,就没法帮您! - 不要在帖子中签名或者添加小尾巴!个人资料的辨识度足够了。 身为社区的一份子,每个人都该遵规守矩。可别让我们把用来了解您、帮助您解决问题、谈论 Flarum 的大好时光浪费在杂七杂八的琐碎事儿上,您说对吗? ### 提升您回帖的价值 - + 大家参与讨论,都是希望自己的观点或建议能被他人采纳、为他人提供帮助。既然如此,为什么不从一开始就让您的回帖值得一读呢? -- 不要回复标题。花点时间 *看一下* 看看一楼在说什么,至少先 *速览一下* 后面的对话。 +- 不要回复标题。花点时间 _看一下_ 看看一楼在说什么,至少先 _速览一下_ 后面的对话。 - 问问自己,您的回复是否对讨论有帮助。如果没有,请斟酌斟酌。 - 避免仅仅为了同意某人就去顶帖,您可以使用「喜欢」按钮表达您的态度。 - 不要刷帖。这里是论坛,不是聊天室。 diff --git a/docs/zh/config.md b/docs/zh/config.md index d848c5967..d09af842e 100644 --- a/docs/zh/config.md +++ b/docs/zh/config.md @@ -10,10 +10,9 @@ 下面是一个示例文件,我们来了解一下所有内容的含义: ```php -<?php return array ( +<?php return [ 'debug' => false, // 启用或禁用调试模式,用于排查问题 - 'database' => - array ( + 'database' => [ 'driver' => 'mysql', // 数据库驱动,例如 MySQL, MariaDB …… 'host' => 'localhost', // 连接的主机,除非使用外部服务,否则多数情况下是 localhost 'database' => 'flarum', // 数据库实例名 @@ -24,12 +23,11 @@ 'prefix' => '', // 数据表的前缀,如果您和其他服务共享一个数据库,那么添加前缀会很有用 'port' => '3306', // 连接数据库的端口,MySQL 默认为 3306 'strict' => false, - ), + ], 'url' => 'https://flarum.localhost', // URL 配置,如果您改变了域名,您需要变更这个 - 'paths' => - array ( + 'paths' => [ 'api' => 'api', // /api 跳转到 API 'admin' => 'admin', // /admin 跳转到 admin - ), -); + ], +]; ``` diff --git a/docs/zh/contributing.md b/docs/zh/contributing.md index cfb7b7280..397215c5e 100644 --- a/docs/zh/contributing.md +++ b/docs/zh/contributing.md @@ -54,34 +54,39 @@ npm run dev 一个典型的贡献流程如下所示: 1. 🌳 **建立分支**,从合适的分支建立一个新功能分支。 - * *Bug 修复* 应当提交合并到最新的稳定分支。 - * 与当前 Flarum 版本完全向后兼容的 *次要* 功能可以提交合并到最新的稳定分支。 - * *主要* 功能应当始终提交合并到 `master` 分支,该分支包含即将推出的 Flarum 版本。 - * 在内部,我们使用 `<姓名首字母缩写>/<简短描述>` 的分支命名方案(例如:`tz/refactor-frontend`)。 + + - _Bug 修复_ 应当提交合并到最新的稳定分支。 + - 与当前 Flarum 版本完全向后兼容的 _次要_ 功能可以提交合并到最新的稳定分支。 + - _主要_ 功能应当始终提交合并到 `master` 分支,该分支包含即将推出的 Flarum 版本。 + - 在内部,我们使用 `<姓名首字母缩写>/<简短描述>` 的分支命名方案(例如:`tz/refactor-frontend`)。 2. 🔨 **编写代码**,编写一些代码。 - * 请参见这里的 [编码风格](#编码风格)。 + + - 请参见这里的 [编码风格](#编码风格)。 3. 🚦 **测试代码**,测试您的代码。 - * 修复错误或添加功能时,请根据需要添加单元测试。 - * 使用相关包文件夹中的 `vendor/bin/phpunit` 运行测试套件。 + - 修复错误或添加功能时,请根据需要添加单元测试。 + - 使用相关包文件夹中的 `vendor/bin/phpunit` 运行测试套件。 <!-- * 点击 [这里](link-to-core/tests/README.md) 查看有关 Flarum 测试的更多信息。 --> 4. 💾 **提交代码**,并附上一条描述性信息。 - * 如果您的修改解决了一个现有的 Issue(通常情况下应该是这样),请在新行加上「Fixes #123」,其中 123 是 Issue 的编号。 - * 编写一个 [好的 commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)。 + + - 如果您的修改解决了一个现有的 Issue(通常情况下应该是这样),请在新行加上「Fixes #123」,其中 123 是 Issue 的编号。 + - 编写一个 [好的 commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)。 5. 🎁 **提交 PR**,在 GitHub 上提交一个 Pull Request。 - * 填写 Pull Request 模板。 - * 如果您的更改是视觉上的,请附上一张截图或 GIF 来演示变更。 - * 请不要包含 JavaScript `dist` 文件。这些文件会在合并时自动编译。 + + - 填写 Pull Request 模板。 + - 如果您的更改是视觉上的,请附上一张截图或 GIF 来演示变更。 + - 请不要包含 JavaScript `dist` 文件。这些文件会在合并时自动编译。 6. 🤝 **合作共赢**,等待 Flarum 团队批准您的请求。 - * 团队成员将审核您的代码。我们可能会提出一些修改、改进或替代方案,但对于一些小的改动,应该很快就会接受您的 Pull Request。 - * 在处理反馈时,请附加 commit,不要覆盖或压缩提交(我们将在合并时压缩)。 + + - 团队成员将审核您的代码。我们可能会提出一些修改、改进或替代方案,但对于一些小的改动,应该很快就会接受您的 Pull Request。 + - 在处理反馈时,请附加 commit,不要覆盖或压缩提交(我们将在合并时压缩)。 7. 🕺 **恭喜**,您刚刚向 Flarum 做了贡献。 @@ -95,10 +100,10 @@ npm run dev Flarum 遵循 [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) 编码规范和 [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) 自动加载规范。此外,我们还符合 [其他一些风格规范](https://github.com/flarum/core/blob/master/.styleci.yml)。我们尽可能地使用 PHP 7 类型提示和返回类型声明,我们也使用 [PHPDoc](https://docs.phpdoc.org/) 提供内联文档。请您尽量在贡献时模仿其他代码库使用的风格。 -* 命名空间应当是单数(例如:`Flarum\Discussion`,而非 `Flarum\Discussions`) -* 接口命名应当以 `Interface` 结尾(例如:`MailableInterface`) -* 抽象类命名应当以 `Abstract` 开头(例如:`AbstractModel`) -* Trait 命名应当以 `Trait` 结尾(例如:`ScopeVisibilityTrait`) +- 命名空间应当是单数(例如:`Flarum\Discussion`,而非 `Flarum\Discussions`) +- 接口命名应当以 `Interface` 结尾(例如:`MailableInterface`) +- 抽象类命名应当以 `Abstract` 开头(例如:`AbstractModel`) +- Trait 命名应当以 `Trait` 结尾(例如:`ScopeVisibilityTrait`) ### JavaScript @@ -107,16 +112,18 @@ Flarum 的 JavaScript 代码大多遵循 [Airbnb 风格指南](https://github.co ### 数据库 **列** 的命名应当根据其数据类型而定: -* DATETIME 或 TIMESTAMP:`{动词}_at`(例如:created_at,read_at)或 `{动词}_until`(例如:suspended_until) -* INT 用于计数:`{名词}_count`(例如:comment_count,word_count) -* 外键:`{动词}_{实体对象}_id`(例如:hidden_user_id) - * 动词可以使用具有相同意义的主键等替代(例如:帖子作者可以是 `user_id`) -* 布尔值:`is_{形容词}`(例如:is_locked) + +- DATETIME 或 TIMESTAMP:`{动词}_at`(例如:created_at,read_at)或 `{动词}_until`(例如:suspended_until) +- INT 用于计数:`{名词}_count`(例如:comment_count,word_count) +- 外键:`{动词}_{实体对象}_id`(例如:hidden_user_id) + - 动词可以使用具有相同意义的主键等替代(例如:帖子作者可以是 `user_id`) +- 布尔值:`is_{形容词}`(例如:is_locked) **表** 的命名规则如下: -* 使用复数形式(`discussions`) -* 多个单词之间用下划线分隔(`access_tokens`) -* 对于关系表,请将两个表名用单数的形式连接起来,并按字母顺序排列。(例如:`discussion_user`) + +- 使用复数形式(`discussions`) +- 多个单词之间用下划线分隔(`access_tokens`) +- 对于关系表,请将两个表名用单数的形式连接起来,并按字母顺序排列。(例如:`discussion_user`) ### CSS diff --git a/docs/zh/extend/README.md b/docs/zh/extend/README.md index 2ffca1169..4907c5c58 100644 --- a/docs/zh/extend/README.md +++ b/docs/zh/extend/README.md @@ -22,7 +22,7 @@ Flarum 的核心和扩展之间有清晰的界限吗?为什么有些功能核 **第三方扩展** 由他人开发,Flarum 团队也不会提供官方支持。他们大多用于解决特定的需求。 -如果您想要解决核心或现有捆绑扩展的 Bug 或功能缺陷,我们建议您 *直接为对应的项目贡献代码*,这要比分散精力去开发一个新的第三方扩展更合适一些。您可以在 [Flarum 社区](https://discuss.flarum.org/) 发帖与 Flarum 开发者交流有关事宜。 +如果您想要解决核心或现有捆绑扩展的 Bug 或功能缺陷,我们建议您 _直接为对应的项目贡献代码_,这要比分散精力去开发一个新的第三方扩展更合适一些。您可以在 [Flarum 社区](https://discuss.flarum.org/) 发帖与 Flarum 开发者交流有关事宜。 ## 资料推荐 diff --git a/docs/zh/extend/console.md b/docs/zh/extend/console.md index 0f408c4e7..e3c145d31 100644 --- a/docs/zh/extend/console.md +++ b/docs/zh/extend/console.md @@ -10,12 +10,11 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; -class YourCommand implements AbstractCommand { +class YourCommand implements AbstractCommand +{ protected function configure() { - $this - ->setName('您的命令名') - ->setDescription('您的命令描述'); + $this->setName('您的命令名')->setDescription('您的命令描述'); } protected function fire() { @@ -34,7 +33,7 @@ use YourNamespace\Console\CustomCommand; return [ // 其他扩展器 - (new Extend\Console())->command(CustomCommand::class) + (new Extend\Console())->command(CustomCommand::class), // 其他扩展器 ]; ``` diff --git a/docs/zh/extend/start.md b/docs/zh/extend/start.md index 3fe0e16a9..db2f0d0d2 100644 --- a/docs/zh/extend/start.md +++ b/docs/zh/extend/start.md @@ -10,11 +10,11 @@ Flarum 的构成有三层: -* 第一层,**后端**。后端用 [面向对象的 PHP 语言](https://laracasts.com/series/object-oriented-bootcamp-in-php)编写,并通过 [Composer](https://getcomposer.org/) 使用了大量的 [Laravel](https://laravel.com/) 组件和其他资源包。您还需要熟悉 [依赖项注入](https://laravel.com/docs/6.x/container) 的概念,它在整个后端中都有使用。 +- 第一层,**后端**。后端用 [面向对象的 PHP 语言](https://laracasts.com/series/object-oriented-bootcamp-in-php)编写,并通过 [Composer](https://getcomposer.org/) 使用了大量的 [Laravel](https://laravel.com/) 组件和其他资源包。您还需要熟悉 [依赖项注入](https://laravel.com/docs/6.x/container) 的概念,它在整个后端中都有使用。 -* 第二层,后端开放的一个 **公共 API**,允许前端客户端与论坛数据进行交互。该接口根据 [JSON:API 规范](https://jsonapi.org/) 构建。 +- 第二层,后端开放的一个 **公共 API**,允许前端客户端与论坛数据进行交互。该接口根据 [JSON:API 规范](https://jsonapi.org/) 构建。 -* 第三层,默认的 Web 界面,俗称 **前端**。这是一个使用 API 的 [单页应用](https://en.wikipedia.org/wiki/Single-page_application),由一个简单的类 React 框架 [Mithril.js](https://mithril.js.org/) 构建。 +- 第三层,默认的 Web 界面,俗称 **前端**。这是一个使用 API 的 [单页应用](https://en.wikipedia.org/wiki/Single-page_application),由一个简单的类 React 框架 [Mithril.js](https://mithril.js.org/) 构建。 扩展程序通常需要与这三层都进行交互才能有所为。例如,如果您想创建一个可以在用户资料中添加新属性的扩展,则需要在 **后端** 中添加相应的数据库结构,通过 **公共 API** 调用该数据,然后在 **前端** 显示这个数据并允许用户修改它。 @@ -22,15 +22,13 @@ Flarum 的构成有三层: ## 扩展器 -为了扩展 Flarum,我们需要用到 **扩展器**,让我们先了解一下它的概念。扩展器其实就是 *声明性* 对象,您可以通过简单的方式描述想要实现的内容(比如向论坛添加新的路由,或者在创建新主题帖时执行某些代码)。 +为了扩展 Flarum,我们需要用到 **扩展器**,让我们先了解一下它的概念。扩展器其实就是 _声明性_ 对象,您可以通过简单的方式描述想要实现的内容(比如向论坛添加新的路由,或者在创建新主题帖时执行某些代码)。 每个扩展器都是不同的,但是大体上长这样: ```php // 注册要交付给前端的 JavaScript 和 CSS 文件 -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') +(new Extend\Frontend('forum'))->js(__DIR__ . '/forum-scripts.js')->css(__DIR__ . '/forum-styles.css'); ``` 您首先创建一个扩展器实例,然后调用方法以对其进行进一步配置。所有方法都将返回结果到该扩展器本身,因此您只需要通过链式方法调用就可以实现您的整个配置。 @@ -50,10 +48,9 @@ use Flarum\Extend; use Flarum\Frontend\Document; return [ - (new Extend\Frontend('forum')) - ->content(function (Document $document) { - $document->head[] = '<script>alert("你好,世界!")</script>'; - }) + (new Extend\Frontend('forum'))->content(function (Document $document) { + $document->head[] = '<script>alert("你好,世界!")</script>'; + }), ]; ``` @@ -85,55 +82,55 @@ composer config repositories.0 path "packages/*" ```json { - "name": "acme/flarum-hello-world", - "description": "向世界问好!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.16 <=0.1.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } + "name": "acme/flarum-hello-world", + "description": "向世界问好!", + "type": "flarum-extension", + "require": { + "flarum/core": ">=0.1.0-beta.16 <=0.1.0" + }, + "autoload": { + "psr-4": { "Acme\\HelloWorld\\": "src/" } + }, + "extra": { + "flarum-extension": { + "title": "Hello World", + "icon": { + "name": "fas fa-smile", + "backgroundColor": "#238c59", + "color": "#fff" + } } + } } ``` -* **name**,名字。是 Composer 软件包的名字。格式是 `供应商/包名`。 - * 您需要起一个全世界独一无二的供应商名,或者可以直接沿用 GitHub 的用户名。以本教程为例,这里我们假设 `acme` 是您的供应商名。 - * 您应该给包 `包名` 加上 `flarum-` 前缀,以指明此包是专门给 Flarum 用的。 +- **name**,名字。是 Composer 软件包的名字。格式是 `供应商/包名`。 -* **description**,描述。用一句话描述这个扩展程序的作用是什么。 + - 您需要起一个全世界独一无二的供应商名,或者可以直接沿用 GitHub 的用户名。以本教程为例,这里我们假设 `acme` 是您的供应商名。 + - 您应该给包 `包名` 加上 `flarum-` 前缀,以指明此包是专门给 Flarum 用的。 -* **type**,类型。只能是 `flarum-extension`。这确保了当别人「require」您的扩展程序时,能被正确识别。 +- **description**,描述。用一句话描述这个扩展程序的作用是什么。 -* **require**,依赖。描述您的扩展程序自身的依赖关系。 - * 您需要在这里指定您的扩展程序所兼容的 Flarum 版本。 - * 这里也是列出您的代码需要使用的 Composer 外部工具库的地方。 +- **type**,类型。只能是 `flarum-extension`。这确保了当别人「require」您的扩展程序时,能被正确识别。 + +- **require**,依赖。描述您的扩展程序自身的依赖关系。 + + - 您需要在这里指定您的扩展程序所兼容的 Flarum 版本。 + - 这里也是列出您的代码需要使用的 Composer 外部工具库的地方。 ::: warning 谨慎指定 Flarum 版本 - + Flarum 仍处于测试阶段,我们建议您声明只兼容当前的 Flarum 版本。 "flarum/core": ">=0.1.0-beta.16 <=0.1.0" - - ::: - -* **autoload**,定义一个从命名空间到目录的映射,告诉 Composer 在哪里可以找到扩展程序的类。示例的 `src` 目录会在您扩展程序项目的根目录,与 vendor 文件夹同级。此处的命名空间应以 驼<font size=2>峰</font>写<font size=2>法</font> 反映扩展程序的供应商和包名. + ::: +- **autoload**,定义一个从命名空间到目录的映射,告诉 Composer 在哪里可以找到扩展程序的类。示例的 `src` 目录会在您扩展程序项目的根目录,与 vendor 文件夹同级。此处的命名空间应以 驼<font size=2>峰</font>写<font size=2>法</font> 反映扩展程序的供应商和包名. -* **extra.flarum-extension**,包含一些 Flarum 特有的信息,比如您扩展程序在论坛的显示名称以及图标。 - * **title** 您的扩展程序的显示名称。 - * **icon** 是一个定义您扩展程序图标的对象。**name** 属性是 [Font Awesome 图标名](https://fontawesome.com/icons)。剩下的都被用作图标的 `style` 属性。 +- **extra.flarum-extension**,包含一些 Flarum 特有的信息,比如您扩展程序在论坛的显示名称以及图标。 + - **title** 您的扩展程序的显示名称。 + - **icon** 是一个定义您扩展程序图标的对象。**name** 属性是 [Font Awesome 图标名](https://fontawesome.com/icons)。剩下的都被用作图标的 `style` 属性。 请参阅 [composer.json 模式](https://getcomposer.org/doc/04-schema.md) 文档,以获取有关可以添加到 `composer.json` 中的其他属性的信息。 @@ -153,7 +150,7 @@ composer require acme/flarum-hello-world *@dev 执行完成后,前往您论坛后台管理面板启用插件,最后回到您的论坛。 -*whizzing, whirring, metal clunking* +_whizzing, whirring, metal clunking_ 哇!你好,扩展! diff --git a/docs/zh/faq.md b/docs/zh/faq.md index cd1b7b26b..e41de4c00 100644 --- a/docs/zh/faq.md +++ b/docs/zh/faq.md @@ -24,17 +24,17 @@ 这是 _非常棒_ 的想法!但是现在还不可能,希望我们在未来能推出此类功能。 -### Flarum 会有****的功能吗?什么时候有?为什么还没做呢? +### Flarum 会有\*\*\*\*的功能吗?什么时候有?为什么还没做呢? 我们很想让 Flarum 的功能和插件应有尽有、一应俱全,但现阶段,基本功能和稳定性才是重点。 -### 为什么你们还没有修复****的问题? +### 为什么你们还没有修复\*\*\*\*的问题? 同样,答案是「要事先为」。如果我们还没有解决一个 Issue(或给它分配了一个里程碑),那是因为我们正在处理其他同样重要的事情,所以请耐心等待。我们会尽量在新版本发布前搞定它。如果您很着急,可以自行修复它 [并为项目做出贡献](contributing.md)! ### 我可以将我的论坛迁移到 Flarum 上吗? -可以,但是现在不能。我们现在的工作重心全面转向保证 Flarum 的稳定和基本功能的完善完整。一旦我们有信心 Flarum 可以用于生产环境,我们将打造从其他论坛软件(例如 esoTalk、FluxBB、phpBB、Discourse等)导入数据的工具。 +可以,但是现在不能。我们现在的工作重心全面转向保证 Flarum 的稳定和基本功能的完善完整。一旦我们有信心 Flarum 可以用于生产环境,我们将打造从其他论坛软件(例如 esoTalk、FluxBB、phpBB、Discourse 等)导入数据的工具。 ### 我如何加入 Flarum 团队? diff --git a/docs/zh/install.md b/docs/zh/install.md index 83b5fe5a5..82eb9d514 100644 --- a/docs/zh/install.md +++ b/docs/zh/install.md @@ -18,10 +18,10 @@ Flarum 处于 **测试阶段**。所为会存在一些 Bug 🐛🐞、功能上 在您安装 Flarum 之前,请确保您的服务器满足以下要求,以便顺利的安装和运行 Flarum: -* **Apache**(需要启用 mod\_rewrite 重写模块) 或 **Nginx** -* **PHP 7.3**,需要启用 **fileinfo**, curl, dom, exif, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip 扩展 -* **MySQL 5.6+** 或 **MariaDB 10.0.5+** -* **允许 SSH(命令行)**,以运行 Composer +- **Apache**(需要启用 mod_rewrite 重写模块) 或 **Nginx** +- **PHP 7.3**,需要启用 **fileinfo**, curl, dom, exif, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip 扩展 +- **MySQL 5.6+** 或 **MariaDB 10.0.5+** +- **允许 SSH(命令行)**,以运行 Composer ::: tip 共享主机 @@ -83,7 +83,9 @@ www.example.com { file_server } ``` + ## 目录所有权 + 在安装过程中,Flarum 可能会要求您将某些目录设置为可写。要使 Linux 上的某个目录可写,可以执行以下命令: ```bash @@ -121,14 +123,14 @@ chmod 755 -R /path/to/directory ::: vue `默认目录结构` -  + . Flarum 安装根目录 ├── public _(**公共目录**)_ -│ ├── assets _(**资源目录。存放头像、上传的文件等**)_ -│ └── .htaccess _(**自带 Apache 配置**)_ +│ ├── assets _(**资源目录。存放头像、上传的文件等**)_ +│ └── .htaccess _(**自带 Apache 配置**)_ │ ├── storage -│ └── logs _(**日志**)_ +│ └── logs _(**日志**)_ │ ├── vendor _(**核心、插件目录**)_ ├── .nginx.conf _(**自带 Nginx 配置**)_ @@ -151,7 +153,7 @@ chmod 755 -R /path/to/directory $site = require './site.php'; ``` - 最后,编辑 `site.php` 并更新这几行所指的路径,以体现新的目录结构: +最后,编辑 `site.php` 并更新这几行所指的路径,以体现新的目录结构: ```php 'base' => __DIR__, @@ -163,9 +165,9 @@ $site = require './site.php'; 如果您想用 Flarum 接续运营现有的一个社区,您可以将该论坛的数据导入到 Flarum 中。虽然目前还没有官方的导入工具,但是社区里已经有人制作了几款非官方的导入工具: -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) +- [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) +- [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) +- [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) +- [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) 其他论坛程序也可以导入:先迁移到 phpBB,然后迁移到 Flarum。需要说明的是,我们不能保证这些工具一直能正常使用,也不提供支持服务。 diff --git a/docs/zh/permissions.md b/docs/zh/permissions.md index d6bdbde2d..bc031cfc7 100644 --- a/docs/zh/permissions.md +++ b/docs/zh/permissions.md @@ -1,3 +1,4 @@ # 权限 + 此页面正在建设中。 This page is under construction. diff --git a/docs/zh/tags.md b/docs/zh/tags.md index cba515c89..9a811c432 100644 --- a/docs/zh/tags.md +++ b/docs/zh/tags.md @@ -1,3 +1,4 @@ # 分类目录和标签 + 此页面正在建设中。 This page is under construction. diff --git a/docs/zh/themes.md b/docs/zh/themes.md index 60ae9c1d0..9119e02ba 100644 --- a/docs/zh/themes.md +++ b/docs/zh/themes.md @@ -10,7 +10,7 @@ - 切换夜间模式和彩色导航栏。 - 上传标志和站点图标(浏览器标签中显示的图标)。 - 在自定义页眉和页脚添加 HTML。 -- 添加 [自定义LESS/CSS](#css-主题) 来改变元素的显示方式。 +- 添加 [自定义 LESS/CSS](#css-主题) 来改变元素的显示方式。 ## CSS 主题 diff --git a/docs/zh/troubleshoot.md b/docs/zh/troubleshoot.md index c24d6118d..6c8e46b66 100644 --- a/docs/zh/troubleshoot.md +++ b/docs/zh/troubleshoot.md @@ -1,6 +1,6 @@ # 故障排查 -如果 Flarum 没有按照预期那样安装或工作,您 *首先应该检查* 服务器环境是否符合 [系统要求](install.md#环境要求)。如果您缺少一些 Flarum 运行所需的东西,请先补全内容。 +如果 Flarum 没有按照预期那样安装或工作,您 _首先应该检查_ 服务器环境是否符合 [系统要求](install.md#环境要求)。如果您缺少一些 Flarum 运行所需的东西,请先补全内容。 然后,请花几分钟时间搜索 [支持论坛](https://discuss.flarum.org/t/support)和 [问题跟踪器](https://github.com/flarum/core/issues),有可能该问题已被报告,并且有了解决办法。如果您彻底搜索后,仍然没有找到任何有用的信息,那么就可以开始排查故障了。 @@ -14,11 +14,11 @@ 很多问题都可通过以下解决: -* 清除浏览器缓存。 -* 使用 [`php flarum cache:clear`](console.md) 清除后端缓存。 -* 确保以使用 [`php flarum migrate`](console.md) 更新数据库。 -* 确保 [邮箱配置](mail.md) 可用:无效的邮箱配置将导致注册、重置密码、更换用户绑定邮箱以及发送通知时产生错误。 -* 检查 `config.php` 配置是否正确,请确保您使用了正确的 `url`。 +- 清除浏览器缓存。 +- 使用 [`php flarum cache:clear`](console.md) 清除后端缓存。 +- 确保以使用 [`php flarum migrate`](console.md) 更新数据库。 +- 确保 [邮箱配置](mail.md) 可用:无效的邮箱配置将导致注册、重置密码、更换用户绑定邮箱以及发送通知时产生错误。 +- 检查 `config.php` 配置是否正确,请确保您使用了正确的 `url`。 您也得看看 [`php flarum info`](console.md) 的输出,以确保没有什么大的问题。 @@ -34,13 +34,13 @@ 如果您无法解决问题,需要他人的帮助,请从这些地方搜集相关报错内容或其他与问题有关的信息: -* 论坛页面上显示的报错 -* 浏览器控制台中显示的报错(Chrome:更多工具 -> 开发者工具 -> Console) -* 服务器错误日志中记录的内容(例如:`/var/log/nginx/error.log`) -* PHP-FPM 错误日志中记录的内容(例如:`/var/log/php7.x-fpm.log`) -* Flarum 日志记录的报错(`storage/logs/flarum.log`) +- 论坛页面上显示的报错 +- 浏览器控制台中显示的报错(Chrome:更多工具 -> 开发者工具 -> Console) +- 服务器错误日志中记录的内容(例如:`/var/log/nginx/error.log`) +- PHP-FPM 错误日志中记录的内容(例如:`/var/log/php7.x-fpm.log`) +- Flarum 日志记录的报错(`storage/logs/flarum.log`) -将收集到的所有信息复制到记事本中,整理好并做一些注解,比如错误是 *何时* 发生的、当错误发生时您在 *做什么*、您探索出来的问题发生和不发生的条件。请尽可能详尽地提供服务器环境信息,如操作系统版本、Web 服务器版本、PHP 版本和处理程序等。 +将收集到的所有信息复制到记事本中,整理好并做一些注解,比如错误是 _何时_ 发生的、当错误发生时您在 _做什么_、您探索出来的问题发生和不发生的条件。请尽可能详尽地提供服务器环境信息,如操作系统版本、Web 服务器版本、PHP 版本和处理程序等。 ## 步骤 4:准备报告